Changeset 644


Ignore:
Timestamp:
12/20/17 15:40:06 (6 years ago)
Author:
dubos
Message:

devel/unstructured : unroll loops over stencils

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/Python/src/unstructured/macros.jin

    r615 r644  
    1414#define FORALL_CELLS(...) {% call(lrange,flags) forall_cells(__VA_ARGS__) %} 
    1515#define FORALL_CELLS_EXT(...) {% call(lrange,flags) forall_cells(__VA_ARGS__) %} 
    16 #define ON_PRIMAL {% call(mesh,lrange) on_mesh('primal',lrange,flags) %} 
    17 #define ON_DUAL {% call(mesh,lrange) on_mesh('dual',lrange,flags) %} 
    18 #define ON_EDGES {% call(mesh,lrange) on_edges('edge',lrange,flags) %} 
    19 #define FORALL_EDGES {% call forall_edges(mesh) %} 
    20 #define FORALL_VERTICES {% call forall_vertices(mesh) %} 
    21 #define FORALL_TRISK {% call forall_trisk() %} 
     16#define ON_PRIMAL {% call(mesh, degree=0) on_mesh('primal',lrange,flags) %} 
     17#define ON_DUAL {% call(mesh, degree=0) on_mesh('dual',lrange,flags) %} 
     18#define ON_EDGES {% call(mesh, degree=0) on_edges('edge',lrange,flags) %} 
     19#define FORALL_EDGES {% call forall_edges(mesh,degree) %} 
     20#define FORALL_VERTICES {% call forall_vertices(mesh,degree) %} 
     21#define FORALL_TRISK {% call forall_trisk(degree) %} 
    2222#define END_BLOCK {% endcall %} 
    2323#define SEQUENCE {% call sequence() %}  
     
    3939{#  -------------------------- Design notes ------------------------------ 
    4040 
     41The syntax  
     42{% call(ARGNAMES) macro(ARGS) %} 
     43... 
     44{% endcall %} 
     45passes ARGS to macro ; this macro "calls" the body using the syntax 'caller(arg1,...)' ; these arguments 
     46are available in the body under the names ARGNAMES, as if it were a macro caller(ARGNAMES). 
     47 
    4148Using its optional argument 'options', forall_cells() sets variable 'flags'  
    4249and passes it on to on_mesh() / on_edges() 
     
    4552 
    4653-------------------------------------------------------------------------- #} 
     54 
    4755 
    4856{# ----------------------- SEQUENCE, FORALL ----------------------- #} 
     
    8088{# ------------------------------ MESHES --------------------------- #} 
    8189 
    82 {% macro vloop(mesh, lrange, flags, code) %} 
     90{# argument 'code' is the body enclosed by ON_XXX ... END_BLOCK ; it takes arguments : mesh,degree=0 #} 
     91 
     92{% macro vloop_unroll(mesh, lrange, flags, code) %} 
     93 
     94{% set thecode, has_primal, has_dual, has_trisk, has_none = code(mesh), False, False, False, True %} 
     95 
     96{% if 'primal_deg' in thecode %} 
     97! this VLOOP iterates over primal cell edges 
     98{% set has_primal, has_none = True,False %} 
     99{% endif %} 
     100{% if 'dual_deg' in thecode %} 
     101! this VLOOP iterates over dual cell edges 
     102{% set has_dual,has_none = True,False %} 
     103{% endif %} 
     104{% if 'trisk_deg' in thecode %} 
     105! this VLOOP iterates over the TRISK stencil 
     106{% set has_trisk,has_none = True,False %} 
     107{% endif %} 
     108 
     109{% if has_none %} 
     110{{ vloop(mesh, lrange, flags, code) }} 
     111{% endif %} 
     112 
     113{% if has_primal %} 
     114SELECT CASE(primal_deg(ij)) 
     115CASE(4) 
     116{{ vloop(mesh, lrange, flags, code, 4) }} 
     117CASE(5) 
     118{{ vloop(mesh, lrange, flags, code, 5) }} 
     119CASE(6) 
     120{{ vloop(mesh, lrange, flags, code, 6) }} 
     121CASE DEFAULT 
     122{{ vloop(mesh, lrange, flags, code) }} 
     123END SELECT 
     124{% endif %} 
     125 
     126{% if has_dual %} 
     127SELECT CASE(dual_deg(ij)) 
     128CASE(3) 
     129{{ vloop(mesh, lrange, flags, code, 3) }} 
     130CASE(4) 
     131{{ vloop(mesh, lrange, flags, code, 4) }} 
     132CASE DEFAULT 
     133{{ vloop(mesh, lrange, flags, code) }} 
     134END SELECT 
     135{% endif %} 
     136 
     137{% if has_trisk %} 
     138SELECT CASE(trisk_deg(edge)) 
     139CASE(10) 
     140{{ vloop(mesh, lrange, flags, code, 10) }} 
     141CASE(4) 
     142{{ vloop(mesh, lrange, flags, code, 4) }} 
     143CASE DEFAULT 
     144{{ vloop(mesh, lrange, flags, code) }} 
     145END SELECT 
     146{% endif %} 
     147 
     148{%- endmacro %} 
     149 
     150{% macro vloop(mesh, lrange, flags, code, degree=0) %} 
     151 
    83152{% set start,end = lrange %} 
    84 {% set thecode, is_top_layer, is_top_inter = code(mesh), False, False %} 
     153{% set thecode, is_top_layer, is_top_inter = code(mesh,degree), False, False %} 
    85154 
    86155{{ define('IS_TOP_LAYER', '_FALSE_') }} 
     
    140209!$OMP DO SCHEDULE(STATIC)                                                                             
    141210DO ij = 1, {{ mesh }}_num 
    142 {{ vloop(mesh, lrange, flags, caller) }} 
     211{{ vloop_unroll(mesh, lrange, flags, caller) }} 
    143212END DO 
    144213!$OMP END DO 
     
    164233{{ 'ij_up = up(edge)'       if 'VERTEX1' in thecode }} 
    165234{{ 'ij_down = down(edge)'   if 'VERTEX2' in thecode }} 
    166 {{ vloop(mesh, lrange, flags, caller) }} 
     235{{ vloop_unroll(mesh, lrange, flags, caller) }} 
    167236END DO 
    168237!$OMP END DO 
     
    176245{%- endmacro %} 
    177246 
    178 {% macro forall_edges(mesh) -%} 
     247{% macro forall_edges(mesh,degree) -%} 
    179248{% set thecode = caller() %} 
    180249{{ define('EDGE', 'l,edge') }} 
     
    183252{{ define('SIGN', mesh + '_ne(iedge,ij)') }} 
    184253{{ define('LE_DE', 'le_de(edge)') }} 
     254 
     255{% if degree>1 %} 
     256{% for iedge in range(1,degree+1) %} 
     257  iedge = {{ iedge }} 
     258  edge = {{ mesh }}_edge({{ iedge }},ij) 
     259  {{ 'ij_up = up(edge)'       if 'VERTEX1' in thecode }} 
     260  {{ 'ij_down = down(edge)'   if 'VERTEX2' in thecode }} 
     261  {{ thecode }} 
     262{% endfor %} 
     263{% else %} 
    185264DO iedge = 1, {{ mesh }}_deg(ij) 
    186265  edge = {{ mesh }}_edge(iedge,ij) 
    187 {{ 'ij_up = up(edge)'       if 'VERTEX1' in thecode }} 
    188 {{ 'ij_down = down(edge)'   if 'VERTEX2' in thecode }} 
    189   {{ thecode }} 
    190 END DO 
     266  {{ 'ij_up = up(edge)'       if 'VERTEX1' in thecode }} 
     267  {{ 'ij_down = down(edge)'   if 'VERTEX2' in thecode }} 
     268  {{ thecode }} 
     269END DO 
     270{% endif %} 
     271 
    191272{{ undef('EDGE') }} 
    192273{{ undef('SIGN') }} 
     
    194275{%- endmacro %} 
    195276 
    196 {% macro forall_trisk() -%} 
     277{% macro forall_trisk(degree) -%} 
     278{% set thecode = caller() %} 
    197279{{ define('EDGE_TRISK', 'l,edge_trisk') }} 
     280{% if degree>1 %} 
     281{% for itrisk in range(1,degree+1) %} 
     282  edge_trisk = trisk({{ itrisk }},edge) 
     283  {{ thecode }} 
     284{% endfor %} 
     285{% else %} 
    198286DO itrisk = 1, trisk_deg(edge) 
    199287  edge_trisk = trisk(itrisk,edge) 
    200   {{ caller() }} 
    201 END DO 
     288  {{ thecode }} 
     289END DO 
     290{% endif %} 
    202291{{ undef('EDGE_TRISK') }} 
    203292{%- endmacro %} 
    204293 
    205 {% macro forall_vertices(mesh) -%} 
     294{% macro forall_vertices(mesh,degree) -%} 
     295{% set thecode = caller() %} 
    206296{{ define('VERTEX', 'l,vertex') }} 
     297{% if degree>1 %} 
     298{% for ivertex in range(1,degree+1) %} 
     299  ivertex = {{ ivertex }} 
     300  vertex = {{ mesh }}_vertex({{ ivertex }},ij)  
     301  {{ thecode }} 
     302{% endfor %} 
     303{% else %} 
    207304DO ivertex = 1, {{ mesh }}_deg(ij) 
    208305  vertex = {{ mesh }}_vertex(ivertex,ij) 
    209   {{ caller() }} 
    210 END DO 
     306  {{ thecode }} 
     307END DO 
     308{% endif %} 
    211309{{ undef('VERTEX') }} 
    212310{%- endmacro %} 
Note: See TracChangeset for help on using the changeset viewer.