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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
!
! 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>
!
!=======================================
!
module devxlib_mapping
use iso_fortran_env, only : int32, int64, real32, real64
use devxlib_environment, only : devxlib_error
#if defined __DXL_CUDAF
use cudafor
#elif defined __DXL_OPENACC
use openacc
#elif defined __DXL_OPENMP_GPU
use iso_c_binding, only : c_loc
use omp_lib, only : omp_get_default_device, omp_target_is_present
#endif
implicit none
interface devxlib_map
module procedure &
{%- for t in types %}
{%- set outer_loop = loop %}
{%- for p in kinds[t] %}
{%- set medium_loop = loop %}
{%- for d in range(1,dimensions+1,3) %}
{%- if (d+1)<=dimensions %}
{%- if (d+2)<=dimensions %}
{{p.name}}_devxlib_mapping_map_{{t[0]|lower}}{{d}}d, {{p.name}}_devxlib_mapping_map_{{t[0]|lower}}{{d+1}}d, {{p.name}}_devxlib_mapping_map_{{t[0]|lower}}{{d+2}}d{% if ((not loop.last) or (not medium_loop.last) or (not outer_loop.last))%}, &{%- endif %}
{%- else %}
{{p.name}}_devxlib_mapping_map_{{t[0]|lower}}{{d}}d, {{p.name}}_devxlib_mapping_map_{{t[0]|lower}}{{d+1}}d{% if ((not loop.last) or (not medium_loop.last) or (not outer_loop.last))%}, &{%- endif %}
{%- endif %}
{%- else %}
{{p.name}}_devxlib_mapping_map_{{t[0]|lower}}{{d}}d{% if ((not loop.last) or (not medium_loop.last) or (not outer_loop.last))%}, &{%- endif %}
{%- endif %}
{%- endfor %}
{%- endfor %}
{%- endfor %}
endinterface devxlib_map
interface devxlib_unmap
module procedure &
{%- for t in types %}
{%- set outer_loop = loop %}
{%- for p in kinds[t] %}
{%- set medium_loop = loop %}
{%- for d in range(1,dimensions+1,3) %}
{%- if (d+1)<=dimensions %}
{%- if (d+2)<=dimensions %}
{{p.name}}_devxlib_mapping_unmap_{{t[0]|lower}}{{d}}d, {{p.name}}_devxlib_mapping_unmap_{{t[0]|lower}}{{d+1}}d, {{p.name}}_devxlib_mapping_unmap_{{t[0]|lower}}{{d+2}}d{% if ((not loop.last) or (not medium_loop.last) or (not outer_loop.last))%}, &{%- endif %}
{%- else %}
{{p.name}}_devxlib_mapping_unmap_{{t[0]|lower}}{{d}}d, {{p.name}}_devxlib_mapping_unmap_{{t[0]|lower}}{{d+1}}d{% if ((not loop.last) or (not medium_loop.last) or (not outer_loop.last))%}, &{%- endif %}
{%- endif %}
{%- else %}
{{p.name}}_devxlib_mapping_unmap_{{t[0]|lower}}{{d}}d{% if ((not loop.last) or (not medium_loop.last) or (not outer_loop.last))%}, &{%- endif %}
{%- endif %}
{%- endfor %}
{%- endfor %}
{%- endfor %}
endinterface devxlib_unmap
interface devxlib_mapped
module procedure &
{%- for t in types %}
{%- set outer_loop = loop %}
{%- for p in kinds[t] %}
{%- set medium_loop = loop %}
{%- for d in range(1,dimensions+1,3) %}
{%- if (d+1)<=dimensions %}
{%- if (d+2)<=dimensions %}
{{p.name}}_devxlib_mapping_mapped_{{t[0]|lower}}{{d}}d, {{p.name}}_devxlib_mapping_mapped_{{t[0]|lower}}{{d+1}}d, {{p.name}}_devxlib_mapping_mapped_{{t[0]|lower}}{{d+2}}d{% if ((not loop.last) or (not medium_loop.last) or (not outer_loop.last))%}, &{%- endif %}
{%- else %}
{{p.name}}_devxlib_mapping_mapped_{{t[0]|lower}}{{d}}d, {{p.name}}_devxlib_mapping_mapped_{{t[0]|lower}}{{d+1}}d{% if ((not loop.last) or (not medium_loop.last) or (not outer_loop.last))%}, &{%- endif %}
{%- endif %}
{%- else %}
{{p.name}}_devxlib_mapping_mapped_{{t[0]|lower}}{{d}}d{% if ((not loop.last) or (not medium_loop.last) or (not outer_loop.last))%}, &{%- endif %}
{%- endif %}
{%- endfor %}
{%- endfor %}
{%- endfor %}
endinterface devxlib_mapped
interface
{%- 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 %}
end subroutine {{p.name}}_devxlib_mapping_map_{{t[0]|lower}}{{d}}d
{%- endfor %}
{%- endfor %}
{%- endfor %}
endinterface
interface
{%- for t in types %}
{%- for p in kinds[t] %}
{%- for d in range(1,dimensions+1) %}
module subroutine {{p.name}}_devxlib_mapping_unmap_{{t[0]|lower}}{{d}}d(array, ierr)
implicit none
{{t}}({{p.val}}), allocatable DEV_ATTR :: array({% for dd in range(d) %}:{% if not loop.last %}, {%- endif %}{% endfor %})
integer, optional, intent(out) :: ierr
end subroutine {{p.name}}_devxlib_mapping_unmap_{{t[0]|lower}}{{d}}d
{%- endfor %}
{%- endfor %}
{%- endfor %}
endinterface
interface
{%- for t in types %}
{%- for p in kinds[t] %}
{%- for d in range(1,dimensions+1) %}
module function {{p.name}}_devxlib_mapping_mapped_{{t[0]|lower}}{{d}}d(array) result(res)
implicit none
logical :: res
#if defined __DXL_OPENMP_GPU
{{t}}({{p.val}}), allocatable, target :: array({% for dd in range(d) %}:{% if not loop.last %}, {%- endif %}{% endfor %})
#else
{{t}}({{p.val}}), allocatable DEV_ATTR :: array({% for dd in range(d) %}:{% if not loop.last %}, {%- endif %}{% endfor %})
#endif
end function {{p.name}}_devxlib_mapping_mapped_{{t[0]|lower}}{{d}}d
{%- endfor %}
{%- endfor %}
{%- endfor %}
endinterface
endmodule devxlib_mapping
|