Ignore:
Timestamp:
12/22/17 01:35:23 (6 years ago)
Author:
dubos
Message:

devel/unstructured : more loop unrolling

File:
1 edited

Legend:

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

    r647 r650  
    8686{%- endmacro %} 
    8787 
     88{# ---------------------- PRELOAD STENCIL INDICES ---------------------- #} 
     89 
     90{% macro get_edges(thecode, mesh,degree) %} 
     91{% for iedge in range(1,degree+1) %}  
     92{{ 'edge%d = %s_edge(%d,ij)'%(iedge,mesh,iedge) if 'EDGE' in thecode }}  
     93{% endfor %} 
     94{% for iedge in range(1,degree+1) %}  
     95{{ 'le_de%d = le_de(edge%d)'%(iedge,iedge) if 'LE_DE' in thecode }}       
     96{% endfor %} 
     97{% for iedge in range(1,degree+1) %}  
     98{{ 'sign%d = %s_ne(%d,ij)'%(iedge,mesh,iedge) if 'SIGN' in thecode }}    
     99{% endfor %} 
     100{% for iedge in range(1,degree+1) %}  
     101{{ 'ij_up%d = up(edge%d)'%(iedge,iedge) if 'VERTEX1' in thecode }} 
     102{% endfor %} 
     103{% for iedge in range(1,degree+1) %}  
     104{{ 'ij_down%d = down(edge%d)'%(iedge,iedge) if 'VERTEX2' in thecode }} 
     105{% endfor %} 
     106{% endmacro %} 
     107 
     108{% macro get_vertices(thecode, mesh,degree) %} 
     109{% for ivertex in range(1,degree+1) %}  
     110{{ 'vertex%d = %s_vertex(%d,ij)'%(ivertex,mesh,ivertex) if 'VERTEX' in thecode }}  
     111{% endfor %} 
     112{% endmacro %} 
     113 
    88114{# ------------------------------ MESHES --------------------------- #} 
    89  
    90 {% macro get_edges(thecode, mesh,degree) %} 
    91 {% for iedge in range(1,degree+1) %}  
    92 {{ 'edge%d = %s_edge(%d,ij)'%(iedge,mesh,iedge) }}  
    93 {% endfor %} 
    94 {% for iedge in range(1,degree+1) %}  
    95 {{ 'le_de%d = le_de(edge%d)'%(iedge,iedge) }}       
    96 {% endfor %} 
    97 {% for iedge in range(1,degree+1) %}  
    98 {{ 'sign%d = %s_ne(%d,ij)'%(iedge,mesh,iedge) }}    
    99 {% endfor %} 
    100 {% for iedge in range(1,degree+1) %}  
    101 {{ 'ij_up%d = up(edge%d)'%(iedge,iedge) if 'VERTEX1' in thecode }} 
    102 {% endfor %} 
    103 {% for iedge in range(1,degree+1) %}  
    104 {{ 'ij_down%d = down(edge%d)'%(iedge,iedge) if 'VERTEX2' in thecode }} 
    105 {% endfor %} 
    106 {% endmacro %} 
    107115 
    108116{# argument 'code' is the body enclosed by ON_XXX ... END_BLOCK ; it takes arguments : mesh,degree=0 #} 
     
    148156SELECT CASE(dual_deg(ij)) 
    149157CASE(3) 
     158{{ get_edges(thecode, mesh, 3) }} 
     159{{ get_vertices(thecode,mesh,3) }} 
    150160{{ vloop(mesh, lrange, flags, code, 3) }} 
    151161CASE(4) 
     162{{ get_edges(thecode, mesh, 4) }} 
     163{{ get_vertices(thecode,mesh,4) }} 
    152164{{ vloop(mesh, lrange, flags, code, 4) }} 
    153165CASE DEFAULT 
     
    243255{% set thecode = caller(mesh) %} 
    244256{{ define('EDGE', 'l,edge') }} 
    245 {{ define('LE_DE', 'le_de(edge)') }} 
    246 {{ define('SIGN', '1.') }} 
    247 {{ define('CELL1', 'l,ij_left') }} 
    248 {{ define('CELL2',  'l,ij_right') }} 
    249 {{ define('VERTEX1', 'l,ij_down') }} 
    250 {{ define('VERTEX2', 'l,ij_up') }} 
     257{{ cdef(thecode, 'LE_DE', 'le_de(edge)') }} 
     258{{ cdef(thecode, 'SIGN', '1.') }} 
     259{{ cdef(thecode, 'CELL1', 'l,ij_left') }} 
     260{{ cdef(thecode, 'CELL2',  'l,ij_right') }} 
     261{{ cdef(thecode, 'VERTEX1', 'l,ij_down') }} 
     262{{ cdef(thecode, 'VERTEX2', 'l,ij_up') }} 
    251263!$OMP DO SCHEDULE(STATIC) 
    252264DO edge = 1, edge_num 
     
    258270END DO 
    259271!$OMP END DO 
    260 {{ undef('EDGE') }} 
    261 {{ undef('LE_DE') }} 
    262 {{ undef('SIGN') }} 
    263 {{ undef('CELL1') }} 
    264 {{ undef('CELL2') }} 
    265 {{ undef('VERTEX1') }} 
    266 {{ undef('VERTEX2') }} 
     272{{ cundef(thecode, ('EDGE','LE_DE','SIGN','CELL1','CELL2','VERTEX1','VERTEX2') ) }} 
    267273{%- endmacro %} 
    268274 
     
    272278{% if degree>1 %} 
    273279{% for iedge in range(1,degree+1) %} 
    274 {{ define('EDGE', 'l,edge%d'%iedge) }} 
    275 {{ define('SIGN', 'sign%d'%iedge) }} 
    276 {{ define('LE_DE', 'le_de%d'%iedge) }} 
    277 {{ define('VERTEX1', 'l,ij_up%d'%iedge) }} 
    278 {{ define('VERTEX2', 'l,ij_down%d'%iedge) }} 
     280{{ cdef(thecode, 'EDGE', 'l,edge%d'%iedge) }} 
     281{{ cdef(thecode, 'SIGN', 'sign%d'%iedge) }} 
     282{{ cdef(thecode, 'LE_DE', 'le_de%d'%iedge) }} 
     283{{ cdef(thecode, 'VERTEX1', 'l,ij_up%d'%iedge) }} 
     284{{ cdef(thecode, 'VERTEX2', 'l,ij_down%d'%iedge) }} 
    279285  {{ thecode }} 
    280286{% endfor %} 
    281287{% else %} 
    282 {{ define('EDGE', 'l,edge') }} 
    283 {{ define('SIGN', mesh + '_ne(iedge,ij)') }} 
    284 {{ define('LE_DE', 'le_de(edge)') }} 
    285 {{ define('VERTEX1', 'l,ij_up') }} 
    286 {{ define('VERTEX2', 'l,ij_down') }} 
     288{{ cdef(thecode, 'EDGE', 'l,edge') }} 
     289{{ cdef(thecode, 'SIGN', mesh + '_ne(iedge,ij)') }} 
     290{{ cdef(thecode, 'LE_DE', 'le_de(edge)') }} 
     291{{ cdef(thecode, 'VERTEX1', 'l,ij_up') }} 
     292{{ cdef(thecode, 'VERTEX2', 'l,ij_down') }} 
    287293DO iedge = 1, {{ mesh }}_deg(ij) 
    288294  edge = {{ mesh }}_edge(iedge,ij) 
     
    292298END DO 
    293299{% endif %} 
    294  
    295 {{ undef('EDGE') }} 
    296 {{ undef('SIGN') }} 
    297 {{ undef('LE_DE') }} 
    298 {{ undef('VERTEX1') }} 
    299 {{ undef('VERTEX2') }} 
     300{{ cundef(thecode, ('EDGE', 'SIGN', 'LE_DE', 'VERTEX1', 'VERTEX2') ) }} 
    300301{%- endmacro %} 
    301302 
     
    320321{% macro forall_vertices(mesh,degree) -%} 
    321322{% set thecode = caller() %} 
    322 {{ define('VERTEX', 'l,vertex') }} 
    323323{% if degree>1 %} 
    324324{% for ivertex in range(1,degree+1) %} 
    325   ivertex = {{ ivertex }} 
    326   vertex = {{ mesh }}_vertex({{ ivertex }},ij)  
     325{{ define('RIV2', 'Riv2(%d,ij)'%ivertex ) }} 
     326{{ define('VERTEX', 'l,vertex%d'%ivertex ) }} 
    327327  {{ thecode }} 
    328328{% endfor %} 
    329329{% else %} 
     330{{ define('RIV2', 'Riv2(ivertex,ij)') }} 
     331{{ define('VERTEX', 'l,vertex') }} 
    330332DO ivertex = 1, {{ mesh }}_deg(ij) 
    331333  vertex = {{ mesh }}_vertex(ivertex,ij) 
     
    334336{% endif %} 
    335337{{ undef('VERTEX') }} 
     338{{ undef('RIV2') }} 
    336339{%- endmacro %} 
    337340 
     
    357360#define _FALSE_ (0==1) 
    358361 
    359 #define RIV2 Riv2(ivertex,ij) 
    360362#define AI Ai(ij) 
    361363#define AV Av(ij) 
Note: See TracChangeset for help on using the changeset viewer.