1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
!
! Copyright (C) 2022, MaX CoE
! Distributed under the MIT License
! (license terms are at http://opensource.org/licenses/MIT).
!
!--
!
! Utility functions to perform device memory mapping from host memory
! using CUDA-Fortran, OpenACC or OpenMP Offload
!
!==================================================================
!==================================================================
! *DO NOT EDIT*: automatically generated from device_mapping.jf90
!==================================================================
!==================================================================
!
#include<devxlib_macros.h>
#include<devxlib_defs.h>
!
!=======================================
!
submodule (devxlib_mapping) devxlib_mapping_map
implicit none
contains
{%- for t in types %}
{%- for p in kinds[t] %}
{%- for d in range(1,dimensions+1) %}
module subroutine {{p.name}}_devxlib_mapping_map_{{t[0]|lower}}{{d}}d(array, {% for dd in range(d) -%}
{{ "range%s"|format(dd+1) }}{% if not loop.last %}, &
{% endif %}{% endfor %} )
implicit none
!
{{t}}({{p.val}}), allocatable DEV_ATTR, intent(inout) :: array({% for dd in range(d) %}:{% if not loop.last %}, {%- endif %}{% endfor %})
integer, optional, intent(in) :: {% for dd in range(d) %} {{ "range%s(2)"|format(dd+1) }}{% if not loop.last %}, {%- endif %}{% endfor %}
!
{%- for dd in range(d) %}
integer :: i{{dd+1}}, d{{dd+1}}s, d{{dd+1}}e
{%- endfor %}
!
{%- for dd in range(d) %}
if (present(range{{dd+1}})) then
d{{dd+1}}s = range{{dd+1}}(1)
d{{dd+1}}e = range{{dd+1}}(2)
else
!#if defined __DXL_CUDAF
! call devxlib_error("{{p.name}}_dev_mapping_{{t[0]|lower}}{{d}}d","range not present",{{dd+1}})
!#endif
d{{dd+1}}s = lbound(array,{{dd+1}})
d{{dd+1}}e = ubound(array,{{dd+1}})
endif
!
{%- endfor %}
!
#if defined __DXL_CUDAF
if (.not.allocated(array)) allocate( array({% for dd in range(d) %}d{{dd+1}}s:d{{dd+1}}e{% if not loop.last %}, {%- endif %}{% endfor %}) )
#elif defined __DXL_OPENACC || defined __DXL_OPENMP_GPU
!DEV_ACC enter data create( array({% for dd in range(d) %}d{{dd+1}}s:d{{dd+1}}e{% if not loop.last %}, {%- endif %}{% endfor %}) )
!DEV_OMPGPU target enter data map(alloc: array )
#endif
end subroutine {{p.name}}_devxlib_mapping_map_{{t[0]|lower}}{{d}}d
!
{%- endfor %}
{%- endfor %}
{%- endfor %}
endsubmodule devxlib_mapping_map
|