From 9a6e6ef5bae6cb773ed4a688bb854dd30896b583 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 29 Sep 2021 07:28:53 -0400 Subject: [PATCH 01/67] Start stability test suite for full app. --- test/stability/Makefile | 17 +++++++++++++++++ test/stability/README.md | 9 +++++++++ test/stability/test1.f90 | 12 ++++++++++++ test/stability/test2.f90 | 24 ++++++++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 test/stability/Makefile create mode 100644 test/stability/README.md create mode 100644 test/stability/test1.f90 create mode 100644 test/stability/test2.f90 diff --git a/test/stability/Makefile b/test/stability/Makefile new file mode 100644 index 00000000..94e1ccb9 --- /dev/null +++ b/test/stability/Makefile @@ -0,0 +1,17 @@ +CONV = gpufort +CONV_FLAGS ?= -w -E hip-gpufort-rt + +SOURCES = $(shell find . -name "test*.f90") +TESTS=$(SOURCES:.f90=.f90-gpufort.f08) + +.PHONY: clean all + +all: $(TESTS) + +$(TESTS): %.f90-gpufort.f08 : %.f90 + $(CONV) $(CONV_FLAGS) $^ + +clean: + rm -rf *.f90-* *.gpufort_mod *-fort2hip.hip.cpp + + diff --git a/test/stability/README.md b/test/stability/README.md new file mode 100644 index 00000000..e522b6c4 --- /dev/null +++ b/test/stability/README.md @@ -0,0 +1,9 @@ +GPUFORT STABILITY TESTS +----------------------- + +In this test suite, we monitor only that GPUFORT does not crash when +converting Fortran code. +We do not care about correct output of the code generator (at this time). + +The snippets in this collection caused GPUFORT to +crash in the past. diff --git a/test/stability/test1.f90 b/test/stability/test1.f90 new file mode 100644 index 00000000..07c68bbc --- /dev/null +++ b/test/stability/test1.f90 @@ -0,0 +1,12 @@ +subroutine external_acc_routine(view) + + implicit none + real(4), intent(inout) :: view(:,:) + + !$acc data present(view) + !$acc kernels + view(1,1) = 4. + !$acc end kernels + !$acc end data + +end subroutine external_acc_routine diff --git a/test/stability/test2.f90 b/test/stability/test2.f90 new file mode 100644 index 00000000..20ae17fd --- /dev/null +++ b/test/stability/test2.f90 @@ -0,0 +1,24 @@ +module allocate_unified_module + +interface + + subroutine allocate_unified_impl( a, N ) bind(C,name="allocate_unified_impl") + use, intrinsic :: iso_c_binding + type(c_ptr) :: a + integer(c_int), value :: N + end subroutine + +end interface + +contains + + subroutine allocate_unified( a, N ) + use, intrinsic :: iso_c_binding + real(c_double), pointer :: a(:) + integer(c_int) :: N + type(c_ptr) :: value_cptr + call allocate_unified_impl(value_cptr, N) + call c_f_pointer(value_cptr,a,(/N/)) + end subroutine + +end module From 61efb5c940366b6467f1704cacd21d459d226583 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 11 Oct 2021 09:00:10 -0400 Subject: [PATCH 02/67] fort2hip/scanner: Move translator calls into scanner * Reason: Need to know all variables in loop kernel body to generate `present_or_\(copy\|copyin\) runtime calls for the vars not appearing in clauses. --- python/fort2hip/fort2hip.py | 32 ++----- .../cudafortran/scanner_tree_cuf.py.in | 6 +- .../cudafortran/scanner_tree_cuf2hip.py.in | 4 +- .../cudafortran/scanner_tree_cuf2omp.py.in | 4 +- python/scanner/openacc/scanner_tree_acc.py.in | 8 +- .../openacc/scanner_tree_acc2hipgccrt.py.in | 8 +- .../scanner_tree_acc2hipgpufortrt.py.in | 17 ++-- .../openacc/scanner_tree_acc2omp.py.in | 6 +- python/scanner/scanner.py | 8 +- python/scanner/scanner_tree.py.in | 87 ++++++++++++------- python/translator/translator_f03.py.in | 2 +- 11 files changed, 98 insertions(+), 84 deletions(-) diff --git a/python/fort2hip/fort2hip.py b/python/fort2hip/fort2hip.py index 1dba5296..2ce3a9c8 100644 --- a/python/fort2hip/fort2hip.py +++ b/python/fort2hip/fort2hip.py @@ -288,11 +288,9 @@ def _intrnl_update_context_from_loop_kernels(loop_kernels,index,hip_context,f_co hip_context["have_reductions"] = False for stkernel in loop_kernels: - parent_tag = stkernel._parent.tag() - scope = scoper.create_scope(index,parent_tag) - - # translate and analyze kernels - parse_result = translator.parse_loop_kernel(stkernel.code,scope) + parse_result = stkernel.parse_result + parent_tag = stkernel._parent.tag() + scope = scoper.create_scope(index,parent_tag) kernel_args, c_kernel_local_vars, macros, input_arrays, local_cpu_routine_args =\ _intrnl_derive_kernel_arguments(scope,\ @@ -304,7 +302,7 @@ def _intrnl_update_context_from_loop_kernels(loop_kernels,index,hip_context,f_co utils.logging.log_debug3(LOG_PREFIX,"_intrnl_update_context_from_loop_kernels","parse result:\n```"+parse_result.c_str().rstrip()+"\n```") # general - kernel_name = stkernel.kernel_name() + kernel_name = stkernel.kernel_name() kernel_launcher_name = stkernel.kernel_launcher_name() # treat reduction_vars vars / acc default(present) vars @@ -482,26 +480,14 @@ def _intrnl_update_context_from_device_procedures(device_procedures,index,hip_co utils.logging.log_enter_function(LOG_PREFIX,"_intrnl_update_context_from_device_procedures") for stprocedure in device_procedures: - scope = scoper.create_scope(index,stprocedure.tag()) iprocedure = stprocedure.index_record - is_function = iprocedure["kind"] == "function" + is_function = stprocedure.is_function() + scope = scoper.create_scope(index,stprocedure.tag()) hip_context["includes"] += _intrnl_create_includes_from_used_modules(iprocedure,index) fBody = "\n".join(stprocedure.code) - if is_function: - result_name = iprocedure["result_name"] - ivar_result = next([var for var in iprocedure["variables"] if var["name"] == iprocedure["result_name"]],None) - if ivar_result != None: - result_type = ivar_result["c_type"] - parse_result = translator.parse_procedure_body(stprocedure.code,scope,ivar_result["name"]) - else: - msg = "could not identify return value for function ''" - utils.logging.log_error(msg) - sys.exit(INDEXER_ERROR_CODE) - else: - result_type = "void" - parse_result = translator.parse_procedure_body(stprocedure.code,scope) + parse_result = stprocedure.parse_result utils.logging.log_debug3(LOG_PREFIX,"_intrnl_update_context_from_device_procedures","parse result:\n```"+parse_result.c_str().rstrip()+"\n```") # TODO: look up functions and subroutines called internally and supply to parse_result before calling c_str() @@ -535,7 +521,7 @@ def _intrnl_update_context_from_device_procedures(device_procedures,index,hip_co hip_kernel_dict["generate_launcher"] = generate_launcher hip_kernel_dict["generate_cpu_launcher"] = False hip_kernel_dict["modifier"] = "__global__" if stprocedure.is_kernel_subroutine() else "__device__" - hip_kernel_dict["return_type"] = result_type + hip_kernel_dict["return_type"] = stprocedure.c_result_type hip_kernel_dict["is_loop_kernel"] = False hip_kernel_dict["kernel_name"] = kernel_name hip_kernel_dict["macros"] = macros @@ -753,4 +739,4 @@ def device_procedure_filter_(child): utils.logging.log_leave_function(LOG_PREFIX,"generate_hip_files") - return fortran_module_filepath, main_hip_filepath \ No newline at end of file + return fortran_module_filepath, main_hip_filepath diff --git a/python/scanner/cudafortran/scanner_tree_cuf.py.in b/python/scanner/cudafortran/scanner_tree_cuf.py.in index 6bb82379..33b7d236 100644 --- a/python/scanner/cudafortran/scanner_tree_cuf.py.in +++ b/python/scanner/cudafortran/scanner_tree_cuf.py.in @@ -29,14 +29,14 @@ class STCufDirective(STDirective): def __init__(self,parent,lineno,lines,directive_no): STDirective.__init__(self,parent,lineno,lines,directive_no,sentinel="!$cuf") self._default_present_vars = [] - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): assert False, "Currently, there are only CUF parallel directives" class STCufLoopKernel(STCufDirective,STLoopKernel): def __init__(self,parent,lineno,lines,directive_no): STCufDirective.__init__(self,parent,lineno,lines,directive_no) STLoopKernel.__init__(self,parent,lineno,lines) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[],destination_dialect=""): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[],destination_dialect=""): """ :param destination_dialect: allows to override default if this kernel should be translated via another backend. @@ -44,4 +44,4 @@ class STCufLoopKernel(STCufDirective,STLoopKernel): checked_dialect = check_destination_dialect(\ DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) return CUF_LOOP_KERNEL_BACKENDS[checked_dialect](self).transform(\ - joined_lines,joined_statements,statements_fully_cover_lines,index_hints) \ No newline at end of file + joined_lines,joined_statements,statements_fully_cover_lines,index) \ No newline at end of file diff --git a/python/scanner/cudafortran/scanner_tree_cuf2hip.py.in b/python/scanner/cudafortran/scanner_tree_cuf2hip.py.in index 8ad80bca..ce36aca5 100644 --- a/python/scanner/cudafortran/scanner_tree_cuf2hip.py.in +++ b/python/scanner/cudafortran/scanner_tree_cuf2hip.py.in @@ -2,7 +2,7 @@ # Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. class CufLoopKernel2Hip(CufBackendBase): - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): - return STLoopKernel.transform(self._stnode,joined_lines,joined_statements,statements_fully_cover_lines,index_hints) + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): + return STLoopKernel.transform(self._stnode,joined_lines,joined_statements,statements_fully_cover_lines,index) register_cuf_backend("hip",CufLoopKernel2Hip,None) \ No newline at end of file diff --git a/python/scanner/cudafortran/scanner_tree_cuf2omp.py.in b/python/scanner/cudafortran/scanner_tree_cuf2omp.py.in index 9e72181a..6b6a0daa 100644 --- a/python/scanner/cudafortran/scanner_tree_cuf2omp.py.in +++ b/python/scanner/cudafortran/scanner_tree_cuf2omp.py.in @@ -2,7 +2,7 @@ # Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. class CufLoopKernel2Omp(CufBackendBase): - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): """ Analyze based on statements but modify original lines if these are fully covered by the statements. @@ -10,7 +10,7 @@ class CufLoopKernel2Omp(CufBackendBase): global LOG_PREFIX try: parent_tag = self._stnode._parent.tag() - scope = scoper.create_scope(index_hints,parent_tag) + scope = scoper.create_scope(index,parent_tag) parse_result = translator.parse_loop_kernel(joined_statements.split("\n"),scope) f_snippet = joined_lines if statements_fully_cover_lines else joined_statements return parse_result.omp_f_str(f_snippet), True diff --git a/python/scanner/openacc/scanner_tree_acc.py.in b/python/scanner/openacc/scanner_tree_acc.py.in index c288f6e7..d9310517 100644 --- a/python/scanner/openacc/scanner_tree_acc.py.in +++ b/python/scanner/openacc/scanner_tree_acc.py.in @@ -100,15 +100,15 @@ class STAccDirective(STDirective): is_parallel_loop_directive=self.is_parallel_loop_directive() ).strip().replace("\n","") __repr__ = __str__ - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): checked_dialect = check_destination_dialect(DESTINATION_DIALECT) return ACC_BACKENDS[checked_dialect](self).transform(\ - joined_lines,joined_statements,statements_fully_cover_lines,index_hints) + joined_lines,joined_statements,statements_fully_cover_lines,index) class STAccLoopKernel(STAccDirective,STLoopKernel): def __init__(self,parent,first_linemap,first_linemap_first_statement,directive_no): STAccDirective.__init__(self,parent,first_linemap,first_linemap_first_statement,directive_no) STLoopKernel.__init__(self,parent,first_linemap,first_linemap_first_statement) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[],destination_dialect=""): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[],destination_dialect=""): """ :param destination_dialect: allows to override default if this kernel should be translated via another backend. @@ -116,4 +116,4 @@ class STAccLoopKernel(STAccDirective,STLoopKernel): checked_dialect = check_destination_dialect(\ DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) return ACC_LOOP_KERNEL_BACKENDS[checked_dialect](self).transform(\ - joined_lines,joined_statements,statements_fully_cover_lines,index_hints) \ No newline at end of file + joined_lines,joined_statements,statements_fully_cover_lines,index) \ No newline at end of file diff --git a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in index 1ca5615f..55eaecbb 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in @@ -104,7 +104,7 @@ class Acc2HipGccRT(AccBackendBase): return clause.condition() else: return "" - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[],handle_if=False): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[],handle_if=False): f_snippet = joined_statements result = "" try: @@ -150,14 +150,14 @@ class Acc2HipGccRT(AccBackendBase): return f_snippet, False class AccLoopKernel2HipGccRT(Acc2HipGccRT): - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): stnode = self._stnode indent = stnode.first_line_indent() result = "" if stnode.is_parallel_loop_directive() or stnode.is_kernels_loop_directive(): - partial_result, _ = Acc2HipGccRT.transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints,handle_if=False) + partial_result, _ = Acc2HipGccRT.transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index,handle_if=False) result = partial_result - partial_result, _ = STLoopKernel.transform(stnode,joined_lines,joined_statements,statements_fully_cover_lines,index_hints) + partial_result, _ = STLoopKernel.transform(stnode,joined_lines,joined_statements,statements_fully_cover_lines,index) result += partial_result # add wait call if necessary arg = self._handle_async(None,"") diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index 670a25eb..d8273b6b 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -23,7 +23,7 @@ HIP_GPUFORT_RT_ACC_UPDATE_HOST = "{indent}call gpufort_acc_update_host({var}{asy # update device HIP_GPUFORT_RT_ACC_UPDATE_DEVICE = "{indent}call gpufort_acc_update_device({var}{asyncr})\n" # present -HIP_GPUFORT_RT_ACC_PRESENT = "{indent}{dev_var} = gpufort_acc_present({var})\n" +HIP_GPUFORT_RT_ACC_PRESENT = "{indent}{dev_var} = gpufort_acc_present({var}{copy}{asyncr})\n" # wait HIP_GPUFORT_RT_ACC_WAIT = "{indent}call gpufort_acc_wait({queue}{asyncr})\n" @@ -165,7 +165,7 @@ class Acc2HipGpufortRT(AccBackendBase): for parse_result in translator.acc_clause_if.searchString(self._stnode.single_line_statement(),1): condition = parse_result[0].condition() return condition - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[],handle_if=True): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[],handle_if=True): """ :param line: An excerpt from a Fortran file, possibly multiple lines :type line: str @@ -184,9 +184,10 @@ class Acc2HipGpufortRT(AccBackendBase): ## Enter region commands must come first emit_enter_region = stnode.is_enter_directive() emit_enter_region = emit_enter_region or stnode.is_data_directive() - #emit_enter_region = emit_enter_region or stnode.is_parallel_directive() - #emit_enter_region = emit_enter_region or stnode.is_parallel_loop_directive() + emit_enter_region = emit_enter_region or stnode.is_parallel_directive() + emit_enter_region = emit_enter_region or stnode.is_parallel_loop_directive() emit_enter_region = emit_enter_region or stnode.is_kernels_directive() + emit_enter_region = emit_enter_region or stnode.is_kernels_loop_directive() if emit_enter_region: result += HIP_GPUFORT_RT_ACC_ENTER_REGION.format(indent=indent) @@ -211,7 +212,7 @@ class Acc2HipGpufortRT(AccBackendBase): ## Exit region commands must come last emit_exit_region = stnode.is_exit_directive() emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("kernels") and not stnode.find_substring("loop")) - #emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("parallel") and not stnode.find_substring("loop")) + emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("parallel") and not stnode.find_substring("loop")) emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("data")) if emit_exit_region: result += HIP_GPUFORT_RT_ACC_EXIT_REGION.format(indent=indent) @@ -239,14 +240,14 @@ class Acc2HipGpufortRT(AccBackendBase): return result, len(result) class AccLoopKernel2HipGpufortRT(Acc2HipGpufortRT): - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): result = "" stnode = self._stnode indent = stnode.first_line_indent() if stnode.is_parallel_loop_directive() or stnode.is_kernels_loop_directive(): - partial_result, _ = Acc2HipGpufortRT.transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints,handle_if=False) + partial_result, _ = Acc2HipGpufortRT.transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index,handle_if=False) result = partial_result - partial_result, _ = STLoopKernel.transform(stnode,joined_lines,joined_statements,statements_fully_cover_lines,index_hints) + partial_result, _ = STLoopKernel.transform(stnode,joined_lines,joined_statements,statements_fully_cover_lines,index) result += partial_result # add wait call if necessary queue = self._handle_async(None,"") diff --git a/python/scanner/openacc/scanner_tree_acc2omp.py.in b/python/scanner/openacc/scanner_tree_acc2omp.py.in index 7cbf808d..981f1639 100644 --- a/python/scanner/openacc/scanner_tree_acc2omp.py.in +++ b/python/scanner/openacc/scanner_tree_acc2omp.py.in @@ -1,7 +1,7 @@ # SPDX-License-Identifier: MIT # Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. class Acc2Omp(AccBackendBase): - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): global LOG_PREFIX snippet = joined_statements @@ -16,7 +16,7 @@ class Acc2Omp(AccBackendBase): utils.logging.log_exception(LOG_PREFIX,"Acc2Omp.transform","failed parse directive "+str(snippet)) class AccLoopKernel2Omp(AccBackendBase): - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): global LOG_PREFIX if statements_fully_cover_lines: @@ -25,7 +25,7 @@ class AccLoopKernel2Omp(AccBackendBase): snippet = joined_statements try: parent_tag = self._stnode._parent.tag() - scope = scoper.create_scope(index_hints,parent_tag) + scope = scoper.create_scope(index,parent_tag) parse_result = translator.parse_loop_kernel(snippet.split("\n"),scope) return parse_result.omp_f_str(snippet), True except Exception as e: diff --git a/python/scanner/scanner.py b/python/scanner/scanner.py index 4d05df5a..fb564936 100644 --- a/python/scanner/scanner.py +++ b/python/scanner/scanner.py @@ -208,12 +208,13 @@ def End(): nonlocal current_node nonlocal current_linemap nonlocal keep_recording + nonlocal index log_detection_("end of module/program/function/subroutine") assert type(current_node) in [STModule,STProgram,STProcedure], "In file {}: line {}: type is {}".format(current_file, current_statement_no, type(current_node)) if type(current_node) is STProcedure and current_node.must_be_available_on_device(): current_node.add_linemap(current_linemap) current_node._last_statement_index = current_statement_no - current_node.complete_init() + current_node.complete_init(index) keep_recording = False if not keep_recording and type(current_node) in [STProcedure,STProgram]: new = STEndOrReturn(current_node,current_linemap,current_statement_no) @@ -254,13 +255,14 @@ def DoLoop_leave(): nonlocal current_statement_no nonlocal do_loop_ctr nonlocal keep_recording + nonlocal index log_detection_("end of do loop") do_loop_ctr -= 1 if isinstance(current_node, STLoopKernel): if keep_recording and current_node._do_loop_ctr_memorised == do_loop_ctr: current_node.add_linemap(current_linemap) current_node._last_statement_index = current_statement_no - current_node.complete_init() + current_node.complete_init(index) ascend_() keep_recording = False def Declaration(): @@ -632,4 +634,4 @@ def is_accelerated(child): _intrnl_postprocess_cuf(stree) if "acc" in SOURCE_DIALECTS: _intrnl_postprocess_acc(stree) - utils.logging.log_leave_function(LOG_PREFIX,"postprocess") \ No newline at end of file + utils.logging.log_leave_function(LOG_PREFIX,"postprocess") diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index 09398869..97268ac2 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -66,7 +66,7 @@ class STNode: """Adds a linemap if it differs from the last linemap.""" if not len(self._linemaps) or self._linemaps[-1]["lineno"] < linemap["lineno"]: self._linemaps.append(linemap) - def complete_init(self): + def complete_init(self,index=[]): """Complete the initialization This routine is called after all associated linemaps have @@ -185,7 +185,7 @@ class STNode: """Add some epilog lines to the first linemap.""" if not line in self._linemaps[-1]["epilog"]: self._linemaps[-1]["epilog"].append(line) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): """Transforms statements associated with underlying linemaps (hook) :param line: An excerpt from a Fortran file, possibly multiple lines :type line: str @@ -232,11 +232,11 @@ class STNode: for linemap in self._linemaps[1:-1]: # upper bound exclusive linemap["modified"] = True assign_none_(linemap["statements"]) - def transform_statements(self,index_hints=[]): + def transform_statements(self,index=[]): """ Replaces original statements by generated code. Modifies the 'statements' entries of the associated linemaps. - :param list index_hints: TBA + :param list index: TBA :note: When multiple linemaps contain the expression associated with this note, the transformed code is written into the first associated statement in the first linemap and the remaining associated statements in the first @@ -254,7 +254,7 @@ class STNode: joined_lines = "".join(self.lines()) joined_statements = "\n".join(self.statements()) - transformed_code, modified = self.transform(joined_lines,joined_statements,statements_fully_cover_lines,index_hints) + transformed_code, modified = self.transform(joined_lines,joined_statements,statements_fully_cover_lines,index) if modified: self.__modify_linemaps(transformed_code) @@ -282,7 +282,7 @@ class STProgram(STNode,Tagged): class STUseStatement(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO clean indent = self.first_line_indent() snippet = joined_statements @@ -310,14 +310,35 @@ class STProcedure(STNode,Tagged): self.code = [] # check attributes self.index_record, _ = scoper.search_index_for_subprogram(index,self._parent.tag(),name) + self.c_result_type = "void" + self.parse_result = None def __must_be_available_on_host(self): return not len(self.index_record["attributes"]) or\ "host" in self.index_record["attributes"] def __attributes_present(self): return len(self.index_record["attributes"]) - def complete_init(self): + def complete_init(self,index): # exclude begin/end statement of procedure - self.code = self.statements()[1:-1] # implies copy + self.code = self.statements()[1:-1] # implies copy + scope = scoper.create_scope(index,self.tag()) + iprocedure = self.index_record + + if self.is_function(): + result_name = iprocedure["result_name"] + ivar_result = next([var for var in iprocedure["variables"] if var["name"] == iprocedure["result_name"]],None) + if ivar_result != None: + self.c_result_type = ivar_result["c_type"] + self.parse_result = translator.parse_procedure_body(self.code,scope,ivar_result["name"]) + else: + msg = "could not identify return value for function ''" + utils.logging.log_error(msg) + sys.exit(2) + else: + self.c_result_type = "void" + self.parse_result = translator.parse_procedure_body(self.code,scope) + def is_function(self): + """:return: If the procedure is a function. Otherwise, it is a subroutine.""" + return self.index_record["kind"] == "function" def has_attribute(self,attribute): return attribute in self.index_record["attributes"] def is_kernel_subroutine(self): @@ -374,6 +395,7 @@ class STLoopKernel(STNode): self.stream_f_str = "c_null_ptr" # set from extraction routine self.kernel_arg_names = [] # set from extraction routine self.code = [] + self.parse_result = None self._do_loop_ctr_memorised = -1 def __hash(self): """Compute hash code for this kernel. Must be done before any transformations are performed.""" @@ -382,14 +404,17 @@ class STLoopKernel(STNode): self.remove_whitespaces(statements) snippet = "".join(statements) return hashlib.md5(snippet.encode()).hexdigest()[0:6] - def complete_init(self): - self.code = self.statements() + def complete_init(self,index=[]): + self.code = self.statements() + parent_tag = self._parent.tag() + scope = scoper.create_scope(index,parent_tag) + self.parse_result = translator.parse_loop_kernel(self.code,scope) def kernel_name(self): """Derive a name for the kernel""" return LOOP_KERNEL_NAME_TEMPLATE.format(parent=self._parent.name.lower(),lineno=self.min_lineno(),hash=self.__hash()) def kernel_launcher_name(self): return "launch_{}".format(self.kernel_name()) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): indent = self.first_line_indent() try: stream_as_int = int(self.stream_f_str) @@ -419,7 +444,7 @@ class STDeclaration(STNode): self._vars = [name.lower() for name in self._ttdeclaration.variable_names()] def create_codegen_context(self): return translator.create_index_records_from_declaration(self._ttdeclaration) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): """ if device and allocatable, remove device, add pointer if device and fixed size array, remove device, add pointer, replace fixed bounds by other bounds @@ -430,8 +455,8 @@ class STDeclaration(STNode): find first code line and add allocation to preamble if no dummy argument -> double pass if integer with stream kind, """ - if len(index_hints): - index = index_hints + if len(index): + index = index else: index = copy.copy(scoper.EMPTY) index["variables"] = self.create_codegen_context() @@ -490,19 +515,19 @@ class STAttributes(STNode): """ def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): # TODO + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO return "", True class STNonZeroCheck(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): # TODO + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO result = snippet transformed = False for tokens,start,end in translator.non_zero_check.scanString(result): parse_result = tokens[0] lhs_name = parse_result.lhs_f_str() - ivar,_ = scoper.search_index_for_variable(index_hints,self._parent.tag(),\ + ivar,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ lhs_name) on_device = scoper.index_variable_is_on_device(ivar) transformed |= on_device @@ -514,10 +539,10 @@ class STNonZeroCheck(STNode): class STAllocated(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): # TODO + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO def repl(parse_result): var_name = parse_result.var_name() - ivar,_ = scoper.search_index_for_variable(index_hints,self._parent.tag(),\ + ivar,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ var_name) on_device = scoper.index_variable_is_on_device(ivar) return (parse_result.f_str(), on_device) # TODO backend specific @@ -528,7 +553,7 @@ class STAllocated(STNode): class STAllocate(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): # TODO + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO indent = self.first_line_indent() def repl(parse_result): nonlocal indent @@ -536,7 +561,7 @@ class STAllocate(STNode): bytes_per_element = [] array_qualifiers = [] for array_name in parse_result.variable_names(): - ivar,_ = scoper.search_index_for_variable(index_hints,self._parent.tag(),\ + ivar,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ array_name) bytes_per_element.append(ivar["bytes_per_element"]) on_device = scoper.index_variable_is_on_device(ivar) @@ -555,7 +580,7 @@ class STAllocate(STNode): class STDeallocate(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): # TODO + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO """ :note: `wrap_in_if_def` can be deactivated if a higher level function embeds the outcome already in an `ifdef`. @@ -566,7 +591,7 @@ class STDeallocate(STNode): transformed = False array_qualifiers = [] for array_name in parse_result.variable_names(): - ivar,_ = scoper.search_index_for_variable(index_hints,self._parent.tag(),\ + ivar,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ array_name) on_device = scoper.index_variable_is_on_device(ivar) pinned = ["pinned"] in ivar["qualifiers"] @@ -584,13 +609,13 @@ class STDeallocate(STNode): class STMemcpy(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): # TODO + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO def repl_memcpy(parse_result): dest_name = parse_result.dest_name_f_str() src_name = parse_result.src_name_f_str() - dest_indexed_var,_ = scoper.search_index_for_variable(index_hints,self._parent.tag(),\ + dest_indexed_var,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ dest_name) - src_indexed_var,_ = scoper.search_index_for_variable(index_hints,self._parent.tag(),\ + src_indexed_var,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ src_name) dest_on_device = scoper.index_variable_is_on_device(dest_indexed_var) src_on_device = scoper.index_variable_is_on_device(src_indexed_var) @@ -613,7 +638,7 @@ class STCudaLibCall(STNode): :rtype: bool """ return self._has_cublas - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): global CUBLAS_VERSION global KEEP_CUDA_LIB_NAMES snippet = joined_statements @@ -624,9 +649,9 @@ class STCudaLibCall(STNode): def repl_memcpy(parse_result): dest_name = parse_result.dest_name_f_str() src_name = parse_result.src_name_f_str() - dest_indexed_var,_ = scoper.search_index_for_variable(index_hints,self._parent.tag(),\ + dest_indexed_var,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ dest_name) - src_indexed_var ,_ = scoper.search_index_for_variable(index_hints,self._parent.tag(),\ + src_indexed_var ,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ src_name) dest_on_device = scoper.index_variable_is_on_device(dest_indexed_var) src_on_device = scoper.index_variable_is_on_device(src_indexed_var) @@ -654,7 +679,7 @@ class STCudaKernelCall(STNode): """TODO(gpufort): Fix Translates a CUDA kernel call to a call to a subroutine interface. """ - def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index_hints=[]): + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): snippet = joined_statements for tokens,start,end in translator.cuf_kernel_call.scanString(snippet): parse_result = tokens[0] @@ -664,7 +689,7 @@ class STCudaKernelCall(STNode): max_rank = 0 for rvalue in translator.find_all(ttexpr,translator.TTRValue): # TODO lookup the subprogram first - ivar, discovered = scoper.search_index_for_variable(index_hints,self._parent.tag(),\ + ivar, discovered = scoper.search_index_for_variable(index,self._parent.tag(),\ rvalue.name()) if discovered: max_rank = max(max_rank,ivar["rank"]) diff --git a/python/translator/translator_f03.py.in b/python/translator/translator_f03.py.in index 697e8e15..401ee01c 100644 --- a/python/translator/translator_f03.py.in +++ b/python/translator/translator_f03.py.in @@ -1029,4 +1029,4 @@ complex_assignment.setParseAction(TTComplexAssignment) # statements return_statement.setParseAction(TTReturn) fortran_subroutine_call.setParseAction(TTSubroutineCall) -fortran_declaration.setParseAction(TTDeclaration) \ No newline at end of file +fortran_declaration.setParseAction(TTDeclaration) From 12e4faef185a00b6812c66290850127bbb585999 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 11 Oct 2021 11:58:28 -0400 Subject: [PATCH 03/67] Initial implementation of default clause behaviour *If no default clause is specified, present_or_copy is performed for all unmapped variables *If 'default(none)' is specified and not all variables are mapped, warning is posted (will add option to convert to error) *If 'default(present)' is specified, TODO: Take parent data directive into account to prevent some unnecessary runtime calls (if current behaviour is performance issue). --- python/scanner/openacc/scanner_tree_acc.py.in | 2 +- .../scanner_tree_acc2hipgpufortrt.py.in | 112 +++++++++++------- python/translator/translator_api.py.in | 4 +- python/translator/translator_directives.py.in | 73 ++++++------ python/translator/translator_f03.py.in | 4 +- python/translator/translator_parser.py.in | 4 +- 6 files changed, 114 insertions(+), 85 deletions(-) diff --git a/python/scanner/openacc/scanner_tree_acc.py.in b/python/scanner/openacc/scanner_tree_acc.py.in index d9310517..9f134140 100644 --- a/python/scanner/openacc/scanner_tree_acc.py.in +++ b/python/scanner/openacc/scanner_tree_acc.py.in @@ -116,4 +116,4 @@ class STAccLoopKernel(STAccDirective,STLoopKernel): checked_dialect = check_destination_dialect(\ DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) return ACC_LOOP_KERNEL_BACKENDS[checked_dialect](self).transform(\ - joined_lines,joined_statements,statements_fully_cover_lines,index) \ No newline at end of file + joined_lines,joined_statements,statements_fully_cover_lines,index) diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index d8273b6b..58fb8cec 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -23,7 +23,7 @@ HIP_GPUFORT_RT_ACC_UPDATE_HOST = "{indent}call gpufort_acc_update_host({var}{asy # update device HIP_GPUFORT_RT_ACC_UPDATE_DEVICE = "{indent}call gpufort_acc_update_device({var}{asyncr})\n" # present -HIP_GPUFORT_RT_ACC_PRESENT = "{indent}{dev_var} = gpufort_acc_present({var}{copy}{asyncr})\n" +HIP_GPUFORT_RT_ACC_PRESENT = "{indent}{dev_var} = gpufort_acc_present({var}{asyncr}{alloc})\n" # wait HIP_GPUFORT_RT_ACC_WAIT = "{indent}call gpufort_acc_wait({queue}{asyncr})\n" @@ -49,6 +49,19 @@ def dev_var_name(var): result = result.replace("$","_") return ACC_DEV_PREFIX + result + ACC_DEV_SUFFIX +def _intrnl_add_device_vars_to_decl_list(stnode,temp_vars): + # introduce the new variables + if len(temp_vars): + begin = stnode._parent.find_last(filter=lambda child : not child._ignore_in_s2s_translation and type(child) in [STUseStatement,STDeclaration,STPlaceHolder]) + indent = stnode.first_line_indent() + if begin is not None: + for var in temp_vars: + begin.add_to_epilog("{indent}type(c_ptr) :: {name}\n".format(indent=indent,name=var)) + else: + stnode.add_to_prolog("! TODO(gpufort): move declarations and use statement to appropriate place\n") + for var in temp_vars: + stnode.add_to_prolog("{indent}type(c_ptr) :: {name}\n".format(indent=indent,name=var)) + class Acc2HipGpufortRT(AccBackendBase): # clauses def _handle_async(self,queue=None,prefix=",asyncr="): @@ -86,26 +99,9 @@ class Acc2HipGpufortRT(AccBackendBase): for i,var_expr in enumerate(var_expressions): deviceptr = dev_var_name(var_names[i]) template = MAPPING_CLAUSE_2_TEMPLATE_MAP[clause.kind()] - result += template.format(indent=indent,var=var_expr,dev_var=deviceptr,asyncr=self._handle_async()) + result += template.format(indent=indent,var=var_expr,dev_var=deviceptr,asyncr=self._handle_async(),alloc="") temp_vars.add(deviceptr) return result, len(result), temp_vars - def _handle_default(self): - """ - Emits a acc_clause_present command for every variable in the list - """ - result = "" - temp_vars = set() - template = HIP_GPUFORT_RT_ACC_PRESENT - indent = self._stnode.first_line_indent() - for parse_result in translator.acc_clause_default.scanString(self._stnode.single_line_statement(),1): - value = str(parse_result[0][0]).lower() - #print(value) - if value == "present": - for var_expr in self._default_present_vars: - deviceptr = dev_var_name(var_expr) - temp_vars.add(deviceptr) - result += template.format(indent=indent,var=var_expr,dev_var=deviceptr) - return result, len(result), temp_vars def _handle_update(self): """ Emits a acc_clause_copy command for every variable in the list @@ -226,42 +222,72 @@ class Acc2HipGpufortRT(AccBackendBase): condition=condition, result=result.rstrip("\n")) # introduce the new variables - if len(all_temp_vars): - begin = stnode._parent.find_last(filter=lambda child : not child._ignore_in_s2s_translation and type(child) in [STUseStatement,STDeclaration,STPlaceHolder]) - indent = stnode.first_line_indent() - if begin is not None: - for var in all_temp_vars: - begin.add_to_epilog("{indent}type(c_ptr) :: {name}\n".format(indent=indent,name=var)) - else: - stnode.add_to_prolog("! TODO(gpufort): move declarations and use statement to appropriate place\n") - for var in all_temp_vars: - stnode.add_to_prolog("{indent}type(c_ptr) :: {name}\n".format(indent=indent,name=var)) + _intrnl_add_device_vars_to_decl_list(stnode,all_temp_vars) return result, len(result) class AccLoopKernel2HipGpufortRT(Acc2HipGpufortRT): + def _handle_default(self): + """ + Emits a acc_clause_present command for every variable in the list + """ + stloopkernel = self._stnode + ttloopkernel = stloopkernel.parse_result + unmapped_arrays = ttloopkernel.all_unmapped_arrays() + + result = "" + temp_vars = [] + "{indent}{dev_var} = gpufort_acc_present({var}{asyncr}{alloc})\n" + template = HIP_GPUFORT_RT_ACC_PRESENT + indent = stloopkernel.first_line_indent() + default_clauses = translator.acc_clause_default.searchString(stloopkernel.single_line_statement(),1) + if len(default_clauses): + value = str(default_clauses[0][0][0]).lower() + #print(value) + if value == "present": + for var_expr in unmapped_arrays: + deviceptr = dev_var_name(var_expr) + temp_vars.append(deviceptr) + result += template.format(indent=indent,var=var_expr,asyncr="",alloc="",dev_var=deviceptr) + elif value == "none" and len(unmapped_arrays): + utils.logging.log_warning(LOG_PREFIX,"AccLoopKernel2HipGpufortRT._handle_default","'default(none)' specified but no map for the following variables found: ".format(", ".join(unmapped_arrays))) + else: # default strategy: present_or_copy + for var_expr in unmapped_arrays: + deviceptr = dev_var_name(var_expr) + if not deviceptr in temp_vars: + temp_vars.append(deviceptr) + result += template.format(indent=indent,var=var_expr,asyncr="",alloc=",copy=.TRUE.",dev_var=deviceptr) + + return result, len(result), temp_vars def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): result = "" - stnode = self._stnode - indent = stnode.first_line_indent() - if stnode.is_parallel_loop_directive() or stnode.is_kernels_loop_directive(): - partial_result, _ = Acc2HipGpufortRT.transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index,handle_if=False) - result = partial_result - partial_result, _ = STLoopKernel.transform(stnode,joined_lines,joined_statements,statements_fully_cover_lines,index) - result += partial_result + stloopkernel = self._stnode + ttloopkernel = stloopkernel.parse_result + arrays_in_body = ttloopkernel.arrays_in_body() + indent = stloopkernel.first_line_indent() + if stloopkernel.is_parallel_loop_directive() or stloopkernel.is_kernels_loop_directive(): + result, _ = Acc2HipGpufortRT.transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index,handle_if=False) + partial_result, transformed, temp_vars = self._handle_default() + if transformed: + _intrnl_add_device_vars_to_decl_list(stloopkernel,temp_vars) + result = result.rstrip("\n") + "\n" + partial_result + partial_result, _ = STLoopKernel.transform(stloopkernel,joined_lines,joined_statements,statements_fully_cover_lines,index) + result = result.rstrip("\n") + "\n" + partial_result + + # handle default + self._handle_default() # add wait call if necessary queue = self._handle_async(None,"") if not len(queue): - result += "\n" + HIP_GPUFORT_RT_ACC_WAIT.format(indent=indent,queue=queue,asyncr="") - #if stnode.is_parallel_loop_directive() or stnode.is_kernels_loop_directive(): - if stnode.is_kernels_loop_directive(): - result += "\n"+HIP_GPUFORT_RT_ACC_EXIT_REGION.format(indent=indent) - + result = result.rstrip("\n") + "\n" + HIP_GPUFORT_RT_ACC_WAIT.format(indent=indent,queue=queue,asyncr="") + #if stloopkernel.is_parallel_loop_directive() or stloopkernel.is_kernels_loop_directive(): + if stloopkernel.is_kernels_loop_directive() or stloopkernel.is_parallel_loop_directive(): + result = result.rstrip("\n") + "\n" + HIP_GPUFORT_RT_ACC_EXIT_REGION.format(indent=indent) # wrap in ifdef if necessary condition = self._handle_if() if len(condition): result = "if ( {condition} ) then\n{result}\nelse\n {original}\n endif".format(\ - condition=condition, result=result.rstrip("\n"), original="".join(stnode._lines).rstrip("\n")) + condition=condition, result=result.rstrip("\n"), original="".join(stloopkernel._lines).rstrip("\n")) return result, len(result) -register_acc_backend("hip-gpufort-rt",Acc2HipGpufortRT,AccLoopKernel2HipGpufortRT,"gpufort_acc_runtime") \ No newline at end of file +register_acc_backend("hip-gpufort-rt",Acc2HipGpufortRT,AccLoopKernel2HipGpufortRT,"gpufort_acc_runtime") diff --git a/python/translator/translator_api.py.in b/python/translator/translator_api.py.in index cdf0ba4d..09989fd7 100644 --- a/python/translator/translator_api.py.in +++ b/python/translator/translator_api.py.in @@ -195,7 +195,7 @@ def parse_attributes(ttattributes): # TODO parsing and translation is similar but analysis differs between the different kernel # types. For example for CUF, the reduction vars must be detected by the parser (lhs scalars) # while they are specified with ACC,OMP. -def parse_loop_kernel(fortran_statements,scope=[]): +def parse_loop_kernel(fortran_statements,scope=None): """ Return a csnippet equivalent to the original Fortran code. """ @@ -206,7 +206,7 @@ def parse_loop_kernel(fortran_statements,scope=[]): ttloopkernel.scope = scope return ttloopkernel -def parse_procedure_body(fortran_statements,scope=[],result_name=""): +def parse_procedure_body(fortran_statements,scope=None,result_name=""): """ Parse a function/subroutine body. """ diff --git a/python/translator/translator_directives.py.in b/python/translator/translator_directives.py.in index 221fffdf..5856349f 100644 --- a/python/translator/translator_directives.py.in +++ b/python/translator/translator_directives.py.in @@ -33,25 +33,25 @@ def _intrnl_search_values_in_subtree(ttnode,search_filter,scope,min_rank=-1): tags.append(tag) return tags -def _intrnl_variables_in_subtree(ttnode,scope=[]): +def _intrnl_variables_in_subtree(ttnode,scope): """:return: all identifiers of LValue and RValues in the body.""" def search_filter(node): return isinstance(node, IValue) and\ type(node._value) in [TTDerivedTypeMember,TTIdentifier,TTFunctionCallOrTensorAccess] result = _intrnl_search_values_in_subtree(ttnode,search_filter,scope) return result -def _intrnl_arrays_in_subtree(ttnode,scope=[]): +def _intrnl_arrays_in_subtree(ttnode,scope): def search_filter(node): return isinstance(node,IValue) and\ type(node._value) is TTFunctionCallOrTensorAccess return _intrnl_search_values_in_subtree(ttnode,search_filter,scope,1) -def _intrnl_inout_arrays_in_subtree(ttnode,scope=[]): - def search_filter(node): +def _intrnl_inout_arrays_in_subtree(ttnode): + def search_filter(node,scope): return type(node) is TTLValue and\ type(node._value) is TTFunctionCallOrTensorAccess return _intrnl_search_values_in_subtree(ttnode,search_filter,scope,1) -def _intrnl_flag_tensors(ttcontainer,scope=[]): +def _intrnl_flag_tensors(ttcontainer,scope): """Clarify types of function calls / tensor access that are not members of a struct.""" for value in find_all(ttcontainer.body,IValue): if type(value._value) is TTFunctionCallOrTensorAccess: @@ -173,15 +173,15 @@ class IComputeConstruct(): def gang_team_reductions(self,converter=make_f_str): """ CUF,ACC: all scalars are private by default """ return {} - def variables_in_body(self,scope=[]): + def variables_in_body(self): return [] - def arrays_in_body(self,scope=[]): + def arrays_in_body(self): return [] - def inout_arrays_in_body(self,scope=[]): + def inout_arrays_in_body(self): return [] def local_scalars(self): return [] - def reduction_candidates(self,scope=[]): + def reduction_candidates(self): return [] def loop_vars(self): return [] @@ -208,7 +208,7 @@ class IComputeConstruct(): def self_condition(self): """ OMP,ACC: run on current CPU / device (and do not offload) """ return "" - def deviceptrs(self,scope=[]): + def deviceptrs(self,scope): return [] def create_alloc_vars(self): return [] @@ -232,6 +232,25 @@ class IComputeConstruct(): def detach_vars(self): """ only ACC """ return [] + def all_mapped_arrays(self): + """:return: Name of all mapped variables. """ + result = [] + result += self.deviceptrs() + result += self.create_alloc_vars() + result += self.no_create_vars() + result += self.present_vars() + result += self.delete_release_vars() + result += self.copy_map_to_from_vars() + result += self.copyin_map_to_vars() + result += self.copyout_map_from_vars() + result += self.attach_vars() + result += self.detach_vars() + return result + def all_unmapped_arrays(self): + """:return: Name of all unmapped array variables""" + mapped_vars = self.all_mapped_arrays() + arrays_in_body = self.arrays_in_body() + return [ var for var in arrays_in_body if not var in mapped_vars ] def present_by_default(self): """ only ACC parallel """ return True @@ -261,17 +280,11 @@ class TTLoopKernel(TTContainer,IComputeConstruct): return identifier_names[0:num_outer_loops_to_map] else: return identifier_names - def variables_in_body(self,scope=[]): - if len(scope): - self.scope = scope + def variables_in_body(self): return _intrnl_variables_in_subtree(self,self.scope) - def arrays_in_body(self,scope=[]): - if len(scope): - self.scope = scope + def arrays_in_body(self): return _intrnl_arrays_in_subtree(self,self.scope) - def inout_arrays_in_body(self,scope=[]): - if len(scope): - self.scope = scope + def inout_arrays_in_body(self): return _intrnl_inout_arrays_in_subtree(self,self.scope) def __local_scalars_and_reduction_candidates(self,scope): """ @@ -316,14 +329,10 @@ class TTLoopKernel(TTContainer,IComputeConstruct): if var.lower() in loop_vars: local_scalars.remove(var) return local_scalars, reduction_candidates - def local_scalars(self,scope=[]): - if len(scope): - self.scope = scope + def local_scalars(self): local_scalars,_ = self.__local_scalars_and_reduction_candidates(self.scope) return local_scalars - def reduction_candidates(self,scope=[]): - if len(scope): - self.scope = scope + def reduction_candidates(self): _,reduction_candidates = self.__local_scalars_and_reduction_candidates(self.scope) return reduction_candidates def problem_size(self): @@ -358,7 +367,7 @@ class TTLoopKernel(TTContainer,IComputeConstruct): return self.__parent_directive().if_condition() def self_condition(self): return self.__parent_directive().self_condition - def deviceptrs(self,scope=[]): + def deviceptrs(self): if self.__parent_directive().all_arrays_are_on_device(): return self.arrays_in_body(scope) else: @@ -542,20 +551,14 @@ class TTProcedureBody(TTContainer): self.body = tokens self.scope = [] self.result_name = "" - def variables_in_body(self,scope=[]): + def variables_in_body(self): """ :return: all identifiers of LValue and RValues in the body. """ - if len(scope): - self.scope = scope return _intrnl_variables_in_subtree(self,self.scope) - def arrays_in_body(self,scope=[]): - if len(scope): - self.scope = scope + def arrays_in_body(self): return _intrnl_arrays_in_subtree(self,self.scope) - def inout_arrays_in_body(self,scope=[]): - if len(scope): - self.scope = scope + def inout_arrays_in_body(self): return _intrnl_inout_arrays_in_subtree(self,self.scope) def c_str(self): """ diff --git a/python/translator/translator_f03.py.in b/python/translator/translator_f03.py.in index 401ee01c..e6dfd2ef 100644 --- a/python/translator/translator_f03.py.in +++ b/python/translator/translator_f03.py.in @@ -469,7 +469,7 @@ class TTPower(TTNode): self._base, self._exp = tokens def children(self): return [ self._base, self._exp ] - def gpufort_f_str(self,scope=[]): + def gpufort_f_str(self,scope=None): sign = "" base = self._base if type(self._base) is TTRValue: @@ -1029,4 +1029,4 @@ complex_assignment.setParseAction(TTComplexAssignment) # statements return_statement.setParseAction(TTReturn) fortran_subroutine_call.setParseAction(TTSubroutineCall) -fortran_declaration.setParseAction(TTDeclaration) +fortran_declaration.setParseAction(TTDeclaration) \ No newline at end of file diff --git a/python/translator/translator_parser.py.in b/python/translator/translator_parser.py.in index b133251f..2a871322 100644 --- a/python/translator/translator_parser.py.in +++ b/python/translator/translator_parser.py.in @@ -8,7 +8,7 @@ def _intrnl_preprocess_fortran_statement(statement): result = power.transformString(result) return result -def _intrnl_parse_fortran_code(statements,scope=[]): +def _intrnl_parse_fortran_code(statements,scope=None): """ :param list for @@ -213,4 +213,4 @@ def _intrnl_parse_fortran_code(statements,scope=[]): error_("unknown and not ignored") utils.logging.log_leave_function(LOG_PREFIX,"_intrnl_parse_fortran_code") - return ttree + return ttree \ No newline at end of file From fc316c18fd683eb2914261e90e2fd7fa9655ae39 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Tue, 12 Oct 2021 11:45:07 -0400 Subject: [PATCH 04/67] WiP on acc declare for programs/subprograms (unstable) --- python/fort2hip/fort2hip.py | 4 +- python/indexer/indexer.py | 2 +- python/scanner/openacc/scanner_tree_acc.py.in | 52 +++++++++++- .../scanner_tree_acc2hipgpufortrt.py.in | 82 +++++++++++++++---- python/scanner/scanner.py | 65 +++++---------- python/scanner/scanner_tree.py.in | 29 +++++-- python/translator/translator_parser.py.in | 2 +- 7 files changed, 162 insertions(+), 74 deletions(-) diff --git a/python/fort2hip/fort2hip.py b/python/fort2hip/fort2hip.py index 2ce3a9c8..52ecc9de 100644 --- a/python/fort2hip/fort2hip.py +++ b/python/fort2hip/fort2hip.py @@ -633,7 +633,7 @@ def select_(kernel): if not len(kernels_to_convert_to_hip): return False else: - condition1 = not kernel._ignore_in_s2s_translation + condition1 = not kernel.ignore_in_s2s_translation condition2 = \ kernels_to_convert_to_hip[0] == "*" or\ kernel.min_lineno() in kernels_to_convert_to_hip or\ @@ -739,4 +739,4 @@ def device_procedure_filter_(child): utils.logging.log_leave_function(LOG_PREFIX,"generate_hip_files") - return fortran_module_filepath, main_hip_filepath + return fortran_module_filepath, main_hip_filepath \ No newline at end of file diff --git a/python/indexer/indexer.py b/python/indexer/indexer.py index f6b21ed0..a0dd03c0 100644 --- a/python/indexer/indexer.py +++ b/python/indexer/indexer.py @@ -581,4 +581,4 @@ def load_gpufort_module_files(input_dirs,index): mod_index = _intrnl_read_json_file(os.path.join(input_dir, child)) index.append(mod_index) - utils.logging.log_leave_function(LOG_PREFIX,"load_gpufort_module_files") \ No newline at end of file + utils.logging.log_leave_function(LOG_PREFIX,"load_gpufort_module_files") diff --git a/python/scanner/openacc/scanner_tree_acc.py.in b/python/scanner/openacc/scanner_tree_acc.py.in index 9f134140..aea99bff 100644 --- a/python/scanner/openacc/scanner_tree_acc.py.in +++ b/python/scanner/openacc/scanner_tree_acc.py.in @@ -3,11 +3,24 @@ class AccBackendBase: def __init__(self,stnode): self._stnode = stnode + def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): + assert False, "not implemented" + +class AccPostprocessBackendBase: + def run(self,stree,index): + """:param stree: the full scanner tree""" + """:param staccdirectives: All acc directive tree nodes.""" + assert False, "not implemented" ACC_BACKENDS = {} ACC_LOOP_KERNEL_BACKENDS = {} +ACC_POSTPROCESS_BACKENDS = {} -def register_acc_backend(name,directive_generator_class,loop_kernel_generator_class,runtime_module_name): +def register_acc_backend(name,\ + directive_generator_class,\ + loop_kernel_generator_class,\ + posprocess_class,\ + runtime_module_name): global SUPPORTED_DESTINATION_DIALECTS global RUNTIME_MODULE_NAMES global ACC_BACKENDS @@ -18,6 +31,7 @@ def register_acc_backend(name,directive_generator_class,loop_kernel_generator_cl RUNTIME_MODULE_NAMES[name] = runtime_module_name ACC_BACKENDS[name] = directive_generator_class ACC_LOOP_KERNEL_BACKENDS[name] = loop_kernel_generator_class + ACC_POSTPROCESS_BACKENDS[name] = postprocess_class exec(open("{0}/openacc/scanner_tree_acc2omp.py.in".format(scanner_dir)).read()) exec(open("{0}/openacc/scanner_tree_acc2hipgpufortrt.py.in".format(scanner_dir)).read()) @@ -73,6 +87,11 @@ class STAccDirective(STDirective): return self.find_substring("acc parallel loop") def is_kernels_loop_directive(self): return self.find_substring("acc kernels loop") + def is_declare_directive(self): + return self.find_substring("acc declare") + def is_purely_declarative(self): + return self.is_declare_directive() or\ + self.find_substring("acc routine") def __str__(self): return """ {{ single_line_statement={single_line_statement}, @@ -117,3 +136,34 @@ class STAccLoopKernel(STAccDirective,STLoopKernel): DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) return ACC_LOOP_KERNEL_BACKENDS[checked_dialect](self).transform(\ joined_lines,joined_statements,statements_fully_cover_lines,index) + +def postprocess_tree_acc(stree,index,destination_dialect=""): + """ + Add use statements as well as handles plus their creation and destruction for certain + math libraries. + """ + global LOG_PREFIX + global DESTINATION_DIALECT + global RUNTIME_MODULE_NAMES + + utils.logging.log_enter_function(LOG_PREFIX,"postprocess_tree_acc") + + checked_dialect = check_destination_dialect(\ + DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) + def directive_filter(node): + return isinstance(node,STAccDirective) and\ + not node.ignore_in_s2s_translation + directives = stree.find_all(filter=directive_filter, recursively=True) + for directive in directives: + stnode = directive._parent.first_entry_in_decl_list() + # add acc use statements + if not stnode is None: + indent = stnode.first_line_indent() + acc_runtime_module_name = RUNTIME_MODULE_NAMES[destination_dialect] + if acc_runtime_module_name != None and len(acc_runtime_module_name): + stnode.add_to_prolog("{0}use {1}\n{0}use iso_c_binding\n".format(indent,acc_runtime_module_name)) + #if type(directive._parent + # call backend + ACC_POSTPROCESS_BACKENDS[checked_dialect]().run(stree,index) + + utils.logging.log_leave_function(LOG_PREFIX,"postprocess_tree_acc") diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index 58fb8cec..f7ca78ed 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -4,8 +4,8 @@ HIP_GPUFORT_RT_ACC_INIT = "{indent}call gpufort_acc_init()\n" HIP_GPUFORT_RT_ACC_SHUTDOWN = "{indent}call gpufort_acc_shutdown()\n" # regions -HIP_GPUFORT_RT_ACC_ENTER_REGION = "{indent}call gpufort_acc_enter_region()\n" -HIP_GPUFORT_RT_ACC_EXIT_REGION = "{indent}call gpufort_acc_exit_region()\n" +HIP_GPUFORT_RT_ACC_ENTER_REGION = "{indent}call gpufort_acc_enter_region({unstructured})\n" +HIP_GPUFORT_RT_ACC_EXIT_REGION = "{indent}call gpufort_acc_exit_region({unstructured})\n" # create HIP_GPUFORT_RT_ACC_CREATE = "{indent}{dev_var} = gpufort_acc_create({var})\n" # no_create @@ -52,15 +52,12 @@ def dev_var_name(var): def _intrnl_add_device_vars_to_decl_list(stnode,temp_vars): # introduce the new variables if len(temp_vars): - begin = stnode._parent.find_last(filter=lambda child : not child._ignore_in_s2s_translation and type(child) in [STUseStatement,STDeclaration,STPlaceHolder]) - indent = stnode.first_line_indent() - if begin is not None: - for var in temp_vars: - begin.add_to_epilog("{indent}type(c_ptr) :: {name}\n".format(indent=indent,name=var)) - else: - stnode.add_to_prolog("! TODO(gpufort): move declarations and use statement to appropriate place\n") - for var in temp_vars: - stnode.add_to_prolog("{indent}type(c_ptr) :: {name}\n".format(indent=indent,name=var)) + last_decl_list_node = stnode.g_in_decl_list() + indent = last_decl_list_node.first_line_indent() + if last_decl_list_node is None: + last_decl_list_node = stnode + for var in temp_vars: + last_decl_list_node.add_to_epilog("{indent}type(c_ptr) :: {name}\n".format(indent=indent,name=var)) class Acc2HipGpufortRT(AccBackendBase): # clauses @@ -179,13 +176,17 @@ class Acc2HipGpufortRT(AccBackendBase): ## Enter region commands must come first emit_enter_region = stnode.is_enter_directive() + if emit_enter_region: + unstructured="unstructured=.TRUE." + else: + unstructured="" emit_enter_region = emit_enter_region or stnode.is_data_directive() emit_enter_region = emit_enter_region or stnode.is_parallel_directive() emit_enter_region = emit_enter_region or stnode.is_parallel_loop_directive() emit_enter_region = emit_enter_region or stnode.is_kernels_directive() emit_enter_region = emit_enter_region or stnode.is_kernels_loop_directive() if emit_enter_region: - result += HIP_GPUFORT_RT_ACC_ENTER_REGION.format(indent=indent) + result += HIP_GPUFORT_RT_ACC_ENTER_REGION.format(indent=indent,unstructured=unstructured) ## Other directives/clauses # create @@ -207,11 +208,15 @@ class Acc2HipGpufortRT(AccBackendBase): ## Exit region commands must come last emit_exit_region = stnode.is_exit_directive() + if emit_exit_region: + unstructured="unstructured=.TRUE." + else: + unstructured="" emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("kernels") and not stnode.find_substring("loop")) emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("parallel") and not stnode.find_substring("loop")) emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("data")) if emit_exit_region: - result += HIP_GPUFORT_RT_ACC_EXIT_REGION.format(indent=indent) + result += HIP_GPUFORT_RT_ACC_EXIT_REGION.format(indent=indent,unstructured=unstructured) if stnode.is_shutdown_directive(): result += HIP_GPUFORT_RT_ACC_SHUTDOWN.format(indent=indent) @@ -222,7 +227,7 @@ class Acc2HipGpufortRT(AccBackendBase): condition=condition, result=result.rstrip("\n")) # introduce the new variables - _intrnl_add_device_vars_to_decl_list(stnode,all_temp_vars) + _intrnl_add_device_vars_to_decl_list(stnode._parent,all_temp_vars) return result, len(result) @@ -269,7 +274,7 @@ class AccLoopKernel2HipGpufortRT(Acc2HipGpufortRT): result, _ = Acc2HipGpufortRT.transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index,handle_if=False) partial_result, transformed, temp_vars = self._handle_default() if transformed: - _intrnl_add_device_vars_to_decl_list(stloopkernel,temp_vars) + _intrnl_add_device_vars_to_decl_list(stloopkernel._parent,temp_vars) result = result.rstrip("\n") + "\n" + partial_result partial_result, _ = STLoopKernel.transform(stloopkernel,joined_lines,joined_statements,statements_fully_cover_lines,index) result = result.rstrip("\n") + "\n" + partial_result @@ -290,4 +295,49 @@ class AccLoopKernel2HipGpufortRT(Acc2HipGpufortRT): condition=condition, result=result.rstrip("\n"), original="".join(stloopkernel._lines).rstrip("\n")) return result, len(result) -register_acc_backend("hip-gpufort-rt",Acc2HipGpufortRT,AccLoopKernel2HipGpufortRT,"gpufort_acc_runtime") +class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): + def run(self,stree,index): + """:param stree: the full scanner tree""" + """:param staccdirectives: All acc directive tree nodes.""" + def directive_filter(node): + return isinstance(node,STAccDirective) and\ + node.is_declare_directive() + fortran_constructs = stree.find_all(filter=lambda x: isinstance(node,(STProgram,STProcedure)), recursively=True) + for stnode in fortran_constructs: + ivars=[] + last_decl_list_node = stnode.last_entry_in_decl_list() + indent = last_decl_list_node.first_line_indent() + # todo find return statement or end of function + if type(stnode) == STProgram: + irecord = next((ientry for ientry in index if ientry["name"]==stnode.name),None) + assert irecord != None + ivars=irecord["variables"] + elif type(stnode) == STProcedure: + parent_tag = stnode._parent.tag() + irecord = scoper.search_index_for_subprogram(index,parent_tag,stnode.name) + ivars=irecord["variables"] + acc_present_calls = "" + temp_vars = [] + for ivar in ivars: + if ivar["declare_on_target"]=="alloc": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=var_expr,asyncr="",alloc="create",dev_var=deviceptr) + temp_vars.append(dev_var_name(ivar["name"])) + if ivar["declare_on_target"]=="to": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=var_expr,asyncr="",alloc="copyin",dev_var=deviceptr) + temp_vars.append(dev_var_name(ivar["name"])) + # first add the device variable declarations + _intrnl_add_device_vars_to_decl_list(stnode,temp_vars) + if len(epilog): + last_decl_list_node.add_to_epilog(HIP_GPUFORT_RT_ACC_ENTER_REGION.format(\ + indent=indent,unstructured="unstructured=.TRUE.") + last_decl_list_node.add_to_epilog(epilog) + for stendorreturn in stnode.return_or_end_statements(): + stendorreturn.add_to_prolog(HIP_GPUFORT_RT_ACC_EXIT_REGION.format(\ + indent=indent,unstructured="unstructured=.TRUE.") +register_acc_backend("hip-gpufort-rt",\ + Acc2HipGpufortRT,\ + AccLoopKernel2HipGpufortRT,\ + Acc2HipGpufortRTPostprocess,\ + "gpufort_acc_runtime") diff --git a/python/scanner/scanner.py b/python/scanner/scanner.py index fb564936..90059039 100644 --- a/python/scanner/scanner.py +++ b/python/scanner/scanner.py @@ -45,29 +45,6 @@ def check_destination_dialect(destination_dialect): utils.logging.log_error(LOG_PREFIX,"check_destination_dialect",msg) sys.exit(SCANNER_ERROR_CODE) -def _intrnl_postprocess_acc(stree): - """ - Add use statements as well as handles plus their creation and destruction for certain - math libraries. - """ - global LOG_PREFIX - global DESTINATION_DIALECT - global RUNTIME_MODULE_NAMES - - utils.logging.log_enter_function(LOG_PREFIX,"_intrnl_postprocess_acc") - - directives = stree.find_all(filter=lambda node: isinstance(node,STAccDirective), recursively=True) - for directive in directives: - stnode = directive._parent.find_first(filter=lambda child : not child._ignore_in_s2s_translation and type(child) in [STUseStatement,STDeclaration,STPlaceHolder]) - # add acc use statements - if not stnode is None: - indent = stnode.first_line_indent() - acc_runtime_module_name = RUNTIME_MODULE_NAMES[DESTINATION_DIALECT] - if acc_runtime_module_name != None and len(acc_runtime_module_name): - stnode.add_to_prolog("{0}use {1}\n{0}use iso_c_binding\n".format(indent,acc_runtime_module_name)) - #if type(directive._parent - utils.logging.log_leave_function(LOG_PREFIX,"_intrnl_postprocess_acc") - def _intrnl_postprocess_cuf(stree): """ Add use statements as well as handles plus their creation and destruction for certain @@ -169,7 +146,7 @@ def Module_visit(tokens): nonlocal current_statement_no log_detection_("module") new = STModule(tokens[0],current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled descend_(new) def Program_visit(tokens): nonlocal translation_enabled @@ -178,7 +155,7 @@ def Program_visit(tokens): nonlocal current_statement_no log_detection_("program") new = STProgram(tokens[0],current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled descend_(new) def Function_visit(tokens): nonlocal translation_enabled @@ -189,7 +166,7 @@ def Function_visit(tokens): log_detection_("function") new = STProcedure(tokens[1],"function",\ current_node,current_linemap,current_statement_no,index) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled keep_recording = new.keep_recording() descend_(new) def Subroutine_visit(tokens): @@ -201,7 +178,7 @@ def Subroutine_visit(tokens): log_detection_("subroutine") new = STProcedure(tokens[1],"subroutine",\ current_node,current_linemap,current_statement_no,index) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled keep_recording = new.keep_recording() descend_(new) def End(): @@ -244,7 +221,7 @@ def DoLoop_visit(): log_detection_("do loop") if in_kernels_acc_region_and_not_recording(): new = STAccLoopKernel(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled new._do_loop_ctr_memorised=do_loop_ctr descend_(new) keep_recording = True @@ -272,7 +249,7 @@ def Declaration(): nonlocal current_statement_no log_detection_("declaration") new = STDeclaration(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def Attributes(tokens): nonlocal translation_enabled @@ -281,7 +258,7 @@ def Attributes(tokens): nonlocal current_statement_no log_detection_("attributes statement") new = STAttributes(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled current_node.append(new) def UseStatement(tokens): nonlocal current_node @@ -289,7 +266,7 @@ def UseStatement(tokens): nonlocal current_statement_no log_detection_("use statement") new = STUseStatement(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled new.name = translator.make_f_str(tokens[1]) # just get the name, ignore specific includes append_if_not_recording_(new) def PlaceHolder(): @@ -299,7 +276,7 @@ def PlaceHolder(): nonlocal current_statement_no log_detection_("placeholder") new = STPlaceHolder(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def NonZeroCheck(tokens): nonlocal translation_enabled @@ -308,7 +285,7 @@ def NonZeroCheck(tokens): nonlocal current_statement_no log_detection_("non-zero check") new = STNonZeroCheck(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def Allocated(tokens): nonlocal current_node @@ -317,7 +294,7 @@ def Allocated(tokens): nonlocal current_statement_no log_detection_("allocated statement") new = STAllocated(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def Allocate(tokens): nonlocal translation_enabled @@ -326,7 +303,7 @@ def Allocate(tokens): nonlocal current_statement_no log_detection_("allocate statement") new = STAllocate(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def Deallocate(tokens): nonlocal translation_enabled @@ -336,7 +313,7 @@ def Deallocate(tokens): log_detection_("deallocate statement") # TODO filter variable, replace with hipFree new = STDeallocate(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def Memcpy(tokens): nonlocal translation_enabled @@ -345,7 +322,7 @@ def Memcpy(tokens): nonlocal current_statement_no log_detection_("memcpy") new = STMemcpy(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def CudaLibCall(tokens): #TODO scan for cudaMemcpy calls @@ -358,7 +335,7 @@ def CudaLibCall(tokens): cudaApi, args = tokens if not type(current_node) in [STCudaLibCall,STCudaKernelCall]: new = STCudaLibCall(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled new.cudaApi = cudaApi #print("finishes_on_first_line={}".format(finishes_on_first_line)) assert type(new._parent) in [STModule,STProcedure,STProgram], type(new._parent) @@ -373,7 +350,7 @@ def CudaKernelCall(tokens): kernel_name, kernel_launch_args, args = tokens assert type(current_node) in [STModule,STProcedure,STProgram], "type is: "+str(type(current_node)) new = STCudaKernelCall(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def AccDirective(): nonlocal translation_enabled @@ -385,7 +362,7 @@ def AccDirective(): nonlocal directive_no log_detection_("OpenACC directive") new = STAccDirective(current_node,current_linemap,current_statement_no,directive_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled directive_no += 1 # if end directive ascend if new.is_end_directive() and\ @@ -397,7 +374,7 @@ def AccDirective(): (not new.is_end_directive() and new.is_parallel_directive()): new = STAccLoopKernel(current_node,current_linemap,current_statement_no,directive_no) new.kind = "acc-compute-construct" - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled new._do_loop_ctr_memorised=do_loop_ctr descend_(new) # descend also appends keep_recording = True @@ -418,7 +395,7 @@ def CufLoopKernel(): log_detection_("CUDA Fortran loop kernel directive") new = STCufLoopKernel(current_node,current_linemap,current_statement_no,directive_no) new.kind = "cuf-kernel-do" - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled new._do_loop_ctr_memorised=do_loop_ctr directive_no += 1 descend_(new) @@ -435,7 +412,7 @@ def Assignment(tokens): lvalue = translator.find_first(parse_result,translator.TTLValue) if not lvalue is None and lvalue.has_matrix_range_args(): new = STAccLoopKernel(current_node,current_linemap,current_statement_no) - new._ignore_in_s2s_translation = not translation_enabled + new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def GpufortControl(): nonlocal current_statement @@ -633,5 +610,5 @@ def is_accelerated(child): if "cuf" in SOURCE_DIALECTS: _intrnl_postprocess_cuf(stree) if "acc" in SOURCE_DIALECTS: - _intrnl_postprocess_acc(stree) + postprocess_tree_acc(stree,index) utils.logging.log_leave_function(LOG_PREFIX,"postprocess") diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index 97268ac2..b60a3310 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -17,15 +17,25 @@ def flatten_list(items): else: yield x -# Object representation +def decl_list_entry_filter(stnode): + """:return: If the scanner tree node is member of the declaration list.""" + return type(stnode) in [STUseStatement,STDeclaration,STPlaceHolder] -# We create an object tree because we want to preserve scope. - -class Tagged: +class Tagged: # TODO rename + def first_entry_in_decl_list(self): + result = self._parent.find_first(filter=decl_list_entry_filter) + if result == None: + return self + return result + def last_entry_in_decl_list(self): + result = self._parent.find_last(filter=decl_list_entry_filter) + if result == None: + return self + return result + def return_or_end_statements(self): + return self._parent.find_all(filter=lambda stnode: type(stnode) == STEndOrReturn) def tag(self): - """ - Construct a tag that can be used to search the index. - """ + """Construct a tag that can be used to search the index.""" result = self.name.lower() def recursive_parent_lookup(curr): nonlocal result @@ -35,6 +45,7 @@ class Tagged: recursive_parent_lookup(self._parent) return result +# scanner tree class STNode: def __init__(self,parent,first_linemap,first_statement_index=0): self.name = None @@ -46,7 +57,7 @@ class STNode: self._last_statement_index = first_statement_index # inclusive self._children = [] self._parent = parent - self._ignore_in_s2s_translation = False + self.ignore_in_s2s_translation = False def __get_linemap_content(self,key,first_linemap_first_elem=0,last_linemap_last_elem=-1): """Collects entries for the given key from all linemaps associated with this node.""" @@ -246,7 +257,7 @@ class STNode: :note: When appending an epilog, it is assumed that the modified statement is the last in the linemap/line and that this statement is only modified once. """ - if not self._ignore_in_s2s_translation: + if not self.ignore_in_s2s_translation: have_first_in_first_linemap = self._first_statement_index == 0 have_last_in_last_linemap = self._last_statement_index == -1 or\ self._last_statement_index == len(self._linemaps[-1]["statements"])-1 diff --git a/python/translator/translator_parser.py.in b/python/translator/translator_parser.py.in index 2a871322..027d4aa7 100644 --- a/python/translator/translator_parser.py.in +++ b/python/translator/translator_parser.py.in @@ -213,4 +213,4 @@ def _intrnl_parse_fortran_code(statements,scope=None): error_("unknown and not ignored") utils.logging.log_leave_function(LOG_PREFIX,"_intrnl_parse_fortran_code") - return ttree \ No newline at end of file + return ttree From 5845a4fa5525bb024b2f1a032f32ba865db3eab5 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 13 Oct 2021 10:57:19 -0400 Subject: [PATCH 05/67] WiP: More drafting on declare (unstable) --- .../scanner_tree_acc2hipgpufortrt.py.in | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index f7ca78ed..015fd084 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -304,32 +304,53 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): node.is_declare_directive() fortran_constructs = stree.find_all(filter=lambda x: isinstance(node,(STProgram,STProcedure)), recursively=True) for stnode in fortran_constructs: - ivars=[] last_decl_list_node = stnode.last_entry_in_decl_list() + allocates = [] # look up STAllocate + deallocates = [] # look up STDeallocate indent = last_decl_list_node.first_line_indent() # todo find return statement or end of function + scope = scoper.create_scope(index,stnode.tag()) + scope_vars = scope["variables"] if type(stnode) == STProgram: irecord = next((ientry for ientry in index if ientry["name"]==stnode.name),None) - assert irecord != None - ivars=irecord["variables"] - elif type(stnode) == STProcedure: + dummy_arg_names = [] + else: parent_tag = stnode._parent.tag() irecord = scoper.search_index_for_subprogram(index,parent_tag,stnode.name) - ivars=irecord["variables"] - acc_present_calls = "" + dummy_arg_names += irecord["dummy_args"] + local_var_names = [ivar["name"] for ivar in irecord["variables"] if ivar["name"] not in dummy_arg_names] + # + acc_present_calls = "" temp_vars = [] - for ivar in ivars: - if ivar["declare_on_target"]=="alloc": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=var_expr,asyncr="",alloc="create",dev_var=deviceptr) - temp_vars.append(dev_var_name(ivar["name"])) - if ivar["declare_on_target"]=="to": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=var_expr,asyncr="",alloc="copyin",dev_var=deviceptr) - temp_vars.append(dev_var_name(ivar["name"])) + for ivar in scope_vars: + is_local_var = ivar["name"] in local_var_names + is_arg = ivar["name"] in dummy_arg_names + is_used_module_var = not is_local_var and not is_arg + allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ + "pointer" in ivar["qualifiers"] + if is_arg or (is_local_var and not allocatable_or_pointer): + # find return and end, emit 1 new (un)structured region for all + if ivar["declare_on_target"]=="alloc": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=var_expr,asyncr="",alloc="create",dev_var=deviceptr) + temp_vars.append(dev_var_name(ivar["name"])) + if ivar["declare_on_target"]=="to": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=var_expr,asyncr="",alloc="copyin",dev_var=deviceptr) + temp_vars.append(dev_var_name(ivar["name"])) + elif is_local_var and is_local_var allocatable_or_pointer: + # find return and end, emit 1 new (un)structured region for all + # find allocate, deallocate with var as arg and write to epilog / prolog + pass + elif is_module_var and not is_local_var allocatable_or_pointer: + # ensure it is present in implicit region 0 / static data + pass + elif is_module_var and is_local_var allocatable_or_pointer: + # find allocate, deallocate and write to epilog / prolog -> append to implicit region 0 / static data + pass # first add the device variable declarations _intrnl_add_device_vars_to_decl_list(stnode,temp_vars) - if len(epilog): + if len(acc_present_calls): last_decl_list_node.add_to_epilog(HIP_GPUFORT_RT_ACC_ENTER_REGION.format(\ indent=indent,unstructured="unstructured=.TRUE.") last_decl_list_node.add_to_epilog(epilog) From 8360355ea856359da4ecf5c7062707cda23514e2 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 13 Oct 2021 11:53:49 -0400 Subject: [PATCH 06/67] WiP towards declare (unstable). --- examples/openacc/vector-add-declare/Makefile | 22 ++++++++++ .../openacc/vector-add-declare/options.py.in | 11 +++++ .../openacc/vector-add-declare/vector-add.f90 | 34 +++++++++++++++ python/scanner/openacc/scanner_tree_acc.py.in | 13 +++--- .../openacc/scanner_tree_acc2hipgccrt.py.in | 2 +- .../scanner_tree_acc2hipgpufortrt.py.in | 43 +++++++++---------- .../openacc/scanner_tree_acc2omp.py.in | 2 +- python/scanner/scanner_tree.py.in | 4 +- 8 files changed, 100 insertions(+), 31 deletions(-) create mode 100644 examples/openacc/vector-add-declare/Makefile create mode 100644 examples/openacc/vector-add-declare/options.py.in create mode 100644 examples/openacc/vector-add-declare/vector-add.f90 diff --git a/examples/openacc/vector-add-declare/Makefile b/examples/openacc/vector-add-declare/Makefile new file mode 100644 index 00000000..9b05d069 --- /dev/null +++ b/examples/openacc/vector-add-declare/Makefile @@ -0,0 +1,22 @@ +include ../rules.mk + +TEST_SRC = vector-add.f90 +TEST_NAME = $(TEST_SRC:.f90=) + +.PHONY: build.hip build.omp codegen.hip codegen.omp clean + +codegen.hip: + gpufort -w $(TEST_SRC) -E hip-gpufort-rt --config-file options.py.in +codegen.hip-gcc: + gpufort -w $(TEST_SRC) -E hip-gcc-rt --config-file options.py.in +codegen.omp: + gpufort -w $(TEST_SRC) -E omp --config-file options.py.in +build.hip: codegen.hip + $(HIPCC) -c $(TEST_NAME).kernels.hip.cpp + $(HIPFC) -c $(TEST_NAME).kernels.f08 $(CFLAGS) + $(HIPFC) $(TEST_NAME).hipified.f90 -o $(TEST_NAME) $(TEST_NAME).kernels.o $(TEST_NAME).kernels.hip.o $(CFLAGS) $(ACC_INC) $(ACC_LIB) +build.omp: codegen.omp + $(OMPFC) -ffree-form $(OMPFC_CFLAGS) -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa -march=gfx906 $(TEST_NAME).hipified.f90 -o $(TEST_NAME) + +clean: + rm -rf *.hipified.f90 *kernels.f08 *kernels.hip.cpp *.o *.mod gpufort*.h $(TEST_NAME) log/ diff --git a/examples/openacc/vector-add-declare/options.py.in b/examples/openacc/vector-add-declare/options.py.in new file mode 100644 index 00000000..7a5c9fad --- /dev/null +++ b/examples/openacc/vector-add-declare/options.py.in @@ -0,0 +1,11 @@ +scanner.DESTINATION_DIALECT="hip-gpufort-rt" +scanner.LOOP_KERNEL_DEFAULT_LAUNCHER="auto" + +fort2hip.CLANG_FORMAT_STYLE="\"{BasedOnStyle: llvm, ColumnLimit: 140, BinPackArguments: false, BinPackParameters: false}\"" + +LOG_DIR="log" +#LOG_LEVEL="debug" + +#utils.logging.VERBOSE = True + +ENABLE_PROFILING=False diff --git a/examples/openacc/vector-add-declare/vector-add.f90 b/examples/openacc/vector-add-declare/vector-add.f90 new file mode 100644 index 00000000..6c2c6ae2 --- /dev/null +++ b/examples/openacc/vector-add-declare/vector-add.f90 @@ -0,0 +1,34 @@ +program main + ! begin of program + + implicit none + integer, parameter :: N = 1000 + integer :: i + integer(4) :: x(N), y(N), y_exact(N) + !$acc declare create(x,y) + + do i = 1, N + y_exact(i) = 3 + end do + + !$acc parallel loop + do i = 1, N + x(i) = 1 + y(i) = 2 + end do + + !$acc parallel loop + do i = 1, N + y(i) = x(i) + y(i) + end do + + !$acc update host(x,y) + + do i = 1, N + if ( y_exact(i) .ne.& + y(i) ) ERROR STOP "GPU and CPU result do not match" + end do + + print *, "PASSED" + +end program diff --git a/python/scanner/openacc/scanner_tree_acc.py.in b/python/scanner/openacc/scanner_tree_acc.py.in index aea99bff..4b23a622 100644 --- a/python/scanner/openacc/scanner_tree_acc.py.in +++ b/python/scanner/openacc/scanner_tree_acc.py.in @@ -19,7 +19,7 @@ ACC_POSTPROCESS_BACKENDS = {} def register_acc_backend(name,\ directive_generator_class,\ loop_kernel_generator_class,\ - posprocess_class,\ + postprocess_class,\ runtime_module_name): global SUPPORTED_DESTINATION_DIALECTS global RUNTIME_MODULE_NAMES @@ -120,9 +120,12 @@ class STAccDirective(STDirective): ).strip().replace("\n","") __repr__ = __str__ def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): - checked_dialect = check_destination_dialect(DESTINATION_DIALECT) - return ACC_BACKENDS[checked_dialect](self).transform(\ - joined_lines,joined_statements,statements_fully_cover_lines,index) + if self.is_purely_declarative(): + return STNode.transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index) + else: + checked_dialect = check_destination_dialect(DESTINATION_DIALECT) + return ACC_BACKENDS[checked_dialect](self).transform(\ + joined_lines,joined_statements,statements_fully_cover_lines,index) class STAccLoopKernel(STAccDirective,STLoopKernel): def __init__(self,parent,first_linemap,first_linemap_first_statement,directive_no): STAccDirective.__init__(self,parent,first_linemap,first_linemap_first_statement,directive_no) @@ -159,7 +162,7 @@ def postprocess_tree_acc(stree,index,destination_dialect=""): # add acc use statements if not stnode is None: indent = stnode.first_line_indent() - acc_runtime_module_name = RUNTIME_MODULE_NAMES[destination_dialect] + acc_runtime_module_name = RUNTIME_MODULE_NAMES[checked_dialect] if acc_runtime_module_name != None and len(acc_runtime_module_name): stnode.add_to_prolog("{0}use {1}\n{0}use iso_c_binding\n".format(indent,acc_runtime_module_name)) #if type(directive._parent diff --git a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in index 55eaecbb..d5d9b211 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in @@ -175,4 +175,4 @@ class AccLoopKernel2HipGccRT(Acc2HipGccRT): condition=condition,result=result.rstrip("\n"),original="".join(stnode._lines).rstrip("\n")) return result, len(result) -register_acc_backend("hip-gcc-rt",Acc2HipGccRT,AccLoopKernel2HipGccRT,"openacc_gomp") \ No newline at end of file +register_acc_backend("hip-gcc-rt",Acc2HipGccRT,AccLoopKernel2HipGccRT,None,"openacc_gomp") diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index 015fd084..cf3faf5a 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -52,7 +52,7 @@ def dev_var_name(var): def _intrnl_add_device_vars_to_decl_list(stnode,temp_vars): # introduce the new variables if len(temp_vars): - last_decl_list_node = stnode.g_in_decl_list() + last_decl_list_node = stnode.last_entry_in_decl_list() indent = last_decl_list_node.first_line_indent() if last_decl_list_node is None: last_decl_list_node = stnode @@ -287,7 +287,7 @@ class AccLoopKernel2HipGpufortRT(Acc2HipGpufortRT): result = result.rstrip("\n") + "\n" + HIP_GPUFORT_RT_ACC_WAIT.format(indent=indent,queue=queue,asyncr="") #if stloopkernel.is_parallel_loop_directive() or stloopkernel.is_kernels_loop_directive(): if stloopkernel.is_kernels_loop_directive() or stloopkernel.is_parallel_loop_directive(): - result = result.rstrip("\n") + "\n" + HIP_GPUFORT_RT_ACC_EXIT_REGION.format(indent=indent) + result = result.rstrip("\n") + "\n" + HIP_GPUFORT_RT_ACC_EXIT_REGION.format(indent=indent,unstructured="") # wrap in ifdef if necessary condition = self._handle_if() if len(condition): @@ -299,15 +299,12 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): def run(self,stree,index): """:param stree: the full scanner tree""" """:param staccdirectives: All acc directive tree nodes.""" - def directive_filter(node): - return isinstance(node,STAccDirective) and\ - node.is_declare_directive() - fortran_constructs = stree.find_all(filter=lambda x: isinstance(node,(STProgram,STProcedure)), recursively=True) + fortran_constructs = stree.find_all(filter=lambda node: isinstance(node,(STProgram,STProcedure)), recursively=True) for stnode in fortran_constructs: last_decl_list_node = stnode.last_entry_in_decl_list() allocates = [] # look up STAllocate deallocates = [] # look up STDeallocate - indent = last_decl_list_node.first_line_indent() + indent = last_decl_list_node.first_line_indent() # todo find return statement or end of function scope = scoper.create_scope(index,stnode.tag()) scope_vars = scope["variables"] @@ -319,44 +316,46 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): irecord = scoper.search_index_for_subprogram(index,parent_tag,stnode.name) dummy_arg_names += irecord["dummy_args"] local_var_names = [ivar["name"] for ivar in irecord["variables"] if ivar["name"] not in dummy_arg_names] - # + # TODO also process type members acc_present_calls = "" temp_vars = [] for ivar in scope_vars: - is_local_var = ivar["name"] in local_var_names - is_arg = ivar["name"] in dummy_arg_names + host_var = ivar["name"] + dev_var = dev_var_name(host_var) + is_local_var = host_var in local_var_names + is_arg = host_var in dummy_arg_names is_used_module_var = not is_local_var and not is_arg - allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ + is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ "pointer" in ivar["qualifiers"] - if is_arg or (is_local_var and not allocatable_or_pointer): + if is_arg or (is_local_var and not is_allocatable_or_pointer): # find return and end, emit 1 new (un)structured region for all if ivar["declare_on_target"]=="alloc": acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=var_expr,asyncr="",alloc="create",dev_var=deviceptr) - temp_vars.append(dev_var_name(ivar["name"])) + indent=indent,var=host_var,asyncr="",alloc=",create=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) if ivar["declare_on_target"]=="to": acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=var_expr,asyncr="",alloc="copyin",dev_var=deviceptr) - temp_vars.append(dev_var_name(ivar["name"])) - elif is_local_var and is_local_var allocatable_or_pointer: + indent=indent,var=host_var,asyncr="",alloc=",copyin=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) + elif is_local_var and is_allocatable_or_pointer: # find return and end, emit 1 new (un)structured region for all # find allocate, deallocate with var as arg and write to epilog / prolog pass - elif is_module_var and not is_local_var allocatable_or_pointer: + elif is_module_var and not is_allocatable_or_pointer: # ensure it is present in implicit region 0 / static data pass - elif is_module_var and is_local_var allocatable_or_pointer: + elif is_module_var and is_allocatable_or_pointer: # find allocate, deallocate and write to epilog / prolog -> append to implicit region 0 / static data pass # first add the device variable declarations _intrnl_add_device_vars_to_decl_list(stnode,temp_vars) if len(acc_present_calls): last_decl_list_node.add_to_epilog(HIP_GPUFORT_RT_ACC_ENTER_REGION.format(\ - indent=indent,unstructured="unstructured=.TRUE.") - last_decl_list_node.add_to_epilog(epilog) + indent=indent,unstructured="unstructured=.TRUE.")) + last_decl_list_node.add_to_epilog(acc_present_calls) for stendorreturn in stnode.return_or_end_statements(): stendorreturn.add_to_prolog(HIP_GPUFORT_RT_ACC_EXIT_REGION.format(\ - indent=indent,unstructured="unstructured=.TRUE.") + indent=indent,unstructured="unstructured=.TRUE.")) register_acc_backend("hip-gpufort-rt",\ Acc2HipGpufortRT,\ AccLoopKernel2HipGpufortRT,\ diff --git a/python/scanner/openacc/scanner_tree_acc2omp.py.in b/python/scanner/openacc/scanner_tree_acc2omp.py.in index 981f1639..001096a1 100644 --- a/python/scanner/openacc/scanner_tree_acc2omp.py.in +++ b/python/scanner/openacc/scanner_tree_acc2omp.py.in @@ -32,4 +32,4 @@ class AccLoopKernel2Omp(AccBackendBase): utils.logging.log_exception(LOG_PREFIX,"AccLoopKernel2Omp.transform","failed to convert kernel "+str(snippet)) sys.exit(2) -register_acc_backend("omp",Acc2Omp,AccLoopKernel2Omp,None) \ No newline at end of file +register_acc_backend("omp",Acc2Omp,AccLoopKernel2Omp,None,None) diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index b60a3310..02754020 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -23,12 +23,12 @@ def decl_list_entry_filter(stnode): class Tagged: # TODO rename def first_entry_in_decl_list(self): - result = self._parent.find_first(filter=decl_list_entry_filter) + result = self.find_first(filter=decl_list_entry_filter) if result == None: return self return result def last_entry_in_decl_list(self): - result = self._parent.find_last(filter=decl_list_entry_filter) + result = self.find_last(filter=decl_list_entry_filter) if result == None: return self return result From 3e15474978867e85eb3f6ceaeab75bc5803e8a0a Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 14 Oct 2021 08:37:59 -0400 Subject: [PATCH 07/67] WiP towards acc declare in subroutines (unstable) * vector-add-declare/vector-add.f90 example with declare in program seems to work correctly * Some more care required for enabling declare in subroutines --- examples/openacc/vector-add-declare/Makefile | 26 ++-- .../openacc/vector-add-declare/options.py.in | 11 -- .../vector-add-procedures.f90 | 46 ++++++ .../openacc/vector-add-declare/vector-add.f90 | 2 +- examples/openacc/vector-add/vector-add.f90 | 2 +- python/grammar/grammar_acc.py.in | 2 +- python/scanner/openacc/scanner_tree_acc.py.in | 21 ++- .../openacc/scanner_tree_acc2hipgccrt.py.in | 16 +-- .../scanner_tree_acc2hipgpufortrt.py.in | 136 ++++++++---------- python/scanner/scanner.py | 1 - python/scanner/scanner_tree.py.in | 2 +- python/translator/translator_acc.py.in | 8 +- 12 files changed, 140 insertions(+), 133 deletions(-) delete mode 100644 examples/openacc/vector-add-declare/options.py.in create mode 100644 examples/openacc/vector-add-declare/vector-add-procedures.f90 diff --git a/examples/openacc/vector-add-declare/Makefile b/examples/openacc/vector-add-declare/Makefile index 9b05d069..fade8e0a 100644 --- a/examples/openacc/vector-add-declare/Makefile +++ b/examples/openacc/vector-add-declare/Makefile @@ -1,22 +1,16 @@ include ../rules.mk -TEST_SRC = vector-add.f90 -TEST_NAME = $(TEST_SRC:.f90=) +TEST_SRC = vector-add.f90 vector-add-procedures.f90 +TEST_NAME = $(TEST_SRC:.f90=) +TEST_CONV_SRC = $(TEST_SRC:.f90=.f90-gpufort.f08) -.PHONY: build.hip build.omp codegen.hip codegen.omp clean +.PHONY: clean -codegen.hip: - gpufort -w $(TEST_SRC) -E hip-gpufort-rt --config-file options.py.in -codegen.hip-gcc: - gpufort -w $(TEST_SRC) -E hip-gcc-rt --config-file options.py.in -codegen.omp: - gpufort -w $(TEST_SRC) -E omp --config-file options.py.in -build.hip: codegen.hip - $(HIPCC) -c $(TEST_NAME).kernels.hip.cpp - $(HIPFC) -c $(TEST_NAME).kernels.f08 $(CFLAGS) - $(HIPFC) $(TEST_NAME).hipified.f90 -o $(TEST_NAME) $(TEST_NAME).kernels.o $(TEST_NAME).kernels.hip.o $(CFLAGS) $(ACC_INC) $(ACC_LIB) -build.omp: codegen.omp - $(OMPFC) -ffree-form $(OMPFC_CFLAGS) -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa -march=gfx906 $(TEST_NAME).hipified.f90 -o $(TEST_NAME) +$(TEST_NAME): %: %.f90-gpufort.f08 + $(HIPCC) $(HIPCC_CFLAGS) -c $@-fort2hip.hip.cpp + $(HIPFC) $^ -o $@ $@.f90-fort2hip.hip.o $(CFLAGS) +$(TEST_CONV_SRC): %-gpufort.f08: % + gpufort -w $^ -E hip-gpufort-rt clean: - rm -rf *.hipified.f90 *kernels.f08 *kernels.hip.cpp *.o *.mod gpufort*.h $(TEST_NAME) log/ + rm -rf *-gpufort.* *-fort2hip.* *.o *.mod gpufort*.h $(TEST_NAME) *.gpufort_mod log/ diff --git a/examples/openacc/vector-add-declare/options.py.in b/examples/openacc/vector-add-declare/options.py.in deleted file mode 100644 index 7a5c9fad..00000000 --- a/examples/openacc/vector-add-declare/options.py.in +++ /dev/null @@ -1,11 +0,0 @@ -scanner.DESTINATION_DIALECT="hip-gpufort-rt" -scanner.LOOP_KERNEL_DEFAULT_LAUNCHER="auto" - -fort2hip.CLANG_FORMAT_STYLE="\"{BasedOnStyle: llvm, ColumnLimit: 140, BinPackArguments: false, BinPackParameters: false}\"" - -LOG_DIR="log" -#LOG_LEVEL="debug" - -#utils.logging.VERBOSE = True - -ENABLE_PROFILING=False diff --git a/examples/openacc/vector-add-declare/vector-add-procedures.f90 b/examples/openacc/vector-add-declare/vector-add-procedures.f90 new file mode 100644 index 00000000..64eab7bd --- /dev/null +++ b/examples/openacc/vector-add-declare/vector-add-procedures.f90 @@ -0,0 +1,46 @@ +program main + ! begin of program + + implicit none + integer, parameter :: N = 1000 + integer :: i + integer(4) :: x(N), y(N), y_exact(N) + + do i = 1, N + y_exact(i) = 3 + end do + + do i = 1, N + x(i) = 1 + y(i) = 2 + end do + + call vector_add_gpu(x,y,.FALSE.) + call vector_add_gpu(x,y,.TRUE.) ! return prematurely; do not perform addition + + do i = 1, N + if ( y_exact(i) .ne.& + y(i) ) ERROR STOP "GPU and CPU result do not match" + end do + + print *, "PASSED" + +contains + +subroutine vector_add_gpu(x,y,return_prematurely) + integer(4) :: x(:), y(:) + logical :: return_prematurely + !$acc declare copyin(x,y) + + ! extra return statement + if ( return_prematurely ) return + + !$acc parallel loop + do i = 1, N + y(i) = x(i) + y(i) + end do + + !$acc update host(y) +end subroutine + +end program diff --git a/examples/openacc/vector-add-declare/vector-add.f90 b/examples/openacc/vector-add-declare/vector-add.f90 index 6c2c6ae2..80c9f363 100644 --- a/examples/openacc/vector-add-declare/vector-add.f90 +++ b/examples/openacc/vector-add-declare/vector-add.f90 @@ -22,7 +22,7 @@ program main y(i) = x(i) + y(i) end do - !$acc update host(x,y) + !$acc update host(y) do i = 1, N if ( y_exact(i) .ne.& diff --git a/examples/openacc/vector-add/vector-add.f90 b/examples/openacc/vector-add/vector-add.f90 index 4940ab47..8b551e57 100644 --- a/examples/openacc/vector-add/vector-add.f90 +++ b/examples/openacc/vector-add/vector-add.f90 @@ -12,7 +12,7 @@ program main !$acc data copy(x(1:N),y(1:N)) - !$acc parallel loop + !$acc parallel loop present(x,y) do i = 1, N x(i) = 1 y(i) = 2 diff --git a/python/grammar/grammar_acc.py.in b/python/grammar/grammar_acc.py.in index 229fb4f5..cf9ae5c1 100644 --- a/python/grammar/grammar_acc.py.in +++ b/python/grammar/grammar_acc.py.in @@ -97,4 +97,4 @@ acc_simple_directive = acc_host_data | acc_data | acc_enter_data | acc_exit_data acc_host_directive = acc_kernels_loop | acc_parallel_loop | acc_kernels | acc_parallel | acc_simple_directive | ACC_END_DATA | ACC_END_HOST_DATA -#acc_kernel_body_directive = acc_loop | acc_serial_region | acc_atomic_region | acc_cache \ No newline at end of file +#acc_kernel_body_directive = acc_loop | acc_serial_region | acc_atomic_region | acc_cache diff --git a/python/scanner/openacc/scanner_tree_acc.py.in b/python/scanner/openacc/scanner_tree_acc.py.in index 4b23a622..565e2b45 100644 --- a/python/scanner/openacc/scanner_tree_acc.py.in +++ b/python/scanner/openacc/scanner_tree_acc.py.in @@ -38,12 +38,7 @@ exec(open("{0}/openacc/scanner_tree_acc2hipgpufortrt.py.in".format(scanner_dir)) exec(open("{0}/openacc/scanner_tree_acc2hipgccrt.py.in".format(scanner_dir)).read()) class STAccDirective(STDirective): - """ - This class has the functionality of a kernel if the stored lines - contain a parallel or kernels directive. - - https://www.openacc.org/sites/default/files/inline-files/OpenACC.2.7.pdf) - """ + """Class for handling ACC directives.""" def __init__(self,parent,first_linemap,first_linemap_first_statement,directive_no): STDirective.__init__(self,parent,first_linemap,first_linemap_first_statement,directive_no,sentinel="!$acc") self._default_present_vars = [] @@ -63,14 +58,16 @@ class STAccDirective(STDirective): return self.find_substring("acc end") def is_data_directive(self): return self.find_substring("acc data") - def is_enter_directive(self): + def is_enter_data_directive(self): return self.find_substring("acc enter") - def is_exit_directive(self): + def is_exit_data_directive(self): return self.find_substring("acc exit") def is_init_directive(self): return self.find_substring("acc init") def is_shutdown_directive(self): return self.find_substring("acc shutdown") + def is_update_directive(self): + return self.find_substring("acc update") def is_wait_directive(self): return self.find_substring("acc wait") def is_loop_directive(self): @@ -98,8 +95,8 @@ class STAccDirective(STDirective): is_init_directive={is_init_directive}, is_shutdown_directive={is_shutdown_directive}, is_end_directive={is_end_directive}, - is_enter_directive={is_enter_directive}, - is_exit_directive={is_exit_directive}, + is_enter_data_directive={is_enter_data_directive}, + is_exit_data_directive={is_exit_data_directive}, is_wait_directive={is_wait_directive}, is_loop_directive={is_loop_directive}, is_parallel_directive={is_parallel_directive}, @@ -110,8 +107,8 @@ class STAccDirective(STDirective): is_init_directive=self.is_init_directive(), is_shutdown_directive=self.is_shutdown_directive(), is_end_directive=self.is_end_directive(), - is_enter_directive=self.is_enter_directive(), - is_exit_directive=self.is_exit_directive(), + is_enter_data_directive=self.is_enter_data_directive(), + is_exit_data_directive=self.is_exit_data_directive(), is_wait_directive=self.is_wait_directive(), is_loop_directive=self.is_loop_directive(), is_parallel_directive=self.is_parallel_directive(), diff --git a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in index d5d9b211..a22c2b83 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in @@ -52,19 +52,19 @@ class Acc2HipGccRT(AccBackendBase): def _create_mappings(self,parse_result,prefix=",mappings="): mappings=[] for clause in translator.find_all(parse_result,translator.TTAccMappingClause): - if clause.kind() == "present": + if clause.kind == "present": mappings += [HIP_GCC_RT_MAP_PRESENT.format(var=expr) for expr in clause.var_expressions()] - elif clause.kind() == "create": + elif clause.kind == "create": mappings += [HIP_GCC_RT_MAP_CREATE.format(var=expr) for expr in clause.var_expressions()] - elif clause.kind() == "no_create": + elif clause.kind == "no_create": mappings += [HIP_GCC_RT_MAP_NO_CREATE.format(var=expr) for expr in clause.var_expressions()] - elif clause.kind() == "delete": + elif clause.kind == "delete": mappings += [HIP_GCC_RT_MAP_DELETE.format(var=expr) for expr in clause.var_expressions()] - elif clause.kind() == "copy": + elif clause.kind == "copy": mappings += [HIP_GCC_RT_MAP_COPY.format(var=expr) for expr in clause.var_expressions()] - elif clause.kind() == "copyin": + elif clause.kind == "copyin": mappings += [HIP_GCC_RT_MAP_COPYIN.format(var=expr) for expr in clause.var_expressions()] - elif clause.kind() == "copyout": + elif clause.kind == "copyout": mappings += [HIP_GCC_RT_MAP_COPYOUT.format(var=expr) for expr in clause.var_expressions()] if len(mappings): return prefix+"["+",".join(mappings)+"]" @@ -175,4 +175,4 @@ class AccLoopKernel2HipGccRT(Acc2HipGccRT): condition=condition,result=result.rstrip("\n"),original="".join(stnode._lines).rstrip("\n")) return result, len(result) -register_acc_backend("hip-gcc-rt",Acc2HipGccRT,AccLoopKernel2HipGccRT,None,"openacc_gomp") +register_acc_backend("hip-gcc-rt",Acc2HipGccRT,AccLoopKernel2HipGccRT,None,"openacc_gomp") \ No newline at end of file diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index cf3faf5a..912c593e 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -4,8 +4,8 @@ HIP_GPUFORT_RT_ACC_INIT = "{indent}call gpufort_acc_init()\n" HIP_GPUFORT_RT_ACC_SHUTDOWN = "{indent}call gpufort_acc_shutdown()\n" # regions -HIP_GPUFORT_RT_ACC_ENTER_REGION = "{indent}call gpufort_acc_enter_region({unstructured})\n" -HIP_GPUFORT_RT_ACC_EXIT_REGION = "{indent}call gpufort_acc_exit_region({unstructured})\n" +HIP_GPUFORT_RT_ACC_ENTER_REGION = "{indent}call gpufort_acc_enter_region({region_kind})\n" +HIP_GPUFORT_RT_ACC_EXIT_REGION = "{indent}call gpufort_acc_exit_region({region_kind})\n" # create HIP_GPUFORT_RT_ACC_CREATE = "{indent}{dev_var} = gpufort_acc_create({var})\n" # no_create @@ -18,10 +18,8 @@ HIP_GPUFORT_RT_ACC_COPYIN = "{indent}{dev_var} = gpufort_acc_copyin({var}{asyncr HIP_GPUFORT_RT_ACC_COPY = "{indent}{dev_var} = gpufort_acc_copy({var}{asyncr})\n" # copyout HIP_GPUFORT_RT_ACC_COPYOUT = "{indent}{dev_var} = gpufort_acc_copyout({var}{asyncr})\n" -# update host -HIP_GPUFORT_RT_ACC_UPDATE_HOST = "{indent}call gpufort_acc_update_host({var}{asyncr})\n" -# update device -HIP_GPUFORT_RT_ACC_UPDATE_DEVICE = "{indent}call gpufort_acc_update_device({var}{asyncr})\n" +# update +HIP_GPUFORT_RT_ACC_UPDATE = "{indent}call gpufort_acc_update_{kind}({var}{asyncr})\n" # present HIP_GPUFORT_RT_ACC_PRESENT = "{indent}{dev_var} = gpufort_acc_present({var}{asyncr}{alloc})\n" # wait @@ -90,41 +88,30 @@ class Acc2HipGpufortRT(AccBackendBase): # for parse_result in translator.acc_mapping_clause.scanString(self._stnode.single_line_statement()): clause = parse_result[0][0] - if clause.kind() in MAPPING_CLAUSE_2_TEMPLATE_MAP: + if clause.kind in MAPPING_CLAUSE_2_TEMPLATE_MAP: var_names = clause.var_names() var_expressions = clause.var_expressions() for i,var_expr in enumerate(var_expressions): deviceptr = dev_var_name(var_names[i]) - template = MAPPING_CLAUSE_2_TEMPLATE_MAP[clause.kind()] + template = MAPPING_CLAUSE_2_TEMPLATE_MAP[clause.kind] result += template.format(indent=indent,var=var_expr,dev_var=deviceptr,asyncr=self._handle_async(),alloc="") temp_vars.add(deviceptr) return result, len(result), temp_vars def _handle_update(self): """ - Emits a acc_clause_copy command for every variable in the list + Emits a acc_clause_update command for every variable in the list """ result = "" - temp_vars = set() indent = self._stnode.first_line_indent() # update host - #for parse_result in translator.acc_clause_update.scanString(self.single_line_statement()): - # #print(parse_result[0][0]) - # #print(parse_result[0][1]) - # asyncr=self._handle_async(parse_result[0][1]) - # #print(asyncr) - # for dest in parse_result[0][0]: - # #print(dest) - # template = HIP_GPUFORT_RT_ACC_UPDATE_HOST - # if dest[0]: # -> device - # template = HIP_GPUFORT_RT_ACC_UPDATE_DEVICE - # #print(dest[0]) - # #print(dest[1]) - # for rvalue in dest[1]: - # #print(rvalue) - # var_expr = rvalue.f_str() - # deviceptr = dev_var_name(var_expr) - # result += template.format(indent=indent,var=var_expr,dev_var=deviceptr,asyncr=asyncr) - return result, len(result), temp_vars + for parse_result in translator.acc_mapping_clause.scanString(self._stnode.single_line_statement()): + clause = parse_result[0][0] + if clause.kind in ["self","host","device"]: + clause_kind = "host" if clause.kind=="self" else clause.kind + var_expressions = clause.var_expressions() + for i,var_expr in enumerate(var_expressions): + result += HIP_GPUFORT_RT_ACC_UPDATE.format(indent=indent,var=var_expr,asyncr=self._handle_async(),kind=clause_kind) + return result, len(result) def _handle_wait(self): """ Emits a acc_clause_wait command for every variable in the list @@ -173,52 +160,49 @@ class Acc2HipGpufortRT(AccBackendBase): indent = stnode.first_line_indent() if stnode.is_init_directive(): result += HIP_GPUFORT_RT_ACC_INIT.format(indent=indent) - - ## Enter region commands must come first - emit_enter_region = stnode.is_enter_directive() - if emit_enter_region: - unstructured="unstructured=.TRUE." - else: - unstructured="" - emit_enter_region = emit_enter_region or stnode.is_data_directive() - emit_enter_region = emit_enter_region or stnode.is_parallel_directive() - emit_enter_region = emit_enter_region or stnode.is_parallel_loop_directive() - emit_enter_region = emit_enter_region or stnode.is_kernels_directive() - emit_enter_region = emit_enter_region or stnode.is_kernels_loop_directive() - if emit_enter_region: - result += HIP_GPUFORT_RT_ACC_ENTER_REGION.format(indent=indent,unstructured=unstructured) - - ## Other directives/clauses - # create - partial_result, transformed, temp_vars = self._handle_mapping_clauses() - if transformed: - result += partial_result - all_temp_vars.update(temp_vars) - - # update directive - partial_result, transformed, temp_vars = self._handle_update() - if transformed: - result += partial_result - all_temp_vars.update(temp_vars) - - ## wait - partial_result, transformed, _ = self._handle_wait() - if transformed: - result += partial_result - - ## Exit region commands must come last - emit_exit_region = stnode.is_exit_directive() - if emit_exit_region: - unstructured="unstructured=.TRUE." - else: - unstructured="" - emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("kernels") and not stnode.find_substring("loop")) - emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("parallel") and not stnode.find_substring("loop")) - emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("data")) - if emit_exit_region: - result += HIP_GPUFORT_RT_ACC_EXIT_REGION.format(indent=indent,unstructured=unstructured) - if stnode.is_shutdown_directive(): + elif stnode.is_update_directive(): + partial_result, transformed = self._handle_update() + if transformed: + result += partial_result + elif stnode.is_shutdown_directive(): result += HIP_GPUFORT_RT_ACC_SHUTDOWN.format(indent=indent) + else: + ## Enter region commands must come first + emit_enter_region = stnode.is_enter_data_directive() + if emit_enter_region: + region_kind="region_kind=.TRUE." + else: + region_kind="" + emit_enter_region = emit_enter_region or stnode.is_data_directive() + emit_enter_region = emit_enter_region or stnode.is_parallel_directive() + emit_enter_region = emit_enter_region or stnode.is_parallel_loop_directive() + emit_enter_region = emit_enter_region or stnode.is_kernels_directive() + emit_enter_region = emit_enter_region or stnode.is_kernels_loop_directive() + if emit_enter_region: + result += HIP_GPUFORT_RT_ACC_ENTER_REGION.format(indent=indent,region_kind=region_kind) + + ## Other directives/clauses + partial_result, transformed, temp_vars = self._handle_mapping_clauses() + if transformed: + result += partial_result + all_temp_vars.update(temp_vars) + + ## wait + partial_result, transformed, _ = self._handle_wait() + if transformed: + result += partial_result + + ## Exit region commands must come last + emit_exit_region = stnode.is_exit_data_directive() + if emit_exit_region: + region_kind="region_kind=.TRUE." + else: + region_kind="" + emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("kernels") and not stnode.find_substring("loop")) + emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("parallel") and not stnode.find_substring("loop")) + emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("data")) + if emit_exit_region: + result += HIP_GPUFORT_RT_ACC_EXIT_REGION.format(indent=indent,region_kind=region_kind) # _handle if condition = self._handle_if() @@ -287,7 +271,7 @@ class AccLoopKernel2HipGpufortRT(Acc2HipGpufortRT): result = result.rstrip("\n") + "\n" + HIP_GPUFORT_RT_ACC_WAIT.format(indent=indent,queue=queue,asyncr="") #if stloopkernel.is_parallel_loop_directive() or stloopkernel.is_kernels_loop_directive(): if stloopkernel.is_kernels_loop_directive() or stloopkernel.is_parallel_loop_directive(): - result = result.rstrip("\n") + "\n" + HIP_GPUFORT_RT_ACC_EXIT_REGION.format(indent=indent,unstructured="") + result = result.rstrip("\n") + "\n" + HIP_GPUFORT_RT_ACC_EXIT_REGION.format(indent=indent,region_kind="") # wrap in ifdef if necessary condition = self._handle_if() if len(condition): @@ -351,11 +335,11 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): _intrnl_add_device_vars_to_decl_list(stnode,temp_vars) if len(acc_present_calls): last_decl_list_node.add_to_epilog(HIP_GPUFORT_RT_ACC_ENTER_REGION.format(\ - indent=indent,unstructured="unstructured=.TRUE.")) + indent=indent,region_kind="region_kind=.TRUE.")) last_decl_list_node.add_to_epilog(acc_present_calls) for stendorreturn in stnode.return_or_end_statements(): stendorreturn.add_to_prolog(HIP_GPUFORT_RT_ACC_EXIT_REGION.format(\ - indent=indent,unstructured="unstructured=.TRUE.")) + indent=indent,region_kind="region_kind=.TRUE.")) register_acc_backend("hip-gpufort-rt",\ Acc2HipGpufortRT,\ AccLoopKernel2HipGpufortRT,\ diff --git a/python/scanner/scanner.py b/python/scanner/scanner.py index 90059039..118cf0ba 100644 --- a/python/scanner/scanner.py +++ b/python/scanner/scanner.py @@ -205,7 +205,6 @@ def Return(): if not keep_recording and type(current_node) in [STProcedure,STProgram]: new = STEndOrReturn(current_node,current_linemap,current_statement_no) append_if_not_recording_(new) - ascend_() def in_kernels_acc_region_and_not_recording(): nonlocal current_node nonlocal keep_recording diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index 02754020..6d643f0c 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -33,7 +33,7 @@ class Tagged: # TODO rename return self return result def return_or_end_statements(self): - return self._parent.find_all(filter=lambda stnode: type(stnode) == STEndOrReturn) + return self.find_all(filter=lambda stnode: type(stnode) == STEndOrReturn) def tag(self): """Construct a tag that can be used to search the index.""" result = self.name.lower() diff --git a/python/translator/translator_acc.py.in b/python/translator/translator_acc.py.in index c83a7adb..82cf1194 100644 --- a/python/translator/translator_acc.py.in +++ b/python/translator/translator_acc.py.in @@ -41,10 +41,8 @@ class TTAccClauseSelf(TTNode): return make_f_str(self._condition) class TTAccMappingClause(TTNode): def _assign_fields(self,tokens): - self._kind = tokens[0] + self.kind = tokens[0] self._var_list = tokens[1].asList() - def kind(self): - return self._kind def var_names(self,converter=make_f_str): return [ var.var_name(converter) for var in self._var_list ] def var_expressions(self,converter=make_f_str): @@ -102,7 +100,7 @@ class TTAccDirectiveBase(TTNode): result = [] for clause in self._clauses: if type(clause) == TTAccMappingClause and\ - clause.kind() in clause_kinds: + clause.kind in clause_kinds: result += clause.var_expressions() return result def _format(self,f_snippet): @@ -554,4 +552,4 @@ acc_parallel.setParseAction(TTAccParallel) acc_parallel_loop.setParseAction(TTAccParallelLoop) acc_kernels_loop.setParseAction(TTAccKernelsLoop) -ACC_END_DATA.setParseAction(TTAccEndData) \ No newline at end of file +ACC_END_DATA.setParseAction(TTAccEndData) From 8de6eadfddd526b8c27a46a61c9353d788b15ef4 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 14 Oct 2021 12:55:00 -0400 Subject: [PATCH 08/67] WiP on declare: Add working example with declare in subroutine --- examples/openacc/vector-add-declare/Makefile | 2 +- .../scanner_tree_acc2hipgpufortrt.py.in | 33 ++- python/scanner/scanner_tree.py.in | 33 ++- .../codegen/gpufort_acc_runtime.f90 | 280 +++++++++++------- .../templates/gpufort_acc_runtime.template.f | 7 +- .../src/gpufort_acc_runtime.f90 | 280 +++++++++++------- .../src/gpufort_acc_runtime_base.f90 | 21 +- 7 files changed, 401 insertions(+), 255 deletions(-) diff --git a/examples/openacc/vector-add-declare/Makefile b/examples/openacc/vector-add-declare/Makefile index fade8e0a..27510cd2 100644 --- a/examples/openacc/vector-add-declare/Makefile +++ b/examples/openacc/vector-add-declare/Makefile @@ -7,7 +7,7 @@ TEST_CONV_SRC = $(TEST_SRC:.f90=.f90-gpufort.f08) .PHONY: clean $(TEST_NAME): %: %.f90-gpufort.f08 - $(HIPCC) $(HIPCC_CFLAGS) -c $@-fort2hip.hip.cpp + $(HIPCC) $(HIPCC_CFLAGS) -c $@.f90-fort2hip.hip.cpp $(HIPFC) $^ -o $@ $@.f90-fort2hip.hip.o $(CFLAGS) $(TEST_CONV_SRC): %-gpufort.f08: % diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index 912c593e..89cb49cb 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -281,9 +281,15 @@ class AccLoopKernel2HipGpufortRT(Acc2HipGpufortRT): class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): def run(self,stree,index): - """:param stree: the full scanner tree""" - """:param staccdirectives: All acc directive tree nodes.""" - fortran_constructs = stree.find_all(filter=lambda node: isinstance(node,(STProgram,STProcedure)), recursively=True) + """:param stree: the full scanner tree + :param staccdirectives: All acc directive tree nodes.""" + utils.logging.log_enter_function(LOG_PREFIX,"Acc2HipGpufortRTPostprocess.run") + + # TODO check if there is any acc used in the + # construct at all + fortran_constructs = stree.find_all(\ + lambda node: type(node) in [STProgram,STProcedure], + recursively=True) for stnode in fortran_constructs: last_decl_list_node = stnode.last_entry_in_decl_list() allocates = [] # look up STAllocate @@ -297,8 +303,8 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): dummy_arg_names = [] else: parent_tag = stnode._parent.tag() - irecord = scoper.search_index_for_subprogram(index,parent_tag,stnode.name) - dummy_arg_names += irecord["dummy_args"] + irecord, _ = scoper.search_index_for_subprogram(index,parent_tag,stnode.name) + dummy_arg_names = irecord["dummy_args"] local_var_names = [ivar["name"] for ivar in irecord["variables"] if ivar["name"] not in dummy_arg_names] # TODO also process type members acc_present_calls = "" @@ -311,8 +317,8 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): is_used_module_var = not is_local_var and not is_arg is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ "pointer" in ivar["qualifiers"] - if is_arg or (is_local_var and not is_allocatable_or_pointer): - # find return and end, emit 1 new (un)structured region for all + if (is_arg or is_local_var) and not is_allocatable_or_pointer: + # find return and end, emit 1 new implicit region for all if ivar["declare_on_target"]=="alloc": acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ indent=indent,var=host_var,asyncr="",alloc=",create=.TRUE.",dev_var=dev_var) @@ -321,25 +327,28 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ indent=indent,var=host_var,asyncr="",alloc=",copyin=.TRUE.",dev_var=dev_var) temp_vars.append(dev_var) - elif is_local_var and is_allocatable_or_pointer: + elif (is_arg or is_local_var) and is_allocatable_or_pointer: # find return and end, emit 1 new (un)structured region for all # find allocate, deallocate with var as arg and write to epilog / prolog pass - elif is_module_var and not is_allocatable_or_pointer: + elif is_used_module_var and not is_allocatable_or_pointer: # ensure it is present in implicit region 0 / static data pass - elif is_module_var and is_allocatable_or_pointer: + elif is_used_module_var and is_allocatable_or_pointer: # find allocate, deallocate and write to epilog / prolog -> append to implicit region 0 / static data pass # first add the device variable declarations _intrnl_add_device_vars_to_decl_list(stnode,temp_vars) if len(acc_present_calls): last_decl_list_node.add_to_epilog(HIP_GPUFORT_RT_ACC_ENTER_REGION.format(\ - indent=indent,region_kind="region_kind=.TRUE.")) + indent=indent,region_kind="implicit_region=.TRUE.")) last_decl_list_node.add_to_epilog(acc_present_calls) for stendorreturn in stnode.return_or_end_statements(): stendorreturn.add_to_prolog(HIP_GPUFORT_RT_ACC_EXIT_REGION.format(\ - indent=indent,region_kind="region_kind=.TRUE.")) + indent=indent,region_kind="implicit_region=.TRUE.")) + + utils.logging.log_leave_function(LOG_PREFIX,"Acc2HipGpufortRTPostprocess.run") + register_acc_backend("hip-gpufort-rt",\ Acc2HipGpufortRT,\ AccLoopKernel2HipGpufortRT,\ diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index 6d643f0c..e269bf00 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -63,7 +63,12 @@ class STNode: with this node.""" result = [] for i,linemap in enumerate(self._linemaps): - if i == 0: + if len(self._linemaps)==1: + if last_linemap_last_elem == -1: + result += linemap[key][first_linemap_first_elem:] + else: + result += linemap[key][first_linemap_first_elem:last_linemap_last_elem+1] + elif i == 0: result += linemap[key][first_linemap_first_elem:] elif i == len(self._linemaps)-1: if last_linemap_last_elem == -1: @@ -152,13 +157,14 @@ class STNode: return result def find_all(self,filter=lambda child : True,recursively=False): result = [] - def descend(curr): + def descend_(curr): + nonlocal result for child in curr._children: if filter(child): result.append(child) - elif recursively: - descend(child) - descend(self) + if recursively: + descend_(child) + descend_(self) return result def find_first(self,filter=lambda child: True): for child in self._children: @@ -207,7 +213,7 @@ class STNode: return joined_lines, False else: return joined_statements, False - def __modify_linemaps(self,substitution): + def _modify_linemaps(self,substitution): """ Replaces first statement associated with node in first associated linemap by 'subst' argument. Replaces all other other statements in first and all other linemaps associated @@ -260,17 +266,26 @@ class STNode: if not self.ignore_in_s2s_translation: have_first_in_first_linemap = self._first_statement_index == 0 have_last_in_last_linemap = self._last_statement_index == -1 or\ - self._last_statement_index == len(self._linemaps[-1]["statements"])-1 + self._last_statement_index == len(self._linemaps[-1]["statements"])-1 statements_fully_cover_lines = have_first_in_first_linemap and have_last_in_last_linemap joined_lines = "".join(self.lines()) joined_statements = "\n".join(self.statements()) transformed_code, modified = self.transform(joined_lines,joined_statements,statements_fully_cover_lines,index) if modified: - self.__modify_linemaps(transformed_code) + self._modify_linemaps(transformed_code) class STEndOrReturn(STNode): - pass + def transform_statements(self,index=[]): + prolog = self._linemaps[0]["prolog"] + if len(prolog): + joined_statements = "\n".join(self.statements()) + indent = joined_statements[0:len(joined_statements)-len(joined_statements.lstrip())] + joined_prolog = "\n".join([indent+l.lstrip() for l in prolog]).rstrip() + transformed_code = joined_prolog + "\n" + joined_statements + self._modify_linemaps(transformed_code) + self._linemaps[0]["prolog"].clear() + class STRoot(STNode,Tagged): def __init__(self): diff --git a/runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 b/runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 index f40692d0..62e7405f 100644 --- a/runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 +++ b/runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 @@ -178,7 +178,7 @@ module gpufort_acc_runtime ! - function gpufort_acc_present_l_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -186,10 +186,11 @@ function gpufort_acc_present_l_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_0(hostptr) result(deviceptr) @@ -281,7 +282,7 @@ subroutine gpufort_acc_update_device_l_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -289,10 +290,11 @@ function gpufort_acc_present_l_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_1(hostptr) result(deviceptr) @@ -384,7 +386,7 @@ subroutine gpufort_acc_update_device_l_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -392,10 +394,11 @@ function gpufort_acc_present_l_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_2(hostptr) result(deviceptr) @@ -487,7 +490,7 @@ subroutine gpufort_acc_update_device_l_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -495,10 +498,11 @@ function gpufort_acc_present_l_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_3(hostptr) result(deviceptr) @@ -590,7 +594,7 @@ subroutine gpufort_acc_update_device_l_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -598,10 +602,11 @@ function gpufort_acc_present_l_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_4(hostptr) result(deviceptr) @@ -693,7 +698,7 @@ subroutine gpufort_acc_update_device_l_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -701,10 +706,11 @@ function gpufort_acc_present_l_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_5(hostptr) result(deviceptr) @@ -796,7 +802,7 @@ subroutine gpufort_acc_update_device_l_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -804,10 +810,11 @@ function gpufort_acc_present_l_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_6(hostptr) result(deviceptr) @@ -899,7 +906,7 @@ subroutine gpufort_acc_update_device_l_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -907,10 +914,11 @@ function gpufort_acc_present_l_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_7(hostptr) result(deviceptr) @@ -1003,7 +1011,7 @@ subroutine gpufort_acc_update_device_l_7(hostptr,condition,if_present,async) - function gpufort_acc_present_i4_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1011,10 +1019,11 @@ function gpufort_acc_present_i4_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_0(hostptr) result(deviceptr) @@ -1106,7 +1115,7 @@ subroutine gpufort_acc_update_device_i4_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1114,10 +1123,11 @@ function gpufort_acc_present_i4_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_1(hostptr) result(deviceptr) @@ -1209,7 +1219,7 @@ subroutine gpufort_acc_update_device_i4_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1217,10 +1227,11 @@ function gpufort_acc_present_i4_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_2(hostptr) result(deviceptr) @@ -1312,7 +1323,7 @@ subroutine gpufort_acc_update_device_i4_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1320,10 +1331,11 @@ function gpufort_acc_present_i4_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_3(hostptr) result(deviceptr) @@ -1415,7 +1427,7 @@ subroutine gpufort_acc_update_device_i4_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1423,10 +1435,11 @@ function gpufort_acc_present_i4_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_4(hostptr) result(deviceptr) @@ -1518,7 +1531,7 @@ subroutine gpufort_acc_update_device_i4_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1526,10 +1539,11 @@ function gpufort_acc_present_i4_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_5(hostptr) result(deviceptr) @@ -1621,7 +1635,7 @@ subroutine gpufort_acc_update_device_i4_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1629,10 +1643,11 @@ function gpufort_acc_present_i4_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_6(hostptr) result(deviceptr) @@ -1724,7 +1739,7 @@ subroutine gpufort_acc_update_device_i4_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1732,10 +1747,11 @@ function gpufort_acc_present_i4_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_7(hostptr) result(deviceptr) @@ -1828,7 +1844,7 @@ subroutine gpufort_acc_update_device_i4_7(hostptr,condition,if_present,async) - function gpufort_acc_present_i8_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1836,10 +1852,11 @@ function gpufort_acc_present_i8_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_0(hostptr) result(deviceptr) @@ -1931,7 +1948,7 @@ subroutine gpufort_acc_update_device_i8_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1939,10 +1956,11 @@ function gpufort_acc_present_i8_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_1(hostptr) result(deviceptr) @@ -2034,7 +2052,7 @@ subroutine gpufort_acc_update_device_i8_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2042,10 +2060,11 @@ function gpufort_acc_present_i8_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_2(hostptr) result(deviceptr) @@ -2137,7 +2156,7 @@ subroutine gpufort_acc_update_device_i8_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2145,10 +2164,11 @@ function gpufort_acc_present_i8_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_3(hostptr) result(deviceptr) @@ -2240,7 +2260,7 @@ subroutine gpufort_acc_update_device_i8_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2248,10 +2268,11 @@ function gpufort_acc_present_i8_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_4(hostptr) result(deviceptr) @@ -2343,7 +2364,7 @@ subroutine gpufort_acc_update_device_i8_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2351,10 +2372,11 @@ function gpufort_acc_present_i8_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_5(hostptr) result(deviceptr) @@ -2446,7 +2468,7 @@ subroutine gpufort_acc_update_device_i8_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2454,10 +2476,11 @@ function gpufort_acc_present_i8_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_6(hostptr) result(deviceptr) @@ -2549,7 +2572,7 @@ subroutine gpufort_acc_update_device_i8_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2557,10 +2580,11 @@ function gpufort_acc_present_i8_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_7(hostptr) result(deviceptr) @@ -2653,7 +2677,7 @@ subroutine gpufort_acc_update_device_i8_7(hostptr,condition,if_present,async) - function gpufort_acc_present_r4_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2661,10 +2685,11 @@ function gpufort_acc_present_r4_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_0(hostptr) result(deviceptr) @@ -2756,7 +2781,7 @@ subroutine gpufort_acc_update_device_r4_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2764,10 +2789,11 @@ function gpufort_acc_present_r4_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_1(hostptr) result(deviceptr) @@ -2859,7 +2885,7 @@ subroutine gpufort_acc_update_device_r4_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2867,10 +2893,11 @@ function gpufort_acc_present_r4_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_2(hostptr) result(deviceptr) @@ -2962,7 +2989,7 @@ subroutine gpufort_acc_update_device_r4_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2970,10 +2997,11 @@ function gpufort_acc_present_r4_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_3(hostptr) result(deviceptr) @@ -3065,7 +3093,7 @@ subroutine gpufort_acc_update_device_r4_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3073,10 +3101,11 @@ function gpufort_acc_present_r4_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_4(hostptr) result(deviceptr) @@ -3168,7 +3197,7 @@ subroutine gpufort_acc_update_device_r4_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3176,10 +3205,11 @@ function gpufort_acc_present_r4_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_5(hostptr) result(deviceptr) @@ -3271,7 +3301,7 @@ subroutine gpufort_acc_update_device_r4_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3279,10 +3309,11 @@ function gpufort_acc_present_r4_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_6(hostptr) result(deviceptr) @@ -3374,7 +3405,7 @@ subroutine gpufort_acc_update_device_r4_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3382,10 +3413,11 @@ function gpufort_acc_present_r4_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_7(hostptr) result(deviceptr) @@ -3478,7 +3510,7 @@ subroutine gpufort_acc_update_device_r4_7(hostptr,condition,if_present,async) - function gpufort_acc_present_r8_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3486,10 +3518,11 @@ function gpufort_acc_present_r8_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_0(hostptr) result(deviceptr) @@ -3581,7 +3614,7 @@ subroutine gpufort_acc_update_device_r8_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3589,10 +3622,11 @@ function gpufort_acc_present_r8_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_1(hostptr) result(deviceptr) @@ -3684,7 +3718,7 @@ subroutine gpufort_acc_update_device_r8_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3692,10 +3726,11 @@ function gpufort_acc_present_r8_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_2(hostptr) result(deviceptr) @@ -3787,7 +3822,7 @@ subroutine gpufort_acc_update_device_r8_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3795,10 +3830,11 @@ function gpufort_acc_present_r8_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_3(hostptr) result(deviceptr) @@ -3890,7 +3926,7 @@ subroutine gpufort_acc_update_device_r8_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3898,10 +3934,11 @@ function gpufort_acc_present_r8_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_4(hostptr) result(deviceptr) @@ -3993,7 +4030,7 @@ subroutine gpufort_acc_update_device_r8_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4001,10 +4038,11 @@ function gpufort_acc_present_r8_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_5(hostptr) result(deviceptr) @@ -4096,7 +4134,7 @@ subroutine gpufort_acc_update_device_r8_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4104,10 +4142,11 @@ function gpufort_acc_present_r8_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_6(hostptr) result(deviceptr) @@ -4199,7 +4238,7 @@ subroutine gpufort_acc_update_device_r8_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4207,10 +4246,11 @@ function gpufort_acc_present_r8_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_7(hostptr) result(deviceptr) @@ -4303,7 +4343,7 @@ subroutine gpufort_acc_update_device_r8_7(hostptr,condition,if_present,async) - function gpufort_acc_present_c4_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4311,10 +4351,11 @@ function gpufort_acc_present_c4_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_0(hostptr) result(deviceptr) @@ -4406,7 +4447,7 @@ subroutine gpufort_acc_update_device_c4_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4414,10 +4455,11 @@ function gpufort_acc_present_c4_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_1(hostptr) result(deviceptr) @@ -4509,7 +4551,7 @@ subroutine gpufort_acc_update_device_c4_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4517,10 +4559,11 @@ function gpufort_acc_present_c4_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_2(hostptr) result(deviceptr) @@ -4612,7 +4655,7 @@ subroutine gpufort_acc_update_device_c4_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4620,10 +4663,11 @@ function gpufort_acc_present_c4_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_3(hostptr) result(deviceptr) @@ -4715,7 +4759,7 @@ subroutine gpufort_acc_update_device_c4_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4723,10 +4767,11 @@ function gpufort_acc_present_c4_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_4(hostptr) result(deviceptr) @@ -4818,7 +4863,7 @@ subroutine gpufort_acc_update_device_c4_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4826,10 +4871,11 @@ function gpufort_acc_present_c4_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_5(hostptr) result(deviceptr) @@ -4921,7 +4967,7 @@ subroutine gpufort_acc_update_device_c4_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4929,10 +4975,11 @@ function gpufort_acc_present_c4_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_6(hostptr) result(deviceptr) @@ -5024,7 +5071,7 @@ subroutine gpufort_acc_update_device_c4_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5032,10 +5079,11 @@ function gpufort_acc_present_c4_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_7(hostptr) result(deviceptr) @@ -5128,7 +5176,7 @@ subroutine gpufort_acc_update_device_c4_7(hostptr,condition,if_present,async) - function gpufort_acc_present_c8_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5136,10 +5184,11 @@ function gpufort_acc_present_c8_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_0(hostptr) result(deviceptr) @@ -5231,7 +5280,7 @@ subroutine gpufort_acc_update_device_c8_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5239,10 +5288,11 @@ function gpufort_acc_present_c8_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_1(hostptr) result(deviceptr) @@ -5334,7 +5384,7 @@ subroutine gpufort_acc_update_device_c8_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5342,10 +5392,11 @@ function gpufort_acc_present_c8_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_2(hostptr) result(deviceptr) @@ -5437,7 +5488,7 @@ subroutine gpufort_acc_update_device_c8_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5445,10 +5496,11 @@ function gpufort_acc_present_c8_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_3(hostptr) result(deviceptr) @@ -5540,7 +5592,7 @@ subroutine gpufort_acc_update_device_c8_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5548,10 +5600,11 @@ function gpufort_acc_present_c8_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_4(hostptr) result(deviceptr) @@ -5643,7 +5696,7 @@ subroutine gpufort_acc_update_device_c8_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5651,10 +5704,11 @@ function gpufort_acc_present_c8_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_5(hostptr) result(deviceptr) @@ -5746,7 +5800,7 @@ subroutine gpufort_acc_update_device_c8_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5754,10 +5808,11 @@ function gpufort_acc_present_c8_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_6(hostptr) result(deviceptr) @@ -5849,7 +5904,7 @@ subroutine gpufort_acc_update_device_c8_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5857,10 +5912,11 @@ function gpufort_acc_present_c8_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_7(hostptr) result(deviceptr) diff --git a/runtime/gpufort_acc_runtime/codegen/templates/gpufort_acc_runtime.template.f b/runtime/gpufort_acc_runtime/codegen/templates/gpufort_acc_runtime.template.f index 9711a07c..988e3c0e 100644 --- a/runtime/gpufort_acc_runtime/codegen/templates/gpufort_acc_runtime.template.f +++ b/runtime/gpufort_acc_runtime/codegen/templates/gpufort_acc_runtime.template.f @@ -243,7 +243,7 @@ module gpufort_acc_runtime {% set rank = '' %} {% endif %} {% set suffix = tuple[0] + "_" + dims|string %} - function gpufort_acc_present_{{suffix}}(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_{{suffix}}(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -251,10 +251,11 @@ function gpufort_acc_present_{{suffix}}(hostptr,async,copy,copyin) result(device integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,async,copy,copyin,create) end function function gpufort_acc_create_{{suffix}}(hostptr) result(deviceptr) @@ -348,4 +349,4 @@ subroutine gpufort_acc_update_device_{{suffix}}(hostptr,condition,if_present,asy {% endfor %} {% endfor %} -end module \ No newline at end of file +end module diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 index f40692d0..62e7405f 100644 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 @@ -178,7 +178,7 @@ module gpufort_acc_runtime ! - function gpufort_acc_present_l_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -186,10 +186,11 @@ function gpufort_acc_present_l_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_0(hostptr) result(deviceptr) @@ -281,7 +282,7 @@ subroutine gpufort_acc_update_device_l_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -289,10 +290,11 @@ function gpufort_acc_present_l_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_1(hostptr) result(deviceptr) @@ -384,7 +386,7 @@ subroutine gpufort_acc_update_device_l_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -392,10 +394,11 @@ function gpufort_acc_present_l_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_2(hostptr) result(deviceptr) @@ -487,7 +490,7 @@ subroutine gpufort_acc_update_device_l_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -495,10 +498,11 @@ function gpufort_acc_present_l_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_3(hostptr) result(deviceptr) @@ -590,7 +594,7 @@ subroutine gpufort_acc_update_device_l_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -598,10 +602,11 @@ function gpufort_acc_present_l_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_4(hostptr) result(deviceptr) @@ -693,7 +698,7 @@ subroutine gpufort_acc_update_device_l_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -701,10 +706,11 @@ function gpufort_acc_present_l_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_5(hostptr) result(deviceptr) @@ -796,7 +802,7 @@ subroutine gpufort_acc_update_device_l_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -804,10 +810,11 @@ function gpufort_acc_present_l_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_6(hostptr) result(deviceptr) @@ -899,7 +906,7 @@ subroutine gpufort_acc_update_device_l_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_l_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_l_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -907,10 +914,11 @@ function gpufort_acc_present_l_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) end function function gpufort_acc_create_l_7(hostptr) result(deviceptr) @@ -1003,7 +1011,7 @@ subroutine gpufort_acc_update_device_l_7(hostptr,condition,if_present,async) - function gpufort_acc_present_i4_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1011,10 +1019,11 @@ function gpufort_acc_present_i4_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_0(hostptr) result(deviceptr) @@ -1106,7 +1115,7 @@ subroutine gpufort_acc_update_device_i4_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1114,10 +1123,11 @@ function gpufort_acc_present_i4_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_1(hostptr) result(deviceptr) @@ -1209,7 +1219,7 @@ subroutine gpufort_acc_update_device_i4_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1217,10 +1227,11 @@ function gpufort_acc_present_i4_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_2(hostptr) result(deviceptr) @@ -1312,7 +1323,7 @@ subroutine gpufort_acc_update_device_i4_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1320,10 +1331,11 @@ function gpufort_acc_present_i4_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_3(hostptr) result(deviceptr) @@ -1415,7 +1427,7 @@ subroutine gpufort_acc_update_device_i4_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1423,10 +1435,11 @@ function gpufort_acc_present_i4_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_4(hostptr) result(deviceptr) @@ -1518,7 +1531,7 @@ subroutine gpufort_acc_update_device_i4_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1526,10 +1539,11 @@ function gpufort_acc_present_i4_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_5(hostptr) result(deviceptr) @@ -1621,7 +1635,7 @@ subroutine gpufort_acc_update_device_i4_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1629,10 +1643,11 @@ function gpufort_acc_present_i4_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_6(hostptr) result(deviceptr) @@ -1724,7 +1739,7 @@ subroutine gpufort_acc_update_device_i4_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i4_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i4_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1732,10 +1747,11 @@ function gpufort_acc_present_i4_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_i4_7(hostptr) result(deviceptr) @@ -1828,7 +1844,7 @@ subroutine gpufort_acc_update_device_i4_7(hostptr,condition,if_present,async) - function gpufort_acc_present_i8_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1836,10 +1852,11 @@ function gpufort_acc_present_i8_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_0(hostptr) result(deviceptr) @@ -1931,7 +1948,7 @@ subroutine gpufort_acc_update_device_i8_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -1939,10 +1956,11 @@ function gpufort_acc_present_i8_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_1(hostptr) result(deviceptr) @@ -2034,7 +2052,7 @@ subroutine gpufort_acc_update_device_i8_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2042,10 +2060,11 @@ function gpufort_acc_present_i8_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_2(hostptr) result(deviceptr) @@ -2137,7 +2156,7 @@ subroutine gpufort_acc_update_device_i8_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2145,10 +2164,11 @@ function gpufort_acc_present_i8_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_3(hostptr) result(deviceptr) @@ -2240,7 +2260,7 @@ subroutine gpufort_acc_update_device_i8_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2248,10 +2268,11 @@ function gpufort_acc_present_i8_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_4(hostptr) result(deviceptr) @@ -2343,7 +2364,7 @@ subroutine gpufort_acc_update_device_i8_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2351,10 +2372,11 @@ function gpufort_acc_present_i8_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_5(hostptr) result(deviceptr) @@ -2446,7 +2468,7 @@ subroutine gpufort_acc_update_device_i8_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2454,10 +2476,11 @@ function gpufort_acc_present_i8_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_6(hostptr) result(deviceptr) @@ -2549,7 +2572,7 @@ subroutine gpufort_acc_update_device_i8_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_i8_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_i8_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2557,10 +2580,11 @@ function gpufort_acc_present_i8_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_i8_7(hostptr) result(deviceptr) @@ -2653,7 +2677,7 @@ subroutine gpufort_acc_update_device_i8_7(hostptr,condition,if_present,async) - function gpufort_acc_present_r4_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2661,10 +2685,11 @@ function gpufort_acc_present_r4_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_0(hostptr) result(deviceptr) @@ -2756,7 +2781,7 @@ subroutine gpufort_acc_update_device_r4_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2764,10 +2789,11 @@ function gpufort_acc_present_r4_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_1(hostptr) result(deviceptr) @@ -2859,7 +2885,7 @@ subroutine gpufort_acc_update_device_r4_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2867,10 +2893,11 @@ function gpufort_acc_present_r4_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_2(hostptr) result(deviceptr) @@ -2962,7 +2989,7 @@ subroutine gpufort_acc_update_device_r4_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -2970,10 +2997,11 @@ function gpufort_acc_present_r4_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_3(hostptr) result(deviceptr) @@ -3065,7 +3093,7 @@ subroutine gpufort_acc_update_device_r4_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3073,10 +3101,11 @@ function gpufort_acc_present_r4_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_4(hostptr) result(deviceptr) @@ -3168,7 +3197,7 @@ subroutine gpufort_acc_update_device_r4_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3176,10 +3205,11 @@ function gpufort_acc_present_r4_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_5(hostptr) result(deviceptr) @@ -3271,7 +3301,7 @@ subroutine gpufort_acc_update_device_r4_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3279,10 +3309,11 @@ function gpufort_acc_present_r4_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_6(hostptr) result(deviceptr) @@ -3374,7 +3405,7 @@ subroutine gpufort_acc_update_device_r4_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r4_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r4_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3382,10 +3413,11 @@ function gpufort_acc_present_r4_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) end function function gpufort_acc_create_r4_7(hostptr) result(deviceptr) @@ -3478,7 +3510,7 @@ subroutine gpufort_acc_update_device_r4_7(hostptr,condition,if_present,async) - function gpufort_acc_present_r8_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3486,10 +3518,11 @@ function gpufort_acc_present_r8_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_0(hostptr) result(deviceptr) @@ -3581,7 +3614,7 @@ subroutine gpufort_acc_update_device_r8_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3589,10 +3622,11 @@ function gpufort_acc_present_r8_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_1(hostptr) result(deviceptr) @@ -3684,7 +3718,7 @@ subroutine gpufort_acc_update_device_r8_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3692,10 +3726,11 @@ function gpufort_acc_present_r8_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_2(hostptr) result(deviceptr) @@ -3787,7 +3822,7 @@ subroutine gpufort_acc_update_device_r8_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3795,10 +3830,11 @@ function gpufort_acc_present_r8_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_3(hostptr) result(deviceptr) @@ -3890,7 +3926,7 @@ subroutine gpufort_acc_update_device_r8_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -3898,10 +3934,11 @@ function gpufort_acc_present_r8_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_4(hostptr) result(deviceptr) @@ -3993,7 +4030,7 @@ subroutine gpufort_acc_update_device_r8_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4001,10 +4038,11 @@ function gpufort_acc_present_r8_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_5(hostptr) result(deviceptr) @@ -4096,7 +4134,7 @@ subroutine gpufort_acc_update_device_r8_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4104,10 +4142,11 @@ function gpufort_acc_present_r8_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_6(hostptr) result(deviceptr) @@ -4199,7 +4238,7 @@ subroutine gpufort_acc_update_device_r8_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_r8_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_r8_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4207,10 +4246,11 @@ function gpufort_acc_present_r8_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) end function function gpufort_acc_create_r8_7(hostptr) result(deviceptr) @@ -4303,7 +4343,7 @@ subroutine gpufort_acc_update_device_r8_7(hostptr,condition,if_present,async) - function gpufort_acc_present_c4_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4311,10 +4351,11 @@ function gpufort_acc_present_c4_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_0(hostptr) result(deviceptr) @@ -4406,7 +4447,7 @@ subroutine gpufort_acc_update_device_c4_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4414,10 +4455,11 @@ function gpufort_acc_present_c4_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_1(hostptr) result(deviceptr) @@ -4509,7 +4551,7 @@ subroutine gpufort_acc_update_device_c4_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4517,10 +4559,11 @@ function gpufort_acc_present_c4_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_2(hostptr) result(deviceptr) @@ -4612,7 +4655,7 @@ subroutine gpufort_acc_update_device_c4_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4620,10 +4663,11 @@ function gpufort_acc_present_c4_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_3(hostptr) result(deviceptr) @@ -4715,7 +4759,7 @@ subroutine gpufort_acc_update_device_c4_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4723,10 +4767,11 @@ function gpufort_acc_present_c4_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_4(hostptr) result(deviceptr) @@ -4818,7 +4863,7 @@ subroutine gpufort_acc_update_device_c4_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4826,10 +4871,11 @@ function gpufort_acc_present_c4_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_5(hostptr) result(deviceptr) @@ -4921,7 +4967,7 @@ subroutine gpufort_acc_update_device_c4_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -4929,10 +4975,11 @@ function gpufort_acc_present_c4_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_6(hostptr) result(deviceptr) @@ -5024,7 +5071,7 @@ subroutine gpufort_acc_update_device_c4_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c4_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c4_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5032,10 +5079,11 @@ function gpufort_acc_present_c4_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) end function function gpufort_acc_create_c4_7(hostptr) result(deviceptr) @@ -5128,7 +5176,7 @@ subroutine gpufort_acc_update_device_c4_7(hostptr,condition,if_present,async) - function gpufort_acc_present_c8_0(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_0(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5136,10 +5184,11 @@ function gpufort_acc_present_c8_0(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_0(hostptr) result(deviceptr) @@ -5231,7 +5280,7 @@ subroutine gpufort_acc_update_device_c8_0(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_1(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_1(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5239,10 +5288,11 @@ function gpufort_acc_present_c8_1(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_1(hostptr) result(deviceptr) @@ -5334,7 +5384,7 @@ subroutine gpufort_acc_update_device_c8_1(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_2(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_2(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5342,10 +5392,11 @@ function gpufort_acc_present_c8_2(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_2(hostptr) result(deviceptr) @@ -5437,7 +5488,7 @@ subroutine gpufort_acc_update_device_c8_2(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_3(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_3(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5445,10 +5496,11 @@ function gpufort_acc_present_c8_3(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_3(hostptr) result(deviceptr) @@ -5540,7 +5592,7 @@ subroutine gpufort_acc_update_device_c8_3(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_4(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_4(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5548,10 +5600,11 @@ function gpufort_acc_present_c8_4(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_4(hostptr) result(deviceptr) @@ -5643,7 +5696,7 @@ subroutine gpufort_acc_update_device_c8_4(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_5(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_5(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5651,10 +5704,11 @@ function gpufort_acc_present_c8_5(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_5(hostptr) result(deviceptr) @@ -5746,7 +5800,7 @@ subroutine gpufort_acc_update_device_c8_5(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_6(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_6(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5754,10 +5808,11 @@ function gpufort_acc_present_c8_6(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_6(hostptr) result(deviceptr) @@ -5849,7 +5904,7 @@ subroutine gpufort_acc_update_device_c8_6(hostptr,condition,if_present,async) end subroutine - function gpufort_acc_present_c8_7(hostptr,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_c8_7(hostptr,async,copy,copyin,create) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none @@ -5857,10 +5912,11 @@ function gpufort_acc_present_c8_7(hostptr,async,copy,copyin) result(deviceptr) integer,intent(in),optional :: async logical,intent(in),optional :: copy logical,intent(in),optional :: copyin + logical,intent(in),optional :: create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) end function function gpufort_acc_create_c8_7(hostptr) result(deviceptr) diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 index b91c0298..a871dc2d 100644 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 @@ -686,22 +686,24 @@ subroutine gpufort_acc_wait(arg,async) !> \note We can use this also for a "normal" data section !> \note We can use this also for any other region that uses device data - subroutine gpufort_acc_enter_region(unstructured) + subroutine gpufort_acc_enter_region(unstructured,implicit_region) implicit none logical,optional,intent(in) :: unstructured + logical,optional,intent(in) :: implicit_region if ( .not. initialized_ ) call gpufort_acc_init() current_region_ = current_region_ + 1 end subroutine !> \note We can use this also for a "normal" end data section !> \note We can use this also for any other region exit that uses device data - subroutine gpufort_acc_exit_region(unstructured) + subroutine gpufort_acc_exit_region(unstructured,implicit_region) #ifdef EXIT_REGION_SYNCHRONIZE_DEVICE use hipfort use hipfort_check #endif implicit none logical,optional,intent(in) :: unstructured + logical,optional,intent(in) :: implicit_region ! integer :: i, new_last_record_index ! @@ -747,7 +749,7 @@ subroutine gpufort_acc_exit_region(unstructured) !> decremented. !> !> \note We just return the device pointer here and do not modify the counters. - function gpufort_acc_present_b(hostptr,num_bytes,async,copy,copyin) result(deviceptr) + function gpufort_acc_present_b(hostptr,num_bytes,async,copy,copyin,create) result(deviceptr) use iso_fortran_env use iso_c_binding use gpufort_acc_runtime_c_bindings @@ -758,14 +760,16 @@ function gpufort_acc_present_b(hostptr,num_bytes,async,copy,copyin) result(devic integer,optional,intent(in) :: async logical,optional,intent(in) :: copy logical,optional,intent(in) :: copyin + logical,optional,intent(in) :: create ! type(c_ptr) :: deviceptr ! logical :: success,fits integer :: loc integer(c_size_t) :: offset_bytes - logical :: opt_copyin logical :: opt_copy + logical :: opt_copyin + logical :: opt_create ! if ( .not. initialized_ ) ERROR STOP "gpufort_acc_present_b: runtime not initialized" if ( .not. c_associated(hostptr) ) then @@ -774,14 +778,18 @@ function gpufort_acc_present_b(hostptr,num_bytes,async,copy,copyin) result(devic else loc = find_record_(hostptr,success) if ( .not. success ) then - opt_copyin = .FALSE. opt_copy = .FALSE. + opt_copyin = .FALSE. + opt_create = .FALSE. if ( present(copy) ) opt_copy = copy if ( present(copyin) ) opt_copyin = copyin + if ( present(create) ) opt_create = create if ( opt_copy ) then deviceptr = gpufort_acc_copy_b(hostptr,num_bytes,async) else if ( opt_copyin ) then deviceptr = gpufort_acc_copyin_b(hostptr,num_bytes,async) + else if ( opt_create ) then + deviceptr = gpufort_acc_create_b(hostptr,num_bytes,async) else print *, "ERROR: did not find record for hostptr:" CALL print_cptr(hostptr) @@ -826,11 +834,12 @@ function gpufort_acc_present_b(hostptr,num_bytes,async,copy,copyin) result(devic !> counts are zero, the device memory is deallocated. !> !> \note Only use this when entering not when exiting - function gpufort_acc_create_b(hostptr,num_bytes) result(deviceptr) + function gpufort_acc_create_b(hostptr,num_bytes,async) result(deviceptr) use iso_c_binding implicit none type(c_ptr),intent(in) :: hostptr integer(c_size_t),intent(in) :: num_bytes + integer,optional,intent(in) :: async ! ignored for now type(c_ptr) :: deviceptr ! integer :: loc From fb25e6be09d29b719f22dbac7df50bec62288c1b Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Fri, 15 Oct 2021 09:18:37 -0400 Subject: [PATCH 09/67] WiP on acc declare wrt allocatable/pointer vars --- python/indexer/scoper.py | 4 - .../cudafortran/scanner_tree_cuf.py.in | 63 +++++++++++++- .../cudafortran/scanner_tree_cuf2hip.py.in | 2 +- python/scanner/openacc/scanner_tree_acc.py.in | 18 ++++ python/scanner/scanner.py | 37 +------- python/scanner/scanner_tree.py.in | 84 ++++++++----------- 6 files changed, 116 insertions(+), 92 deletions(-) diff --git a/python/indexer/scoper.py b/python/indexer/scoper.py index d4d26ea4..08cae584 100644 --- a/python/indexer/scoper.py +++ b/python/indexer/scoper.py @@ -415,7 +415,3 @@ def search_index_for_subprogram(index,parent_tag,subprogram_name): result = _intrnl_search_index_for_type_or_subprogram(index,parent_tag,subprogram_name,"subprograms",EMPTY_SUBPROGRAM) utils.logging.log_leave_function(LOG_PREFIX,"search_index_for_subprogram") return result - -def index_variable_is_on_device(ivar): - return "device" in ivar["qualifiers"] or\ - ivar["declare_on_target"] in ["alloc","to","from","tofrom"] diff --git a/python/scanner/cudafortran/scanner_tree_cuf.py.in b/python/scanner/cudafortran/scanner_tree_cuf.py.in index 33b7d236..453a4a89 100644 --- a/python/scanner/cudafortran/scanner_tree_cuf.py.in +++ b/python/scanner/cudafortran/scanner_tree_cuf.py.in @@ -44,4 +44,65 @@ class STCufLoopKernel(STCufDirective,STLoopKernel): checked_dialect = check_destination_dialect(\ DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) return CUF_LOOP_KERNEL_BACKENDS[checked_dialect](self).transform(\ - joined_lines,joined_statements,statements_fully_cover_lines,index) \ No newline at end of file + joined_lines,joined_statements,statements_fully_cover_lines,index) + +def handle_allocate_cuf(stallocate,joined_statements): + indent = stallocate.first_line_indent() + # CUF + transformed = False + bytes_per_element = [] + array_qualifiers = [] + for array_name in stallocate.parse_result.variable_names(): + ivar,_ = scoper.search_index_for_variable(index,stallocate._parent.tag(),\ + array_name) + bytes_per_element.append(ivar["bytes_per_element"]) + qualifier, transformation_required = pinned_or_on_device(ivar) + transformed |= transformation_required + array_qualifiers.append(qualifier) + subst = stallocate.parse_result.hip_f_str(bytes_per_element,array_qualifiers,indent=indent).lstrip(" ") + return (subst, transformed) + +def handle_deallocate_cuf(stdeallocate,joined_statements): + indent = stdeallocate.first_line_indent() + transformed = False + array_qualifiers = [] + for array_name in stdeallocate.parse_result.variable_names(): + ivar,_ = scoper.search_index_for_variable(index,stdeallocate._parent.tag(),\ + array_name) + on_device = index_variable_is_on_device(ivar) + qualifier, transformed1 = pinned_or_on_device(ivar) + transformed |= transformed1 + array_qualifiers.append(qualifier) + subst = stdeallocate.parse_result.hip_f_str(array_qualifiers,indent=indent).lstrip(" ") + return (subst, transformed) + +def process_cuf(stree): + """ + Add use statements as well as handles plus their creation and destruction for certain + math libraries. + """ + global LOG_PREFIX + global CUBLAS_VERSION + utils.logging.log_enter_function(LOG_PREFIX,"postprocess_cuf") + + # cublas_v1 detection + if CUBLAS_VERSION == 1: + def has_cublas_call_(child): + return type(child) is STCudaLibCall and child.has_cublas() + cuf_cublas_calls = stree.find_all(filter=has_cublas_call_, recursively=True) + #print(cuf_cublas_calls) + for call in cuf_cublas_calls: + begin = call._parent.find_last(filter=lambda child : type(child) in [STUseStatement,STDeclaration]) + indent = self.first_line_indent() + begin.add_to_epilog("{0}type(c_ptr) :: hipblasHandle = c_null_ptr\n".format(indent)) + #print(begin._linemaps) + + local_cublas_calls = call._parent.find_all(filter=has_cublas_call, recursively=False) + first = local_cublas_calls[0] + indent = self.first_line_indent() + first.add_to_prolog("{0}hipblasCreate(hipblasHandle)\n".format(indent)) + last = local_cublas_calls[-1] + indent = self.first_line_indent() + last.add_to_epilog("{0}hipblasDestroy(hipblasHandle)\n".format(indent)) + + utils.logging.log_leave_function(LOG_PREFIX,"postprocess_cuf") diff --git a/python/scanner/cudafortran/scanner_tree_cuf2hip.py.in b/python/scanner/cudafortran/scanner_tree_cuf2hip.py.in index ce36aca5..d4bf50da 100644 --- a/python/scanner/cudafortran/scanner_tree_cuf2hip.py.in +++ b/python/scanner/cudafortran/scanner_tree_cuf2hip.py.in @@ -5,4 +5,4 @@ class CufLoopKernel2Hip(CufBackendBase): def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): return STLoopKernel.transform(self._stnode,joined_lines,joined_statements,statements_fully_cover_lines,index) -register_cuf_backend("hip",CufLoopKernel2Hip,None) \ No newline at end of file +register_cuf_backend("hip",CufLoopKernel2Hip,None) diff --git a/python/scanner/openacc/scanner_tree_acc.py.in b/python/scanner/openacc/scanner_tree_acc.py.in index 565e2b45..8e36248a 100644 --- a/python/scanner/openacc/scanner_tree_acc.py.in +++ b/python/scanner/openacc/scanner_tree_acc.py.in @@ -137,6 +137,24 @@ class STAccLoopKernel(STAccDirective,STLoopKernel): return ACC_LOOP_KERNEL_BACKENDS[checked_dialect](self).transform(\ joined_lines,joined_statements,statements_fully_cover_lines,index) +def handle_allocate_acc(stallocate,joined_statements): + epilog = "" + indent = stallocate.first_line_indent() + checked_dialect = check_destination_dialect(\ + DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) + if len(epilog): + return joined_statements.rstrip("\n")+"\n"+epilog, True + else: + return joined_statements, False + +def handle_deallocate_acc(stdeallocate,joined_statements): + prolog = "" + indent = stdeallocate.first_line_indent() + if len(prolog): + return prolog.rstrip("\n") + "\n" + joined_statements.rstrip("\n"), True + else: + return joined_statements, False + def postprocess_tree_acc(stree,index,destination_dialect=""): """ Add use statements as well as handles plus their creation and destruction for certain diff --git a/python/scanner/scanner.py b/python/scanner/scanner.py index 118cf0ba..1df7b9a7 100644 --- a/python/scanner/scanner.py +++ b/python/scanner/scanner.py @@ -45,35 +45,6 @@ def check_destination_dialect(destination_dialect): utils.logging.log_error(LOG_PREFIX,"check_destination_dialect",msg) sys.exit(SCANNER_ERROR_CODE) -def _intrnl_postprocess_cuf(stree): - """ - Add use statements as well as handles plus their creation and destruction for certain - math libraries. - """ - global LOG_PREFIX - global CUBLAS_VERSION - utils.logging.log_enter_function(LOG_PREFIX,"_intrnl_postprocess_cuf") - # cublas_v1 detection - if CUBLAS_VERSION == 1: - def has_cublas_call_(child): - return type(child) is STCudaLibCall and child.has_cublas() - cuf_cublas_calls = stree.find_all(filter=has_cublas_call_, recursively=True) - #print(cuf_cublas_calls) - for call in cuf_cublas_calls: - begin = call._parent.find_last(filter=lambda child : type(child) in [STUseStatement,STDeclaration]) - indent = self.first_line_indent() - begin.add_to_epilog("{0}type(c_ptr) :: hipblasHandle = c_null_ptr\n".format(indent)) - #print(begin._linemaps) - - local_cublas_calls = call._parent.find_all(filter=has_cublas_call, recursively=False) - first = local_cublas_calls[0] - indent = self.first_line_indent() - first.add_to_prolog("{0}hipblasCreate(hipblasHandle)\n".format(indent)) - last = local_cublas_calls[-1] - indent = self.first_line_indent() - last.add_to_epilog("{0}hipblasDestroy(hipblasHandle)\n".format(indent)) - utils.logging.log_leave_function(LOG_PREFIX,"_intrnl_postprocess_cuf") - # API # Pyparsing actions that create scanner tree (ST) @@ -583,12 +554,6 @@ def postprocess(stree,index,hip_module_suffix): """ utils.logging.log_enter_function(LOG_PREFIX,"postprocess") if "hip" in DESTINATION_DIALECT or len(KERNELS_TO_CONVERT_TO_HIP): - # todo: - # for mod/prog in stree: - # mod_name <- mod/prog.name - # for kernels in body: - # - # insert use statements at appropriate point def is_accelerated(child): return isinstance(child,STLoopKernel) or\ @@ -607,7 +572,7 @@ def is_accelerated(child): stnode.add_to_prolog("{}use {}{}\n".format(indent,module_name,hip_module_suffix)) if "cuf" in SOURCE_DIALECTS: - _intrnl_postprocess_cuf(stree) + postprocess_cuf(stree) if "acc" in SOURCE_DIALECTS: postprocess_tree_acc(stree,index) utils.logging.log_leave_function(LOG_PREFIX,"postprocess") diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index e269bf00..60365225 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -544,6 +544,18 @@ class STAttributes(STNode): def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO return "", True +def index_variable_is_on_device(ivar): + return "device" in ivar["qualifiers"] + +def pinned_or_on_device(ivar): + """:return: Qualifier and if special treatment is necessary.""" + if "device" in ivar["qualifiers"]: + return "device", True + elif "pinned" in ivar["qualifiers"] + return "pinned", True + else: + return None, False + class STNonZeroCheck(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) @@ -555,7 +567,7 @@ class STNonZeroCheck(STNode): lhs_name = parse_result.lhs_f_str() ivar,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ lhs_name) - on_device = scoper.index_variable_is_on_device(ivar) + on_device = index_variable_is_on_device(ivar) transformed |= on_device if on_device: subst = parse_result.f_str() # TODO backend specific @@ -570,88 +582,60 @@ class STAllocated(STNode): var_name = parse_result.var_name() ivar,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ var_name) - on_device = scoper.index_variable_is_on_device(ivar) + on_device = index_variable_is_on_device(ivar) return (parse_result.f_str(), on_device) # TODO backend specific - result, transformed = utils.pyparsingutils.replace_all(snippet,translator.allocated,repl) + result, transformed = utils.pyparsingutils.replace_all(joined_statements,translator.allocated,repl) assert result != None return result, transformed class STAllocate(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + self.parse_result = translator.allocate.parseString(self.statements()[0])[0] + self.variable_names = self.parse_result.variable_names() def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO indent = self.first_line_indent() - def repl(parse_result): - nonlocal indent - transformed = False - bytes_per_element = [] - array_qualifiers = [] - for array_name in parse_result.variable_names(): - ivar,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ - array_name) - bytes_per_element.append(ivar["bytes_per_element"]) - on_device = scoper.index_variable_is_on_device(ivar) - pinned = ["pinned"] in ivar["qualifiers"] - if on_device: - array_qualifiers.append("device") - elif pinned: - array_qualifiers.append("pinned") - else: - array_qualifiers.append(None) - transformed |= on_device | pinned - subst = parse_result.hip_f_str(bytes_per_element,array_qualifiers,indent=indent).lstrip(" ") - return (subst, transformed) - return utils.pyparsingutils.replace_all(joined_statements,translator.allocate,repl) + result1, transformed1 = handle_allocate_cuf(self,joined_statements) + result2, transformed2 = handle_allocate_acc(self,result1) + return result2, (transformed1 or transformed2) class STDeallocate(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + self.parse_result = translator.deallocate.parseString(self.statements()[0])[0] + self.variable_names = self.parse_result.variable_names() def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO """ :note: `wrap_in_if_def` can be deactivated if a higher level function embeds the outcome already in an `ifdef`. """ - indent = self.first_line_indent() - def repl(parse_result): - nonlocal indent - transformed = False - array_qualifiers = [] - for array_name in parse_result.variable_names(): - ivar,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ - array_name) - on_device = scoper.index_variable_is_on_device(ivar) - pinned = ["pinned"] in ivar["qualifiers"] - if on_device: - array_qualifiers.append("device") - elif pinned: - array_qualifiers.append("pinned") - else: - array_qualifiers.append(None) - transformed |= on_device | pinned - subst = parse_result.hip_f_str(array_qualifiers,indent=indent).lstrip(" ") - return (subst, transformed) - return utils.pyparsingutils.replace_all(joined_statements,translator.deallocate,repl) + result1, transformed1 = handle_deallocate_cuf(self,joined_statements) + result2, transformed2 = handle_deallocate_acc(self,result1) + return result2, (transformed1 or transformed2) + class STMemcpy(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + self._parse_result = translator.memcpy.parseString(self.statements()[0]) def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO - def repl_memcpy(parse_result): + def repl_memcpy_(parse_result): dest_name = parse_result.dest_name_f_str() src_name = parse_result.src_name_f_str() dest_indexed_var,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ dest_name) src_indexed_var,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ src_name) - dest_on_device = scoper.index_variable_is_on_device(dest_indexed_var) - src_on_device = scoper.index_variable_is_on_device(src_indexed_var) + dest_on_device = index_variable_is_on_device(dest_indexed_var) + src_on_device = index_variable_is_on_device(src_indexed_var) bytes_per_element = dest_indexed_var["bytes_per_element"] if dest_on_device or src_on_device: subst = parse_result.hip_f_str(dest_on_device,src_on_device) return (subst,True) else: return ("",False) # no transformation; will not be considered - return utils.pyparsingutils.replace_all(joined_statements,translator.memcpy,repl_memcpy) + return repl_memcpy_(self._parse_result) + #return utils.pyparsingutils.replace_all(joined_statements,translator.memcpy,repl_memcpy) class STCudaLibCall(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): @@ -679,8 +663,8 @@ class STCudaLibCall(STNode): dest_name) src_indexed_var ,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ src_name) - dest_on_device = scoper.index_variable_is_on_device(dest_indexed_var) - src_on_device = scoper.index_variable_is_on_device(src_indexed_var) + dest_on_device = index_variable_is_on_device(dest_indexed_var) + src_on_device = index_variable_is_on_device(src_indexed_var) subst = parse_result.hip_f_str(dest_on_device,src_on_device) return (subst, True) snippet,_ = utils.pyparsingutils.replace_all(snippet,translator.cuf_cudamemcpy_variant,repl_memcpy) From e9c4ea1fc76af2209c6d4b4a7321c9ba06e9063e Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 18 Oct 2021 11:46:09 -0400 Subject: [PATCH 10/67] WiP on module var declare (unstable) --- python/scanner/openacc/scanner_tree_acc.py.in | 17 ++-- .../openacc/scanner_tree_acc2hipgccrt.py.in | 2 +- .../scanner_tree_acc2hipgpufortrt.py.in | 81 +++++++++++++--- .../openacc/scanner_tree_acc2omp.py.in | 2 +- python/scanner/scanner_tree.py.in | 92 +++++++++++-------- 5 files changed, 136 insertions(+), 58 deletions(-) diff --git a/python/scanner/openacc/scanner_tree_acc.py.in b/python/scanner/openacc/scanner_tree_acc.py.in index 8e36248a..d74f708b 100644 --- a/python/scanner/openacc/scanner_tree_acc.py.in +++ b/python/scanner/openacc/scanner_tree_acc.py.in @@ -10,7 +10,8 @@ class AccPostprocessBackendBase: def run(self,stree,index): """:param stree: the full scanner tree""" """:param staccdirectives: All acc directive tree nodes.""" - assert False, "not implemented" + #assert False, "not implemented" + pass ACC_BACKENDS = {} ACC_LOOP_KERNEL_BACKENDS = {} @@ -137,19 +138,21 @@ class STAccLoopKernel(STAccDirective,STLoopKernel): return ACC_LOOP_KERNEL_BACKENDS[checked_dialect](self).transform(\ joined_lines,joined_statements,statements_fully_cover_lines,index) -def handle_allocate_acc(stallocate,joined_statements): - epilog = "" +def handle_allocate_acc(stallocate,joined_statements,destination_dialect=""): indent = stallocate.first_line_indent() - checked_dialect = check_destination_dialect(\ - DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) + checked_dialect = check_destination_dialect(\ + DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) + epilog = ACC_ALLOCATE_BACKENDS[checked_dialect](stallocate) if len(epilog): return joined_statements.rstrip("\n")+"\n"+epilog, True else: return joined_statements, False -def handle_deallocate_acc(stdeallocate,joined_statements): - prolog = "" +def handle_deallocate_acc(stdeallocate,joined_statements,destination_dialect=""): indent = stdeallocate.first_line_indent() + checked_dialect = check_destination_dialect(\ + DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) + prolog = ACC_DEALLOCATE_BACKENDS[checked_dialect](stdeallocate) if len(prolog): return prolog.rstrip("\n") + "\n" + joined_statements.rstrip("\n"), True else: diff --git a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in index a22c2b83..7916bef6 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in @@ -175,4 +175,4 @@ class AccLoopKernel2HipGccRT(Acc2HipGccRT): condition=condition,result=result.rstrip("\n"),original="".join(stnode._lines).rstrip("\n")) return result, len(result) -register_acc_backend("hip-gcc-rt",Acc2HipGccRT,AccLoopKernel2HipGccRT,None,"openacc_gomp") \ No newline at end of file +register_acc_backend("hip-gcc-rt",Acc2HipGccRT,AccLoopKernel2HipGccRT,AccPostprocessBackendBase,"openacc_gomp") diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index 89cb49cb..0a9baa86 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -55,7 +55,8 @@ def _intrnl_add_device_vars_to_decl_list(stnode,temp_vars): if last_decl_list_node is None: last_decl_list_node = stnode for var in temp_vars: - last_decl_list_node.add_to_epilog("{indent}type(c_ptr) :: {name}\n".format(indent=indent,name=var)) + last_decl_list_node.add_to_epilog(\ + "{indent}type(c_ptr) :: {name}\n".format(indent=indent,name=var),prepend=True) class Acc2HipGpufortRT(AccBackendBase): # clauses @@ -285,8 +286,10 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): :param staccdirectives: All acc directive tree nodes.""" utils.logging.log_enter_function(LOG_PREFIX,"Acc2HipGpufortRTPostprocess.run") - # TODO check if there is any acc used in the - # construct at all + # ~~TODO check if there is any acc used in the + # construct at all~~ + # TODO handle directly via directives; only variables occuring + # in directives need to be available on device fortran_constructs = stree.find_all(\ lambda node: type(node) in [STProgram,STProcedure], recursively=True) @@ -298,14 +301,7 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): # todo find return statement or end of function scope = scoper.create_scope(index,stnode.tag()) scope_vars = scope["variables"] - if type(stnode) == STProgram: - irecord = next((ientry for ientry in index if ientry["name"]==stnode.name),None) - dummy_arg_names = [] - else: - parent_tag = stnode._parent.tag() - irecord, _ = scoper.search_index_for_subprogram(index,parent_tag,stnode.name) - dummy_arg_names = irecord["dummy_args"] - local_var_names = [ivar["name"] for ivar in irecord["variables"] if ivar["name"] not in dummy_arg_names] + local_var_names, dummy_arg_names = stnode.local_and_dummy_variable_names(index) # TODO also process type members acc_present_calls = "" temp_vars = [] @@ -323,10 +319,14 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ indent=indent,var=host_var,asyncr="",alloc=",create=.TRUE.",dev_var=dev_var) temp_vars.append(dev_var) - if ivar["declare_on_target"]=="to": + elif ivar["declare_on_target"]=="to": acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ indent=indent,var=host_var,asyncr="",alloc=",copyin=.TRUE.",dev_var=dev_var) temp_vars.append(dev_var) + elif ivar["declare_on_target"]=="tofrom": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=",copy=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) elif (is_arg or is_local_var) and is_allocatable_or_pointer: # find return and end, emit 1 new (un)structured region for all # find allocate, deallocate with var as arg and write to epilog / prolog @@ -337,7 +337,6 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): elif is_used_module_var and is_allocatable_or_pointer: # find allocate, deallocate and write to epilog / prolog -> append to implicit region 0 / static data pass - # first add the device variable declarations _intrnl_add_device_vars_to_decl_list(stnode,temp_vars) if len(acc_present_calls): last_decl_list_node.add_to_epilog(HIP_GPUFORT_RT_ACC_ENTER_REGION.format(\ @@ -349,6 +348,62 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): utils.logging.log_leave_function(LOG_PREFIX,"Acc2HipGpufortRTPostprocess.run") +def AllocateHipGpufortRT(stallocate,index): + varnames = stallocate.variable_names + stcontainer = stallocate._parent + parent_tag = stcontainer.tag() + scope = scoper.create_scope(index,parent_tag) + scope_vars = scope["variables"] + last_decl_list_node = stcontainer.last_entry_in_decl_list() + indent = last_decl_list_node.first_line_indent() + local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) + # if is declared var and allocatable/pointer + # add temp vars + acc_present_calls = "" + for var in stallocate.variable_names: + ivar,discovered = scoper.search_index_for_variable(index,parent_tag,var) + if discovered: + host_var = ivar["name"] + dev_var = dev_var_name(host_var) + is_local_var = host_var in local_var_names + is_arg = host_var in dummy_arg_names + is_used_module_var = not is_local_var and not is_arg + is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ + "pointer" in ivar["qualifiers"] + assert is_allocatable_or_pointer + # find return and end, emit 1 new implicit region for all + global_var = ",global=.TRUE." if is_used_module_var else "" + if ivar["declare_on_target"]=="alloc": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=global_var+",create=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) + elif ivar["declare_on_target"]=="to": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=global_var+",copyin=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) + elif ivar["declare_on_target"]=="tofrom": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=global_var+",copy=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) + host_var = ivar["name"] + dev_var = dev_var_name(host_var) + is_local_var = host_var in local_var_names + is_arg = host_var in dummy_arg_names + is_used_module_var = not is_local_var and not is_arg + is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ + "pointer" in ivar["qualifiers"] + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=",create=.TRUE.",dev_var=dev_var) + +def DeallocateHipGpufortRT(stdeallocate,index): + varnames = stdeallocate.variable_names + # if is declared var and allocatable/pointer + # add temp vars + stendorreturn.add_to_prolog(HIP_GPUFORT_RT_ACC_EXIT_REGION.format(\ + indent=indent,region_kind="implicit_region=.TRUE.")) + + + register_acc_backend("hip-gpufort-rt",\ Acc2HipGpufortRT,\ AccLoopKernel2HipGpufortRT,\ diff --git a/python/scanner/openacc/scanner_tree_acc2omp.py.in b/python/scanner/openacc/scanner_tree_acc2omp.py.in index 001096a1..86f02d03 100644 --- a/python/scanner/openacc/scanner_tree_acc2omp.py.in +++ b/python/scanner/openacc/scanner_tree_acc2omp.py.in @@ -32,4 +32,4 @@ class AccLoopKernel2Omp(AccBackendBase): utils.logging.log_exception(LOG_PREFIX,"AccLoopKernel2Omp.transform","failed to convert kernel "+str(snippet)) sys.exit(2) -register_acc_backend("omp",Acc2Omp,AccLoopKernel2Omp,None,None) +register_acc_backend("omp",Acc2Omp,AccLoopKernel2Omp,AccPostprocessBackendBase,None) diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index 60365225..ee209b84 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -17,34 +17,6 @@ def flatten_list(items): else: yield x -def decl_list_entry_filter(stnode): - """:return: If the scanner tree node is member of the declaration list.""" - return type(stnode) in [STUseStatement,STDeclaration,STPlaceHolder] - -class Tagged: # TODO rename - def first_entry_in_decl_list(self): - result = self.find_first(filter=decl_list_entry_filter) - if result == None: - return self - return result - def last_entry_in_decl_list(self): - result = self.find_last(filter=decl_list_entry_filter) - if result == None: - return self - return result - def return_or_end_statements(self): - return self.find_all(filter=lambda stnode: type(stnode) == STEndOrReturn) - def tag(self): - """Construct a tag that can be used to search the index.""" - result = self.name.lower() - def recursive_parent_lookup(curr): - nonlocal result - if type(curr) != STRoot: - result = curr.name.lower() + ":" + result - recursive_parent_lookup(curr._parent) - recursive_parent_lookup(self._parent) - return result - # scanner tree class STNode: def __init__(self,parent,first_linemap,first_statement_index=0): @@ -194,14 +166,20 @@ class STNode: for tokens,start,end in expression.scanString(text): result.append(text[start:end]) return result - def add_to_prolog(self,line): + def add_to_prolog(self,line,prepend=False): """Add some prolog lines to the first linemap.""" if not line in self._linemaps[0]["prolog"]: - self._linemaps[0]["prolog"].append(line) - def add_to_epilog(self,line): + if prepend: + self._linemaps[0]["prolog"].insert(0,line) + else: + self._linemaps[0]["prolog"].append(line) + def add_to_epilog(self,line,prepend=False): """Add some epilog lines to the first linemap.""" if not line in self._linemaps[-1]["epilog"]: - self._linemaps[-1]["epilog"].append(line) + if prepend: + self._linemaps[-1]["epilog"].insert(0,line) + else: + self._linemaps[-1]["epilog"].append(line) def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): """Transforms statements associated with underlying linemaps (hook) :param line: An excerpt from a Fortran file, possibly multiple lines @@ -275,6 +253,48 @@ class STNode: if modified: self._modify_linemaps(transformed_code) +def decl_list_entry_filter(stnode): + """:return: If the scanner tree node is member of the declaration list.""" + return type(stnode) in [STUseStatement,STDeclaration,STPlaceHolder] + +class STContainerBase(STNode): + def first_entry_in_decl_list(self): + result = self.find_first(filter=decl_list_entry_filter) + if result == None: + return self + return result + def last_entry_in_decl_list(self): + result = self.find_last(filter=decl_list_entry_filter) + if result == None: + return self + return result + def tag(self): + """Construct a tag that can be used to search the index.""" + result = self.name.lower() + def recursive_parent_lookup(curr): + nonlocal result + if type(curr) != STRoot: + result = curr.name.lower() + ":" + result + recursive_parent_lookup(curr._parent) + recursive_parent_lookup(self._parent) + return result + def return_or_end_statements(self): + return self.find_all(filter=lambda stnode: type(stnode) == STEndOrReturn) + def local_and_dummy_variable_names(self,index): + """:return: names of local variables (1st retval) and dummy variables (2nd retval).""" + # TODO can also be realised by subclass + scope = scoper.create_scope(index,self.tag()) + scope_vars = scope["variables"] + if type(self) == STProgram: + irecord = next((ientry for ientry in index if ientry["name"]==self.name),None) + dummy_arg_names = [] + else: + parent_tag = self._parent.tag() + irecord, _ = scoper.search_index_for_subprogram(index,parent_tag,self.name) + dummy_arg_names = irecord["dummy_args"] + local_var_names = [ivar["name"] for ivar in irecord["variables"] if ivar["name"] not in dummy_arg_names] + return local_var_names, dummy_arg_names + class STEndOrReturn(STNode): def transform_statements(self,index=[]): prolog = self._linemaps[0]["prolog"] @@ -287,19 +307,19 @@ class STEndOrReturn(STNode): self._linemaps[0]["prolog"].clear() -class STRoot(STNode,Tagged): +class STRoot(STContainerBase): def __init__(self): STNode.__init__(self,None,None,-1) def tag(self): return None -class STModule(STNode,Tagged): +class STModule(STContainerBase): def __init__(self,name,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) self.name = name.lower() self.kind = "module" -class STProgram(STNode,Tagged): +class STProgram(STContainerBase): def __init__(self,name,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) self.name = name.lower() @@ -328,7 +348,7 @@ class STPlaceHolder(STNode): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) self.name = None -class STProcedure(STNode,Tagged): +class STProcedure(STContainerBase): def __init__(self,name,kind,parent,first_linemap,first_linemap_first_statement,index): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) self.name = name From 3d547357f3dec0b32ba16311d0b968bf329dcae2 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Tue, 19 Oct 2021 05:33:39 -0400 Subject: [PATCH 11/67] WiP on acc declare (unstable) --- .../scanner_tree_acc2hipgpufortrt.py.in | 149 +++++++++++------- python/scanner/scanner_tree.py.in | 28 +++- 2 files changed, 114 insertions(+), 63 deletions(-) diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index 0a9baa86..9b10ba72 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -47,16 +47,18 @@ def dev_var_name(var): result = result.replace("$","_") return ACC_DEV_PREFIX + result + ACC_DEV_SUFFIX -def _intrnl_add_device_vars_to_decl_list(stnode,temp_vars): +def add_device_vars_to_decl_list(stnode,temp_vars): # introduce the new variables - if len(temp_vars): - last_decl_list_node = stnode.last_entry_in_decl_list() - indent = last_decl_list_node.first_line_indent() - if last_decl_list_node is None: - last_decl_list_node = stnode - for var in temp_vars: - last_decl_list_node.add_to_epilog(\ - "{indent}type(c_ptr) :: {name}\n".format(indent=indent,name=var),prepend=True) + stnode.append_to_decl_list(["type(c_ptr) :: {var}\n".format(var=var) for var in temp_vars]) + +def add_implicit_region(stcontainer): + last_decl_list_node = stcontainer.last_entry_in_decl_list() + last_decl_list_node.add_to_epilog(HIP_GPUFORT_RT_ACC_ENTER_REGION.format(\ + indent=indent,region_kind="implicit_region=.TRUE.")) + last_decl_list_node.add_to_epilog(acc_present_calls) + for stendorreturn in stcontainer.return_or_end_statements(): + stendorreturn.add_to_prolog(HIP_GPUFORT_RT_ACC_EXIT_REGION.format(\ + indent=indent,region_kind="implicit_region=.TRUE.")) class Acc2HipGpufortRT(AccBackendBase): # clauses @@ -212,7 +214,7 @@ class Acc2HipGpufortRT(AccBackendBase): condition=condition, result=result.rstrip("\n")) # introduce the new variables - _intrnl_add_device_vars_to_decl_list(stnode._parent,all_temp_vars) + add_device_vars_to_decl_list(stnode._parent,all_temp_vars) return result, len(result) @@ -259,7 +261,7 @@ class AccLoopKernel2HipGpufortRT(Acc2HipGpufortRT): result, _ = Acc2HipGpufortRT.transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index,handle_if=False) partial_result, transformed, temp_vars = self._handle_default() if transformed: - _intrnl_add_device_vars_to_decl_list(stloopkernel._parent,temp_vars) + add_device_vars_to_decl_list(stloopkernel._parent,temp_vars) result = result.rstrip("\n") + "\n" + partial_result partial_result, _ = STLoopKernel.transform(stloopkernel,joined_lines,joined_statements,statements_fully_cover_lines,index) result = result.rstrip("\n") + "\n" + partial_result @@ -290,18 +292,18 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): # construct at all~~ # TODO handle directly via directives; only variables occuring # in directives need to be available on device - fortran_constructs = stree.find_all(\ - lambda node: type(node) in [STProgram,STProcedure], - recursively=True) - for stnode in fortran_constructs: - last_decl_list_node = stnode.last_entry_in_decl_list() + containers = stree.find_all(\ + lambda node: type(node) in [STProgram,STProcedure], + recursively=True) + for stcontainer in containers: + last_decl_list_node = stcontainer.last_entry_in_decl_list() allocates = [] # look up STAllocate deallocates = [] # look up STDeallocate indent = last_decl_list_node.first_line_indent() # todo find return statement or end of function - scope = scoper.create_scope(index,stnode.tag()) + scope = scoper.create_scope(index,stcontainer.tag()) scope_vars = scope["variables"] - local_var_names, dummy_arg_names = stnode.local_and_dummy_variable_names(index) + local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) # TODO also process type members acc_present_calls = "" temp_vars = [] @@ -337,14 +339,10 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): elif is_used_module_var and is_allocatable_or_pointer: # find allocate, deallocate and write to epilog / prolog -> append to implicit region 0 / static data pass - _intrnl_add_device_vars_to_decl_list(stnode,temp_vars) + add_device_vars_to_decl_list(stcontainer,temp_vars) if len(acc_present_calls): - last_decl_list_node.add_to_epilog(HIP_GPUFORT_RT_ACC_ENTER_REGION.format(\ - indent=indent,region_kind="implicit_region=.TRUE.")) + add_implicit_region(stcontainer) last_decl_list_node.add_to_epilog(acc_present_calls) - for stendorreturn in stnode.return_or_end_statements(): - stendorreturn.add_to_prolog(HIP_GPUFORT_RT_ACC_EXIT_REGION.format(\ - indent=indent,region_kind="implicit_region=.TRUE.")) utils.logging.log_leave_function(LOG_PREFIX,"Acc2HipGpufortRTPostprocess.run") @@ -354,46 +352,41 @@ def AllocateHipGpufortRT(stallocate,index): parent_tag = stcontainer.tag() scope = scoper.create_scope(index,parent_tag) scope_vars = scope["variables"] - last_decl_list_node = stcontainer.last_entry_in_decl_list() - indent = last_decl_list_node.first_line_indent() + indent = stallocate.first_line_indent() local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) - # if is declared var and allocatable/pointer - # add temp vars acc_present_calls = "" + temp_vars = [] for var in stallocate.variable_names: - ivar,discovered = scoper.search_index_for_variable(index,parent_tag,var) - if discovered: - host_var = ivar["name"] - dev_var = dev_var_name(host_var) - is_local_var = host_var in local_var_names - is_arg = host_var in dummy_arg_names - is_used_module_var = not is_local_var and not is_arg - is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ - "pointer" in ivar["qualifiers"] - assert is_allocatable_or_pointer - # find return and end, emit 1 new implicit region for all - global_var = ",global=.TRUE." if is_used_module_var else "" - if ivar["declare_on_target"]=="alloc": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=global_var+",create=.TRUE.",dev_var=dev_var) - temp_vars.append(dev_var) - elif ivar["declare_on_target"]=="to": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=global_var+",copyin=.TRUE.",dev_var=dev_var) - temp_vars.append(dev_var) - elif ivar["declare_on_target"]=="tofrom": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=global_var+",copy=.TRUE.",dev_var=dev_var) - temp_vars.append(dev_var) - host_var = ivar["name"] - dev_var = dev_var_name(host_var) - is_local_var = host_var in local_var_names - is_arg = host_var in dummy_arg_names - is_used_module_var = not is_local_var and not is_arg - is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ - "pointer" in ivar["qualifiers"] + ivar,_ = scoper.search_index_for_variable(index,parent_tag,var) + host_var = ivar["name"] + dev_var = dev_var_name(host_var) + is_local_var = host_var in local_var_names + is_arg = host_var in dummy_arg_names + is_used_module_var = not is_local_var and not is_arg + is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ + "pointer" in ivar["qualifiers"] + assert is_allocatable_or_pointer + # find return and end, emit 1 new implicit region for all + global_var = ",global=.TRUE." if is_used_module_var else "" + if ivar["declare_on_target"]=="alloc": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=global_var+",create=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) + elif ivar["declare_on_target"]=="to": acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=",create=.TRUE.",dev_var=dev_var) + indent=indent,var=host_var,asyncr="",alloc=global_var+",copyin=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) + elif ivar["declare_on_target"]=="tofrom": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=global_var+",copy=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=",create=.TRUE.",dev_var=dev_var) + stallocate.add_to_epilog(acc_present_calls) + if is_used_module_var: + add_implicit_region(stcontainer) + + add_device_vars_to_decl_list(stcontainer,temp_vars) def DeallocateHipGpufortRT(stdeallocate,index): varnames = stdeallocate.variable_names @@ -402,6 +395,42 @@ def DeallocateHipGpufortRT(stdeallocate,index): stendorreturn.add_to_prolog(HIP_GPUFORT_RT_ACC_EXIT_REGION.format(\ indent=indent,region_kind="implicit_region=.TRUE.")) + varnames = stallocate.variable_names + stcontainer = stallocate._parent + parent_tag = stcontainer.tag() + scope = scoper.create_scope(index,parent_tag) + scope_vars = scope["variables"] + indent = stallocate.first_line_indent() + local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) + acc_present_calls = "" + temp_vars = [] + for var in stallocate.variable_names: + ivar,_ = scoper.search_index_for_variable(index,parent_tag,var) + host_var = ivar["name"] + dev_var = dev_var_name(host_var) + is_local_var = host_var in local_var_names + is_arg = host_var in dummy_arg_names + is_used_module_var = not is_local_var and not is_arg + is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ + "pointer" in ivar["qualifiers"] + assert is_allocatable_or_pointer + # find return and end, emit 1 new implicit region for all + global_var = ",global=.TRUE." if is_used_module_var else "" + if ivar["declare_on_target"]=="alloc": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=global_var+",create=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) + elif ivar["declare_on_target"]=="to": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=global_var+",copyin=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) + elif ivar["declare_on_target"]=="tofrom": + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=global_var+",copy=.TRUE.",dev_var=dev_var) + temp_vars.append(dev_var) + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + indent=indent,var=host_var,asyncr="",alloc=",create=.TRUE.",dev_var=dev_var) + stallocate.add_to_epilog(acc_present_calls) register_acc_backend("hip-gpufort-rt",\ diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index ee209b84..d1bc6020 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -268,6 +268,30 @@ class STContainerBase(STNode): if result == None: return self return result + def return_or_end_statements(self): + return self.find_all(filter=lambda stnode: type(stnode) == STEndOrReturn) + def append_to_decl_list(self,lines,prepend=False): + """ + Append lines to the last statement in the declaration list. + :param list lines: The lines to append. + :param bool prepend: Prepend new lines to previously append lines. + """ + last_decl_list_node = self.last_entry_in_decl_list() + indent = last_decl_list_node.first_line_indent() + if last_decl_list_node is None: + last_decl_list_node = self + for line in lines: + last_decl_list_node.add_to_epilog(indent+line,prepend) + def prepend_to_return_or_end_statements(self,lines): + """ + Prepend lines to the last statement in the declaration list. + :param list lines: The lines to append. + :param bool prepend: Prepend new lines to previously append lines. + """ + indent = last_decl_list_node.first_line_indent() + for return_or_end_node in self.return_or_end_statements(): + for line in lines: + return_or_end_node.add_to_prolog(indent+line) def tag(self): """Construct a tag that can be used to search the index.""" result = self.name.lower() @@ -278,8 +302,6 @@ class STContainerBase(STNode): recursive_parent_lookup(curr._parent) recursive_parent_lookup(self._parent) return result - def return_or_end_statements(self): - return self.find_all(filter=lambda stnode: type(stnode) == STEndOrReturn) def local_and_dummy_variable_names(self,index): """:return: names of local variables (1st retval) and dummy variables (2nd retval).""" # TODO can also be realised by subclass @@ -292,7 +314,7 @@ class STContainerBase(STNode): parent_tag = self._parent.tag() irecord, _ = scoper.search_index_for_subprogram(index,parent_tag,self.name) dummy_arg_names = irecord["dummy_args"] - local_var_names = [ivar["name"] for ivar in irecord["variables"] if ivar["name"] not in dummy_arg_names] + local_var_names = [ivar["name"] for ivar in irecord["variables"] if ivar["name"] not in dummy_arg_namesm return local_var_names, dummy_arg_names class STEndOrReturn(STNode): From ff233955f77ea3e171944886843d10d11ca1b0e8 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Tue, 19 Oct 2021 11:29:12 -0400 Subject: [PATCH 12/67] WiP on acc declare (unstable,testing) --- examples/openacc/vector-add-declare/Makefile | 2 +- .../cudafortran/scanner_tree_cuf.py.in | 16 +-- python/scanner/openacc/scanner_tree_acc.py.in | 19 ++- .../openacc/scanner_tree_acc2hipgccrt.py.in | 14 +- .../scanner_tree_acc2hipgpufortrt.py.in | 125 +++++++----------- python/scanner/scanner.py | 2 +- python/scanner/scanner_tree.py.in | 10 +- 7 files changed, 89 insertions(+), 99 deletions(-) diff --git a/examples/openacc/vector-add-declare/Makefile b/examples/openacc/vector-add-declare/Makefile index 27510cd2..8d738247 100644 --- a/examples/openacc/vector-add-declare/Makefile +++ b/examples/openacc/vector-add-declare/Makefile @@ -1,6 +1,6 @@ include ../rules.mk -TEST_SRC = vector-add.f90 vector-add-procedures.f90 +TEST_SRC = vector-add.f90 vector-add-procedures.f90 vector-add-globals.f90 TEST_NAME = $(TEST_SRC:.f90=) TEST_CONV_SRC = $(TEST_SRC:.f90=.f90-gpufort.f08) diff --git a/python/scanner/cudafortran/scanner_tree_cuf.py.in b/python/scanner/cudafortran/scanner_tree_cuf.py.in index 453a4a89..06cf3634 100644 --- a/python/scanner/cudafortran/scanner_tree_cuf.py.in +++ b/python/scanner/cudafortran/scanner_tree_cuf.py.in @@ -46,7 +46,7 @@ class STCufLoopKernel(STCufDirective,STLoopKernel): return CUF_LOOP_KERNEL_BACKENDS[checked_dialect](self).transform(\ joined_lines,joined_statements,statements_fully_cover_lines,index) -def handle_allocate_cuf(stallocate,joined_statements): +def handle_allocate_cuf(stallocate,joined_statements,index): indent = stallocate.first_line_indent() # CUF transformed = False @@ -62,7 +62,7 @@ def handle_allocate_cuf(stallocate,joined_statements): subst = stallocate.parse_result.hip_f_str(bytes_per_element,array_qualifiers,indent=indent).lstrip(" ") return (subst, transformed) -def handle_deallocate_cuf(stdeallocate,joined_statements): +def handle_deallocate_cuf(stdeallocate,joined_statements,index): indent = stdeallocate.first_line_indent() transformed = False array_qualifiers = [] @@ -76,7 +76,7 @@ def handle_deallocate_cuf(stdeallocate,joined_statements): subst = stdeallocate.parse_result.hip_f_str(array_qualifiers,indent=indent).lstrip(" ") return (subst, transformed) -def process_cuf(stree): +def postprocess_tree_cuf(stree,index,destination_dialect=""): """ Add use statements as well as handles plus their creation and destruction for certain math libraries. @@ -90,18 +90,16 @@ def process_cuf(stree): def has_cublas_call_(child): return type(child) is STCudaLibCall and child.has_cublas() cuf_cublas_calls = stree.find_all(filter=has_cublas_call_, recursively=True) - #print(cuf_cublas_calls) for call in cuf_cublas_calls: - begin = call._parent.find_last(filter=lambda child : type(child) in [STUseStatement,STDeclaration]) + last_decl_list_node = call.parent.last_entry_in_decl_list() indent = self.first_line_indent() - begin.add_to_epilog("{0}type(c_ptr) :: hipblasHandle = c_null_ptr\n".format(indent)) - #print(begin._linemaps) + last_decl_list_node.add_to_epilog("{0}type(c_ptr) :: hipblasHandle = c_null_ptr\n".format(indent)) local_cublas_calls = call._parent.find_all(filter=has_cublas_call, recursively=False) - first = local_cublas_calls[0] + first = local_cublas_calls[0] indent = self.first_line_indent() first.add_to_prolog("{0}hipblasCreate(hipblasHandle)\n".format(indent)) - last = local_cublas_calls[-1] + last = local_cublas_calls[-1] indent = self.first_line_indent() last.add_to_epilog("{0}hipblasDestroy(hipblasHandle)\n".format(indent)) diff --git a/python/scanner/openacc/scanner_tree_acc.py.in b/python/scanner/openacc/scanner_tree_acc.py.in index d74f708b..8bb433cd 100644 --- a/python/scanner/openacc/scanner_tree_acc.py.in +++ b/python/scanner/openacc/scanner_tree_acc.py.in @@ -16,16 +16,23 @@ class AccPostprocessBackendBase: ACC_BACKENDS = {} ACC_LOOP_KERNEL_BACKENDS = {} ACC_POSTPROCESS_BACKENDS = {} +ACC_ALLOCATE_BACKENDS = {} +ACC_DEALLOCATE_BACKENDS = {} def register_acc_backend(name,\ directive_generator_class,\ loop_kernel_generator_class,\ postprocess_class,\ + allocate_func,\ + deallocate_func,\ runtime_module_name): global SUPPORTED_DESTINATION_DIALECTS global RUNTIME_MODULE_NAMES - global ACC_BACKENDS + global ACC_BACKENDS global ACC_LOOP_KERNEL_BACKENDS + global ACC_POSTPROCESS_BACKENDS + global ACC_ALLOCATE_BACKENDS + global ACC_DEALLOCATE_BACKENDS if not name in SUPPORTED_DESTINATION_DIALECTS: SUPPORTED_DESTINATION_DIALECTS.append(name) @@ -33,6 +40,8 @@ def register_acc_backend(name,\ ACC_BACKENDS[name] = directive_generator_class ACC_LOOP_KERNEL_BACKENDS[name] = loop_kernel_generator_class ACC_POSTPROCESS_BACKENDS[name] = postprocess_class + ACC_ALLOCATE_BACKENDS[name] = allocate_func + ACC_DEALLOCATE_BACKENDS[name] = deallocate_func exec(open("{0}/openacc/scanner_tree_acc2omp.py.in".format(scanner_dir)).read()) exec(open("{0}/openacc/scanner_tree_acc2hipgpufortrt.py.in".format(scanner_dir)).read()) @@ -138,21 +147,21 @@ class STAccLoopKernel(STAccDirective,STLoopKernel): return ACC_LOOP_KERNEL_BACKENDS[checked_dialect](self).transform(\ joined_lines,joined_statements,statements_fully_cover_lines,index) -def handle_allocate_acc(stallocate,joined_statements,destination_dialect=""): +def handle_allocate_acc(stallocate,joined_statements,index,destination_dialect=""): indent = stallocate.first_line_indent() checked_dialect = check_destination_dialect(\ DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) - epilog = ACC_ALLOCATE_BACKENDS[checked_dialect](stallocate) + epilog = ACC_ALLOCATE_BACKENDS[checked_dialect](stallocate,index) if len(epilog): return joined_statements.rstrip("\n")+"\n"+epilog, True else: return joined_statements, False -def handle_deallocate_acc(stdeallocate,joined_statements,destination_dialect=""): +def handle_deallocate_acc(stdeallocate,joined_statements,index,destination_dialect=""): indent = stdeallocate.first_line_indent() checked_dialect = check_destination_dialect(\ DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) - prolog = ACC_DEALLOCATE_BACKENDS[checked_dialect](stdeallocate) + prolog = ACC_DEALLOCATE_BACKENDS[checked_dialect](stdeallocate,index) if len(prolog): return prolog.rstrip("\n") + "\n" + joined_statements.rstrip("\n"), True else: diff --git a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in index 7916bef6..fefa754b 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in @@ -175,4 +175,16 @@ class AccLoopKernel2HipGccRT(Acc2HipGccRT): condition=condition,result=result.rstrip("\n"),original="".join(stnode._lines).rstrip("\n")) return result, len(result) -register_acc_backend("hip-gcc-rt",Acc2HipGccRT,AccLoopKernel2HipGccRT,AccPostprocessBackendBase,"openacc_gomp") +def AllocateHipGccRT(stallocate,index): + pass + +def DeallocateHipGccRT(stdeallocate,index): + pass + +register_acc_backend("hip-gcc-rt",\ + Acc2HipGccRT,\ + AccLoopKernel2HipGccRT,\ + AccPostprocessBackendBase,\ + AllocateHipGccRT,\ + DeallocateHipGccRT,\ + "openacc_gomp") diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index 9b10ba72..5fd42831 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -35,6 +35,8 @@ MAPPING_CLAUSE_2_TEMPLATE_MAP = { "present": HIP_GPUFORT_RT_ACC_PRESENT } +HIP_GPUFORT_RT_CLAUSES_OMP2ACC={"alloc":"create","to":"copyin","tofrom":"copy"} + def dev_var_name(var): #tokens = var.split("%") #tokens[-1] = ACC_DEV_PREFIX+tokens[-1]+ACC_DEV_SUFFIX @@ -47,9 +49,9 @@ def dev_var_name(var): result = result.replace("$","_") return ACC_DEV_PREFIX + result + ACC_DEV_SUFFIX -def add_device_vars_to_decl_list(stnode,temp_vars): +def add_device_vars_to_decl_list(stcontainer,temp_vars): # introduce the new variables - stnode.append_to_decl_list(["type(c_ptr) :: {var}\n".format(var=var) for var in temp_vars]) + stcontainer.append_to_decl_list(["type(c_ptr) :: {var}\n".format(var=var) for var in temp_vars]) def add_implicit_region(stcontainer): last_decl_list_node = stcontainer.last_entry_in_decl_list() @@ -288,8 +290,8 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): :param staccdirectives: All acc directive tree nodes.""" utils.logging.log_enter_function(LOG_PREFIX,"Acc2HipGpufortRTPostprocess.run") - # ~~TODO check if there is any acc used in the - # construct at all~~ + # TODO check if there is any acc used in the + # construct at all # TODO handle directly via directives; only variables occuring # in directives need to be available on device containers = stree.find_all(\ @@ -306,48 +308,36 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) # TODO also process type members acc_present_calls = "" - temp_vars = [] + temp_vars = [] + implicit_region = False for ivar in scope_vars: host_var = ivar["name"] dev_var = dev_var_name(host_var) is_local_var = host_var in local_var_names is_arg = host_var in dummy_arg_names is_used_module_var = not is_local_var and not is_arg - is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ - "pointer" in ivar["qualifiers"] - if (is_arg or is_local_var) and not is_allocatable_or_pointer: + is_allocatable = "allocatable" in ivar["qualifiers"] + is_pointer = "pointer" in ivar["qualifiers"] + if not is_allocatable: + if not is_used_module_var: implicit_region = True + global_var = ",global=.TRUE." if is_used_module_var else "" + cond = "if (associated({var})) " if is_pointer else "" + acc_present_template = (cond+HIP_GPUFORT_RT_ACC_PRESENT) # find return and end, emit 1 new implicit region for all - if ivar["declare_on_target"]=="alloc": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=",create=.TRUE.",dev_var=dev_var) - temp_vars.append(dev_var) - elif ivar["declare_on_target"]=="to": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=",copyin=.TRUE.",dev_var=dev_var) + if ivar["declare_on_target"] in HIP_GPUFORT_RT_CLAUSES_OMP2ACC.keys(): + map_kind=HIP_GPUFORT_RT_CLAUSES_OMP2ACC[ivar["declare_on_target"]] + acc_present_calls += acc_present_template.format(\ + indent=indent,var=host_var,asyncr="",\ + alloc=global_var+","+map_kind+"=.TRUE.",dev_var=dev_var) temp_vars.append(dev_var) - elif ivar["declare_on_target"]=="tofrom": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=",copy=.TRUE.",dev_var=dev_var) - temp_vars.append(dev_var) - elif (is_arg or is_local_var) and is_allocatable_or_pointer: - # find return and end, emit 1 new (un)structured region for all - # find allocate, deallocate with var as arg and write to epilog / prolog - pass - elif is_used_module_var and not is_allocatable_or_pointer: - # ensure it is present in implicit region 0 / static data - pass - elif is_used_module_var and is_allocatable_or_pointer: - # find allocate, deallocate and write to epilog / prolog -> append to implicit region 0 / static data - pass - add_device_vars_to_decl_list(stcontainer,temp_vars) if len(acc_present_calls): - add_implicit_region(stcontainer) + add_device_vars_to_decl_list(stcontainer,temp_vars) + if implicit_region: add_implicit_region(stcontainer) last_decl_list_node.add_to_epilog(acc_present_calls) utils.logging.log_leave_function(LOG_PREFIX,"Acc2HipGpufortRTPostprocess.run") def AllocateHipGpufortRT(stallocate,index): - varnames = stallocate.variable_names stcontainer = stallocate._parent parent_tag = stcontainer.tag() scope = scoper.create_scope(index,parent_tag) @@ -356,6 +346,7 @@ def AllocateHipGpufortRT(stallocate,index): local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) acc_present_calls = "" temp_vars = [] + implicit_region = False for var in stallocate.variable_names: ivar,_ = scoper.search_index_for_variable(index,parent_tag,var) host_var = ivar["name"] @@ -366,45 +357,31 @@ def AllocateHipGpufortRT(stallocate,index): is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ "pointer" in ivar["qualifiers"] assert is_allocatable_or_pointer - # find return and end, emit 1 new implicit region for all global_var = ",global=.TRUE." if is_used_module_var else "" - if ivar["declare_on_target"]=="alloc": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=global_var+",create=.TRUE.",dev_var=dev_var) + if not is_used_module_var: implicit_region = True + if ivar["declare_on_target"] in HIP_GPUFORT_RT_CLAUSES_OMP2ACC.keys(): + map_kind=HIP_GPUFORT_RT_CLAUSES_OMP2ACC[ivar["declare_on_target"]] + acc_present_calls += acc_present_template.format(\ + indent=indent,var=host_var,asyncr="",\ + alloc=global_var+","+map_kind+"=.TRUE.",dev_var=dev_var) temp_vars.append(dev_var) - elif ivar["declare_on_target"]=="to": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=global_var+",copyin=.TRUE.",dev_var=dev_var) - temp_vars.append(dev_var) - elif ivar["declare_on_target"]=="tofrom": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=global_var+",copy=.TRUE.",dev_var=dev_var) - temp_vars.append(dev_var) - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=",create=.TRUE.",dev_var=dev_var) - stallocate.add_to_epilog(acc_present_calls) - if is_used_module_var: - add_implicit_region(stcontainer) - - add_device_vars_to_decl_list(stcontainer,temp_vars) -def DeallocateHipGpufortRT(stdeallocate,index): - varnames = stdeallocate.variable_names - # if is declared var and allocatable/pointer - # add temp vars - stendorreturn.add_to_prolog(HIP_GPUFORT_RT_ACC_EXIT_REGION.format(\ - indent=indent,region_kind="implicit_region=.TRUE.")) + if len(acc_present_calls): + add_device_vars_to_decl_list(stcontainer,temp_vars) + if implicit_region: add_implicit_region(stcontainer) + stallocate.add_to_epilog(acc_present_calls) - varnames = stallocate.variable_names - stcontainer = stallocate._parent +def DeallocateHipGpufortRT(stdeallocate,index): + stcontainer = stdeallocate._parent parent_tag = stcontainer.tag() scope = scoper.create_scope(index,parent_tag) scope_vars = scope["variables"] - indent = stallocate.first_line_indent() + indent = stdeallocate.first_line_indent() local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) - acc_present_calls = "" + acc_delete_calls = "" temp_vars = [] - for var in stallocate.variable_names: + implicit_region = False + for var in stdeallocate.variable_names: ivar,_ = scoper.search_index_for_variable(index,parent_tag,var) host_var = ivar["name"] dev_var = dev_var_name(host_var) @@ -414,27 +391,21 @@ def DeallocateHipGpufortRT(stdeallocate,index): is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ "pointer" in ivar["qualifiers"] assert is_allocatable_or_pointer - # find return and end, emit 1 new implicit region for all global_var = ",global=.TRUE." if is_used_module_var else "" - if ivar["declare_on_target"]=="alloc": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + if ivar["declare_on_target"] in ["alloc","to","tofrom"]: + acc_delete_calls += HIP_GPUFORT_RT_ACC_DELETE.format(\ indent=indent,var=host_var,asyncr="",alloc=global_var+",create=.TRUE.",dev_var=dev_var) temp_vars.append(dev_var) - elif ivar["declare_on_target"]=="to": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=global_var+",copyin=.TRUE.",dev_var=dev_var) - temp_vars.append(dev_var) - elif ivar["declare_on_target"]=="tofrom": - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=global_var+",copy=.TRUE.",dev_var=dev_var) - temp_vars.append(dev_var) - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ - indent=indent,var=host_var,asyncr="",alloc=",create=.TRUE.",dev_var=dev_var) - stallocate.add_to_epilog(acc_present_calls) - + if len(acc_delete_calls): + add_device_vars_to_decl_list(stcontainer,temp_vars) + stdeallocate.add_to_epilog(acc_delete_calls) + if implicit_region: + add_implicit_region(stcontainer) register_acc_backend("hip-gpufort-rt",\ Acc2HipGpufortRT,\ AccLoopKernel2HipGpufortRT,\ Acc2HipGpufortRTPostprocess,\ + AllocateHipGpufortRT,\ + DeallocateHipGpufortRT,\ "gpufort_acc_runtime") diff --git a/python/scanner/scanner.py b/python/scanner/scanner.py index 1df7b9a7..df0c7e0d 100644 --- a/python/scanner/scanner.py +++ b/python/scanner/scanner.py @@ -572,7 +572,7 @@ def is_accelerated(child): stnode.add_to_prolog("{}use {}{}\n".format(indent,module_name,hip_module_suffix)) if "cuf" in SOURCE_DIALECTS: - postprocess_cuf(stree) + postprocess_tree_cuf(stree,index) if "acc" in SOURCE_DIALECTS: postprocess_tree_acc(stree,index) utils.logging.log_leave_function(LOG_PREFIX,"postprocess") diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index d1bc6020..b627fc93 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -634,11 +634,11 @@ class STAllocate(STNode): def __init__(self,parent,first_linemap,first_linemap_first_statement): STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) self.parse_result = translator.allocate.parseString(self.statements()[0])[0] - self.variable_names = self.parse_result.variable_names() + self.variable_names = self.parse_result.variable_names() def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO indent = self.first_line_indent() - result1, transformed1 = handle_allocate_cuf(self,joined_statements) - result2, transformed2 = handle_allocate_acc(self,result1) + result1, transformed1 = handle_allocate_cuf(self,joined_statements,index) + result2, transformed2 = handle_allocate_acc(self,result1,index) return result2, (transformed1 or transformed2) class STDeallocate(STNode): @@ -651,8 +651,8 @@ class STDeallocate(STNode): :note: `wrap_in_if_def` can be deactivated if a higher level function embeds the outcome already in an `ifdef`. """ - result1, transformed1 = handle_deallocate_cuf(self,joined_statements) - result2, transformed2 = handle_deallocate_acc(self,result1) + result1, transformed1 = handle_deallocate_cuf(self,joined_statements,index) + result2, transformed2 = handle_deallocate_acc(self,result1,index) return result2, (transformed1 or transformed2) From a0429d3a4fc091056003594557cb2e185432b1c8 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Tue, 19 Oct 2021 12:03:37 -0400 Subject: [PATCH 13/67] WiP on acc declare: Add example (unstable) --- .../vector-add-declare/vector-add-globals.f90 | 46 +++++++++++++++++++ .../openacc/scanner_tree_acc2hipgccrt.py.in | 4 +- .../scanner_tree_acc2hipgpufortrt.py.in | 38 +++++++-------- .../openacc/scanner_tree_acc2omp.py.in | 14 +++++- python/scanner/scanner_tree.py.in | 4 +- 5 files changed, 79 insertions(+), 27 deletions(-) create mode 100644 examples/openacc/vector-add-declare/vector-add-globals.f90 diff --git a/examples/openacc/vector-add-declare/vector-add-globals.f90 b/examples/openacc/vector-add-declare/vector-add-globals.f90 new file mode 100644 index 00000000..48792589 --- /dev/null +++ b/examples/openacc/vector-add-declare/vector-add-globals.f90 @@ -0,0 +1,46 @@ +module datatypes + integer, parameter :: N = 1000 + integer,allocatable,dimension(:) :: x1 + integer,pointer,dimension(:) :: x2 + integer :: y(N) + !$acc declare create(x1,x2,y) +end module + +program main + ! begin of program + + use datatypes + implicit none + integer :: i + integer(4) :: y_exact(N) + + allocate(x1(N),x2(N)) + + do i = 1, N + y_exact(i) = 4 + end do + + !$acc parallel loop + do i = 1, N + x1(i) = 1 + x2(i) = 1 + y(i) = 2 + end do + + !$acc parallel loop + do i = 1, N + y(i) = x1(i) + x2(i) + y(i) + end do + + !$acc update host(y) + + do i = 1, N + if ( y_exact(i) .ne.& + y(i) ) ERROR STOP "GPU and CPU result do not match" + end do + + print *, "PASSED" + + deallocate(x1,x2) + +end program diff --git a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in index fefa754b..eca75c4e 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgccrt.py.in @@ -176,10 +176,10 @@ class AccLoopKernel2HipGccRT(Acc2HipGccRT): return result, len(result) def AllocateHipGccRT(stallocate,index): - pass + return "" def DeallocateHipGccRT(stdeallocate,index): - pass + return "" register_acc_backend("hip-gcc-rt",\ Acc2HipGccRT,\ diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index 5fd42831..fa197880 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -11,7 +11,7 @@ HIP_GPUFORT_RT_ACC_CREATE = "{indent}{dev_var} = gpufort_acc_create({var})\n" # no_create HIP_GPUFORT_RT_ACC_NO_CREATE = "{indent}{dev_var} = gpufort_acc_no_create({var})\n" # delete -HIP_GPUFORT_RT_ACC_DELETE = "{indent}call gpufort_acc_delete({var}{finalize})\n" +HIP_GPUFORT_RT_ACC_DELETE = "{indent}call gpufort_acc_delete({var}{alloc}{finalize})\n" # copyin HIP_GPUFORT_RT_ACC_COPYIN = "{indent}{dev_var} = gpufort_acc_copyin({var}{asyncr})\n" # copy @@ -51,13 +51,15 @@ def dev_var_name(var): def add_device_vars_to_decl_list(stcontainer,temp_vars): # introduce the new variables - stcontainer.append_to_decl_list(["type(c_ptr) :: {var}\n".format(var=var) for var in temp_vars]) + stcontainer.append_to_decl_list(\ + ["type(c_ptr) :: {var}\n".format(var=var) for var in temp_vars],\ + prepend=True) def add_implicit_region(stcontainer): last_decl_list_node = stcontainer.last_entry_in_decl_list() + indent = last_decl_list_node.first_line_indent() last_decl_list_node.add_to_epilog(HIP_GPUFORT_RT_ACC_ENTER_REGION.format(\ indent=indent,region_kind="implicit_region=.TRUE.")) - last_decl_list_node.add_to_epilog(acc_present_calls) for stendorreturn in stcontainer.return_or_end_statements(): stendorreturn.add_to_prolog(HIP_GPUFORT_RT_ACC_EXIT_REGION.format(\ indent=indent,region_kind="implicit_region=.TRUE.")) @@ -99,7 +101,8 @@ class Acc2HipGpufortRT(AccBackendBase): for i,var_expr in enumerate(var_expressions): deviceptr = dev_var_name(var_names[i]) template = MAPPING_CLAUSE_2_TEMPLATE_MAP[clause.kind] - result += template.format(indent=indent,var=var_expr,dev_var=deviceptr,asyncr=self._handle_async(),alloc="") + result += template.format(indent=indent,var=var_expr,dev_var=deviceptr,\ + asyncr=self._handle_async(),alloc="",finalize="") temp_vars.add(deviceptr) return result, len(result), temp_vars def _handle_update(self): @@ -299,10 +302,7 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): recursively=True) for stcontainer in containers: last_decl_list_node = stcontainer.last_entry_in_decl_list() - allocates = [] # look up STAllocate - deallocates = [] # look up STDeallocate indent = last_decl_list_node.first_line_indent() - # todo find return statement or end of function scope = scoper.create_scope(index,stcontainer.tag()) scope_vars = scope["variables"] local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) @@ -321,7 +321,7 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): if not is_allocatable: if not is_used_module_var: implicit_region = True global_var = ",global=.TRUE." if is_used_module_var else "" - cond = "if (associated({var})) " if is_pointer else "" + cond = "{indent}if (associated({var})) " if is_pointer else "" acc_present_template = (cond+HIP_GPUFORT_RT_ACC_PRESENT) # find return and end, emit 1 new implicit region for all if ivar["declare_on_target"] in HIP_GPUFORT_RT_CLAUSES_OMP2ACC.keys(): @@ -361,15 +361,15 @@ def AllocateHipGpufortRT(stallocate,index): if not is_used_module_var: implicit_region = True if ivar["declare_on_target"] in HIP_GPUFORT_RT_CLAUSES_OMP2ACC.keys(): map_kind=HIP_GPUFORT_RT_CLAUSES_OMP2ACC[ivar["declare_on_target"]] - acc_present_calls += acc_present_template.format(\ + acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ indent=indent,var=host_var,asyncr="",\ alloc=global_var+","+map_kind+"=.TRUE.",dev_var=dev_var) temp_vars.append(dev_var) - if len(acc_present_calls): - add_device_vars_to_decl_list(stcontainer,temp_vars) - if implicit_region: add_implicit_region(stcontainer) - stallocate.add_to_epilog(acc_present_calls) + if len(acc_present_calls): + add_device_vars_to_decl_list(stcontainer,temp_vars) + if implicit_region: add_implicit_region(stcontainer) + return acc_present_calls def DeallocateHipGpufortRT(stdeallocate,index): stcontainer = stdeallocate._parent @@ -379,8 +379,6 @@ def DeallocateHipGpufortRT(stdeallocate,index): indent = stdeallocate.first_line_indent() local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) acc_delete_calls = "" - temp_vars = [] - implicit_region = False for var in stdeallocate.variable_names: ivar,_ = scoper.search_index_for_variable(index,parent_tag,var) host_var = ivar["name"] @@ -394,13 +392,9 @@ def DeallocateHipGpufortRT(stdeallocate,index): global_var = ",global=.TRUE." if is_used_module_var else "" if ivar["declare_on_target"] in ["alloc","to","tofrom"]: acc_delete_calls += HIP_GPUFORT_RT_ACC_DELETE.format(\ - indent=indent,var=host_var,asyncr="",alloc=global_var+",create=.TRUE.",dev_var=dev_var) - temp_vars.append(dev_var) - if len(acc_delete_calls): - add_device_vars_to_decl_list(stcontainer,temp_vars) - stdeallocate.add_to_epilog(acc_delete_calls) - if implicit_region: - add_implicit_region(stcontainer) + indent=indent,var=host_var,asyncr="",finalize="",\ + alloc=global_var,dev_var=dev_var) + return acc_delete_calls register_acc_backend("hip-gpufort-rt",\ Acc2HipGpufortRT,\ diff --git a/python/scanner/openacc/scanner_tree_acc2omp.py.in b/python/scanner/openacc/scanner_tree_acc2omp.py.in index 86f02d03..09c3b36e 100644 --- a/python/scanner/openacc/scanner_tree_acc2omp.py.in +++ b/python/scanner/openacc/scanner_tree_acc2omp.py.in @@ -32,4 +32,16 @@ class AccLoopKernel2Omp(AccBackendBase): utils.logging.log_exception(LOG_PREFIX,"AccLoopKernel2Omp.transform","failed to convert kernel "+str(snippet)) sys.exit(2) -register_acc_backend("omp",Acc2Omp,AccLoopKernel2Omp,AccPostprocessBackendBase,None) +def AllocateOmp(stallocate,index): + return "" + +def DeallocateOmp(stdeallocate,index): + return "" + +register_acc_backend("omp",\ + Acc2Omp,\ + AccLoopKernel2Omp,\ + AccPostprocessBackendBase,\ + AllocateOmp,\ + DeallocateOmp,\ + None) diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index b627fc93..63538183 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -314,7 +314,7 @@ class STContainerBase(STNode): parent_tag = self._parent.tag() irecord, _ = scoper.search_index_for_subprogram(index,parent_tag,self.name) dummy_arg_names = irecord["dummy_args"] - local_var_names = [ivar["name"] for ivar in irecord["variables"] if ivar["name"] not in dummy_arg_namesm + local_var_names = [ivar["name"] for ivar in irecord["variables"] if ivar["name"] not in dummy_arg_names] return local_var_names, dummy_arg_names class STEndOrReturn(STNode): @@ -593,7 +593,7 @@ def pinned_or_on_device(ivar): """:return: Qualifier and if special treatment is necessary.""" if "device" in ivar["qualifiers"]: return "device", True - elif "pinned" in ivar["qualifiers"] + elif "pinned" in ivar["qualifiers"] : return "pinned", True else: return None, False From b15d170572739cbd79e875b6ffd10b4a5a33c106 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Tue, 19 Oct 2021 12:21:09 -0400 Subject: [PATCH 14/67] WiP on declare output formatting --- python/scanner/openacc/scanner_tree_acc.py.in | 4 ++-- python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/python/scanner/openacc/scanner_tree_acc.py.in b/python/scanner/openacc/scanner_tree_acc.py.in index 8bb433cd..1ba3a786 100644 --- a/python/scanner/openacc/scanner_tree_acc.py.in +++ b/python/scanner/openacc/scanner_tree_acc.py.in @@ -153,7 +153,7 @@ def handle_allocate_acc(stallocate,joined_statements,index,destination_dialect=" DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) epilog = ACC_ALLOCATE_BACKENDS[checked_dialect](stallocate,index) if len(epilog): - return joined_statements.rstrip("\n")+"\n"+epilog, True + return indent + joined_statements.rstrip("\n")+"\n"+epilog, True else: return joined_statements, False @@ -163,7 +163,7 @@ def handle_deallocate_acc(stdeallocate,joined_statements,index,destination_diale DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) prolog = ACC_DEALLOCATE_BACKENDS[checked_dialect](stdeallocate,index) if len(prolog): - return prolog.rstrip("\n") + "\n" + joined_statements.rstrip("\n"), True + return prolog.rstrip("\n") + "\n" + indent + joined_statements.rstrip("\n"), True else: return joined_statements, False diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index fa197880..a68424f4 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -321,8 +321,11 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): if not is_allocatable: if not is_used_module_var: implicit_region = True global_var = ",global=.TRUE." if is_used_module_var else "" - cond = "{indent}if (associated({var})) " if is_pointer else "" - acc_present_template = (cond+HIP_GPUFORT_RT_ACC_PRESENT) + if is_pointer: + cond = "{indent}if (associated({var})) " + acc_present_template = (cond+HIP_GPUFORT_RT_ACC_PRESENT.replace("{indent}","")) + else: + acc_present_template = HIP_GPUFORT_RT_ACC_PRESENT # find return and end, emit 1 new implicit region for all if ivar["declare_on_target"] in HIP_GPUFORT_RT_CLAUSES_OMP2ACC.keys(): map_kind=HIP_GPUFORT_RT_CLAUSES_OMP2ACC[ivar["declare_on_target"]] From 5775e5eff2ea6fe03934c468a14103b8b4fa814d Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Tue, 19 Oct 2021 12:21:09 -0400 Subject: [PATCH 15/67] WiP on declare output formatting --- ...globals.f90 => vector-add-module-vars.f90} | 0 python/scanner/openacc/scanner_tree_acc.py.in | 4 +- .../scanner_tree_acc2hipgpufortrt.py.in | 7 +- runtime/examples/gpufort_acc_runtime/Makefile | 21 - .../multi-module-test/test_acc | Bin 390440 -> 0 bytes .../gpufort_acc_runtime/nested-scope/test_acc | Bin 390288 -> 0 bytes runtime/gpufort_acc_runtime/examples/Makefile | 23 + .../examples/test-nested-regions-1.f90 | 36 + .../examples/test-nested-regions-2.f90} | 40 +- .../examples/test-unstructured-data.f90} | 34 +- runtime/gpufort_acc_runtime/rules.mk | 4 +- .../src/gpufort_acc_runtime_base.f90 | 752 +++++++++++------- .../examples}/Makefile | 0 .../examples}/hipblasSaxpy.f90 | 0 .../examples}/structured_data_region.f90 | 0 .../examples}/unstructured_data_region.f90 | 0 16 files changed, 566 insertions(+), 355 deletions(-) rename examples/openacc/vector-add-declare/{vector-add-globals.f90 => vector-add-module-vars.f90} (100%) delete mode 100644 runtime/examples/gpufort_acc_runtime/Makefile delete mode 100755 runtime/examples/gpufort_acc_runtime/multi-module-test/test_acc delete mode 100755 runtime/examples/gpufort_acc_runtime/nested-scope/test_acc create mode 100644 runtime/gpufort_acc_runtime/examples/Makefile create mode 100644 runtime/gpufort_acc_runtime/examples/test-nested-regions-1.f90 rename runtime/{examples/gpufort_acc_runtime/nested-scope/test_acc.f90 => gpufort_acc_runtime/examples/test-nested-regions-2.f90} (53%) rename runtime/{examples/gpufort_acc_runtime/multi-module-test/test_acc.f90 => gpufort_acc_runtime/examples/test-unstructured-data.f90} (73%) rename runtime/{examples/openacc_gomp => openacc_gomp/examples}/Makefile (100%) rename runtime/{examples/openacc_gomp => openacc_gomp/examples}/hipblasSaxpy.f90 (100%) rename runtime/{examples/openacc_gomp => openacc_gomp/examples}/structured_data_region.f90 (100%) rename runtime/{examples/openacc_gomp => openacc_gomp/examples}/unstructured_data_region.f90 (100%) diff --git a/examples/openacc/vector-add-declare/vector-add-globals.f90 b/examples/openacc/vector-add-declare/vector-add-module-vars.f90 similarity index 100% rename from examples/openacc/vector-add-declare/vector-add-globals.f90 rename to examples/openacc/vector-add-declare/vector-add-module-vars.f90 diff --git a/python/scanner/openacc/scanner_tree_acc.py.in b/python/scanner/openacc/scanner_tree_acc.py.in index 8bb433cd..1ba3a786 100644 --- a/python/scanner/openacc/scanner_tree_acc.py.in +++ b/python/scanner/openacc/scanner_tree_acc.py.in @@ -153,7 +153,7 @@ def handle_allocate_acc(stallocate,joined_statements,index,destination_dialect=" DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) epilog = ACC_ALLOCATE_BACKENDS[checked_dialect](stallocate,index) if len(epilog): - return joined_statements.rstrip("\n")+"\n"+epilog, True + return indent + joined_statements.rstrip("\n")+"\n"+epilog, True else: return joined_statements, False @@ -163,7 +163,7 @@ def handle_deallocate_acc(stdeallocate,joined_statements,index,destination_diale DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) prolog = ACC_DEALLOCATE_BACKENDS[checked_dialect](stdeallocate,index) if len(prolog): - return prolog.rstrip("\n") + "\n" + joined_statements.rstrip("\n"), True + return prolog.rstrip("\n") + "\n" + indent + joined_statements.rstrip("\n"), True else: return joined_statements, False diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index fa197880..a68424f4 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -321,8 +321,11 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): if not is_allocatable: if not is_used_module_var: implicit_region = True global_var = ",global=.TRUE." if is_used_module_var else "" - cond = "{indent}if (associated({var})) " if is_pointer else "" - acc_present_template = (cond+HIP_GPUFORT_RT_ACC_PRESENT) + if is_pointer: + cond = "{indent}if (associated({var})) " + acc_present_template = (cond+HIP_GPUFORT_RT_ACC_PRESENT.replace("{indent}","")) + else: + acc_present_template = HIP_GPUFORT_RT_ACC_PRESENT # find return and end, emit 1 new implicit region for all if ivar["declare_on_target"] in HIP_GPUFORT_RT_CLAUSES_OMP2ACC.keys(): map_kind=HIP_GPUFORT_RT_CLAUSES_OMP2ACC[ivar["declare_on_target"]] diff --git a/runtime/examples/gpufort_acc_runtime/Makefile b/runtime/examples/gpufort_acc_runtime/Makefile deleted file mode 100644 index 791355f9..00000000 --- a/runtime/examples/gpufort_acc_runtime/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -FOPTS ?= -std=f2008 -ffree-line-length-none - -GPUFORT_ACC_DIR = $(shell gpufort --path)/runtime/gpufort_acc_runtime -ACC_INC = -I$(GPUFORT_ACC_DIR)/include -ACC_LIB = -L$(GPUFORT_ACC_DIR)/lib -lgpufort_acc - -.PHONY: nested-scope multi-module-test clean all - -all: nested-scope multi-module-test - -nested-scope: clean - cd $@ && hipfc test_acc.f90 -o test_acc $(FOPTS) $(ACC_INC) $(ACC_LIB) - cd $@ && HIP_TRACE_API=1 ./test_acc - -multi-module-test: clean - cd $@ && hipfc test_acc.f90 -o test_acc $(FOPTS) $(ACC_INC) $(ACC_LIB) - cd $@ && ./test_acc - -clean: - cd nested-scope && rm -f *.o *.mod test_acc - cd multi-module-test && rm -f *.o *.mod test_acc diff --git a/runtime/examples/gpufort_acc_runtime/multi-module-test/test_acc b/runtime/examples/gpufort_acc_runtime/multi-module-test/test_acc deleted file mode 100755 index 72f8c951f51ff3ef5dacbe151c765eedb7734257..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 390440 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 + integer, save :: NUM_REFS_TO_DEALLOCATE = -5 ! dealloc device mem only if num_refs takes this value - logical, save :: initialized_ = .FALSE. - - integer, save :: last_record_index_ = 0 + integer, save :: record_creation_counter_ = 0 + logical, save :: initialized_ = .false. integer, save :: last_queue_index_ = 0 - integer, save :: current_region_ = 0 - integer(c_size_t), save :: total_memory_b_ = 0 - !> Creational events for a record enum, bind(c) enumerator :: gpufort_acc_event_undefined = 0 @@ -59,49 +53,96 @@ module gpufort_acc_runtime_base !> Data structure that maps a host to a device pointer. type :: t_record - integer :: id = 1 - type(c_ptr) :: hostptr = c_null_ptr - type(c_ptr) :: deviceptr = c_null_ptr - integer(c_size_t) :: num_bytes = 0 - integer :: num_refs = 0 - integer :: region = 0 + integer :: id = -1 + type(c_ptr) :: hostptr = c_null_ptr + type(c_ptr) :: deviceptr = c_null_ptr + integer :: region = -1 + integer(c_size_t) :: num_bytes = 0 + integer(c_size_t) :: num_bytes_used = 0 + integer :: num_refs = 0 integer(kind(gpufort_acc_event_create)) :: creational_event = gpufort_acc_event_undefined contains - procedure :: print => t_record_print_ - procedure :: is_initialized => t_record_is_initialized_ - procedure :: is_subarray => t_record_is_subarray_ - procedure :: initialize => t_record_initialize_ - procedure :: destroy => t_record_destroy_ - procedure :: copy_to_device => t_record_copy_to_device_ - procedure :: copy_to_host => t_record_copy_to_host_ + procedure :: print => t_record_print_ + procedure :: is_initialized => t_record_is_initialized_ + procedure :: is_used => t_record_is_used_ + procedure :: is_released => t_record_is_released_ + procedure :: is_subarray => t_record_is_subarray_ + procedure :: setup => t_record_setup_ + procedure :: release => t_record_release_ + procedure :: destroy => t_record_destroy_ + procedure :: copy_to_device => t_record_copy_to_device_ + procedure :: copy_to_host => t_record_copy_to_host_ procedure :: decrement_num_refs => t_record_decrement_num_refs_ procedure :: increment_num_refs => t_record_increment_num_refs_ end type + !> Data structure managing records and storing associated metadata. + type :: t_record_list + type(t_record), allocatable :: records(:) + integer :: last_record_index = 0 + integer :: current_region = 0 + integer(c_size_t) :: total_memory_bytes = 0 + + contains + procedure :: is_initialized => t_record_list_is_initialized_ + procedure :: initialize => t_record_list_initialize_ + procedure :: grow => t_record_list_grow_ + procedure :: destroy => t_record_list_destroy_ + procedure :: find_record => t_record_list_find_record_ + procedure :: find_available_record => t_record_list_find_available_record_ + procedure :: use_increment_record => t_record_list_use_increment_record_ + procedure :: decrement_release_record => t_record_list_decrement_release_record_ + end type + !> Data structure to map integer numbers to queues. type :: t_queue type(c_ptr) :: queueptr = c_null_ptr - integer :: num_refs = 0 + integer :: num_refs = 0 contains - procedure :: is_initialized => t_queue_is_initialized_ - procedure :: initialize => t_queue_initialize_ - procedure :: destroy => t_queue_destroy_ + procedure :: is_initialized => t_queue_is_initialized_ + procedure :: initialize => t_queue_initialize_ + procedure :: destroy => t_queue_destroy_ procedure :: decrement_num_refs => t_queue_decrement_num_refs_ procedure :: increment_num_refs => t_queue_increment_num_refs_ end type - type(t_record), save, allocatable, private :: records_(:) - type(t_queue), save, private :: queues_(MAX_QUEUES) + type(t_record_list),save :: record_list_ + type(t_queue),allocatable,save :: queues_(:) contains + + function eval_opt_logical_(optval,fallback) result(retval) + implicit none + logical,optional,intent(in) :: optval + logical,intent(in) :: fallback + logical :: retval + if ( present(optval) ) then + retval = optval + else + retval = fallback + endif + end function + + function eval_opt_integer_(optval,fallback) result(retval) + implicit none + integer,optional,intent(in) :: optval + integer,intent(in) :: fallback + integer :: retval + if ( present(optval) ) then + retval = optval + else + retval = fallback + endif + end function ! ! debugging/analysis ! function gpufort_acc_runtime_record_exists(hostptr,id,print_record) result(success) + use iso_fortran_env use iso_c_binding implicit none type(c_ptr),intent(in),optional :: hostptr @@ -113,16 +154,19 @@ function gpufort_acc_runtime_record_exists(hostptr,id,print_record) result(succe integer :: i logical :: opt_print_record ! - opt_print_record = .FALSE. + opt_print_record = .false. ! if ( present(print_record) ) opt_print_record = print_record ! - success = .FALSE. - do i = 1, last_record_index_ - if ( ( present(hostptr) .and. records_(i)%is_subarray(hostptr,0_8) ) .or. & - ( present(id) .and. records_(i)%id .eq. id ) ) then - success = .TRUE. - if ( opt_print_record ) CALL records_(i)%print() + success = .false. + do i = 1, record_list_%last_record_index + if ( ( present(hostptr) .and. record_list_%records(i)%is_subarray(hostptr,0_8) ) .or. & + ( present(id) .and. record_list_%records(i)%id .eq. id ) ) then + success = .true. + if ( opt_print_record ) then + CALL record_list_%records(i)%print() + flush(output_unit) + endif exit ! loop endif end do @@ -138,43 +182,44 @@ function gpufort_acc_runtime_get_record_id(hostptr) result(id) ! integer :: i ! - do i = 1, last_record_index_ - if ( records_(i)%is_subarray(hostptr,0_8) ) then - id = records_(i)%id + do i = 1, record_list_%last_record_index + if ( record_list_%records(i)%is_subarray(hostptr,0_8) ) then + id = record_list_%records(i)%id exit ! loop endif end do end function subroutine gpufort_acc_runtime_print_summary(print_records) + use iso_fortran_env use iso_c_binding use hipfort use hipfort_check implicit none - logical,optional,intent(in) :: print_records + logical,intent(in),optional :: print_records ! - integer :: i + integer :: i, j integer(c_size_t) :: free_memory, total_memory ! CALL hipCheck(hipMemGetInfo(free_memory,total_memory)) ! print *, "SUMMARY" print *, "" - print *, "globals:" - print *, "- current region = ", current_region_ - print *, "- last record index = ", last_record_index_ - print *, "- last queue index = ", last_queue_index_ - print *, "- total records created = ", record_creation_counter_ - print *, "- total memory allocated (B) = ", total_memory_b_ - print *, "- HIP used memory (B) = ", (total_memory - free_memory), "/", total_memory + print *, "stats:" + print *, "- total records created = ", record_creation_counter_ + print *, "- total memory allocated (B) = ", total_memory + print *, "- HIP used memory (B) = ", (total_memory - free_memory), "/", total_memory + print *, "- current region = ", record_list_%current_region + print *, "- last record index = ", record_list_%last_record_index + print *, "- device memory allocated (B) = ", record_list_%total_memory_bytes print *, "" if ( present(print_records) .and. print_records ) then - print *, "records:" - do i = 1, last_record_index_ + do i = 1, record_list_%last_record_index print *, "- record ", i, ":" - CALL records_(i)%print() + CALL record_list_%records(i)%print() + flush(output_unit) end do - end if + endif end subroutine ! @@ -249,7 +294,7 @@ subroutine create_increment_queue_(id) end subroutine !> \note Not thread safe - subroutine decrement_delete_queue_(id) + subroutine decrement_release_queue_(id) implicit none integer, intent(in) :: id ! @@ -263,7 +308,7 @@ subroutine decrement_delete_queue_(id) last_queue_index_ = last_queue_index_ - 1 endif else if ( id .gt. MAX_QUEUES ) then - ERROR STOP "gpufort_acc_runtime: decrement_delete_queue_: queue id greater than parameter MAX_QUEUES" + ERROR STOP "gpufort_acc_runtime: decrement_release_queue_: queue id greater than parameter MAX_QUEUES" endif end subroutine @@ -294,30 +339,50 @@ function t_record_is_initialized_(record) result(ret) class(t_record),intent(in) :: record logical(c_bool) :: ret ! - ret = c_associated( record%hostptr ) + ret = c_associated(record%deviceptr) + end function + + function t_record_is_used_(record) result(ret) + use iso_c_binding + implicit none + class(t_record),intent(in) :: record + logical(c_bool) :: ret + ! + ret = record%is_initialized() .and. & + record%num_refs > 0 end function - subroutine t_record_copy_to_device_(record,async) + function t_record_is_released_(record) result(ret) + use iso_c_binding + implicit none + class(t_record),intent(in) :: record + logical(c_bool) :: ret + ! + ret = record%is_initialized() .and. & + record%num_refs <= 0 + end function + + subroutine t_record_copy_to_device_(record,async) use iso_c_binding use hipfort_check use hipfort_hipmemcpy implicit none class(t_record),intent(in) :: record - integer,optional,intent(in) :: async + integer,intent(in),optional :: async ! #ifndef BLOCKING_COPIES if ( present(async) ) then if ( async .ge. 0 ) then call create_increment_queue_(async) call hipCheck(hipMemcpyAsync(record%deviceptr,record%hostptr,& - record%num_bytes,hipMemcpyHostToDevice,queues_(async)%queueptr)) + record%num_bytes_used,hipMemcpyHostToDevice,queues_(async)%queueptr)) else call hipCheck(hipMemcpyAsync(record%deviceptr,record%hostptr,& - record%num_bytes,hipMemcpyHostToDevice,c_null_ptr)) + record%num_bytes_used,hipMemcpyHostToDevice,c_null_ptr)) endif else #endif - call hipCheck(hipMemcpy(record%deviceptr,record%hostptr,record%num_bytes,hipMemcpyHostToDevice)) + call hipCheck(hipMemcpy(record%deviceptr,record%hostptr,record%num_bytes_used,hipMemcpyHostToDevice)) #ifndef BLOCKING_COPIES endif #endif @@ -329,21 +394,21 @@ subroutine t_record_copy_to_host_(record,async) use hipfort_hipmemcpy implicit none class(t_record),intent(in) :: record - integer,optional,intent(in) :: async + integer,intent(in),optional :: async ! #ifndef BLOCKING_COPIES if ( present(async) ) then if ( async .ge. 0 ) then call create_increment_queue_(async) call hipCheck(hipMemcpyAsync(record%hostptr,record%deviceptr,& - record%num_bytes,hipMemcpyDeviceToHost,queues_(async)%queueptr)) + record%num_bytes_used,hipMemcpyDeviceToHost,queues_(async)%queueptr)) else call hipCheck(hipMemcpyAsync(record%hostptr,record%deviceptr,& - record%num_bytes,hipMemcpyDeviceToHost,c_null_ptr)) + record%num_bytes_used,hipMemcpyDeviceToHost,c_null_ptr)) endif else #endif - call hipCheck(hipMemcpy(record%hostptr,record%deviceptr,record%num_bytes,hipMemcpyDeviceToHost)) + call hipCheck(hipMemcpy(record%hostptr,record%deviceptr,record%num_bytes_used,hipMemcpyDeviceToHost)) #ifndef BLOCKING_COPIES endif #endif @@ -362,8 +427,26 @@ function t_record_is_subarray_(record,hostptr,num_bytes) result(rval) ! rval = is_subarray(record%hostptr,record%num_bytes, hostptr, num_bytes, offset_bytes) end function + + !> Release the record for reuse/deallocation. + subroutine t_record_release_(record) + use iso_fortran_env + implicit none + class(t_record),intent(inout) :: record + ! + if ( LOG_LEVEL > 1 ) then + write(output_unit,fmt="(a)",advance="no") "[gpufort-rt][2] release record: " + flush(output_unit) + call record%print() + flush(output_unit) + endif + record%hostptr = c_null_ptr + record%num_refs = 0 + record%region = -1 + end subroutine - subroutine t_record_initialize_(record,hostptr,num_bytes,creational_event,current_region) + !> Setup newly created/reused record according to new hostptr. + subroutine t_record_setup_(record,hostptr,num_bytes,creational_event,region,reuse_existing) use iso_c_binding use hipfort_check use hipfort_hipmalloc @@ -372,34 +455,44 @@ subroutine t_record_initialize_(record,hostptr,num_bytes,creational_event,curren type(c_ptr), intent(in) :: hostptr integer(c_size_t), intent(in) :: num_bytes integer(kind(gpufort_acc_event_create)), intent(in) :: creational_event - integer, intent(in) :: current_region - ! - record%hostptr = hostptr - record%num_refs = 1 - record%num_bytes = num_bytes - record%region = current_region - record%creational_event = creational_event - call hipCheck(hipMalloc(record%deviceptr,blocked_size(num_bytes))) + integer, intent(in) :: region + logical, intent(in) :: reuse_existing + ! + record%hostptr = hostptr + record%num_refs = 1 + record%region = region + record%creational_event = creational_event + record%num_bytes_used = num_bytes + if ( .not. reuse_existing ) then + record_creation_counter_ = record_creation_counter_ + 1 + record%id = record_creation_counter_ + record%num_bytes = blocked_size(num_bytes) + call hipCheck(hipMalloc(record%deviceptr,record%num_bytes)) + endif if ( creational_event .eq. gpufort_acc_event_copyin .or. & creational_event .eq. gpufort_acc_event_copy ) & call record%copy_to_device() - - record%id = record_creation_counter_ - record_creation_counter_ = record_creation_counter_ + 1 end subroutine subroutine t_record_destroy_(record) use iso_c_binding + use iso_fortran_env use hipfort_check use hipfort_hipmalloc implicit none class(t_record),intent(inout) :: record ! + if ( LOG_LEVEL > 1 ) then + write(output_unit,fmt="(a)",advance="no") "[gpufort-rt][2] destroy record: " + flush(output_unit) + call record%print() + flush(output_unit) + endif call hipCheck(hipFree(record%deviceptr)) record%deviceptr = c_null_ptr - record%hostptr = c_null_ptr - record%num_refs = 0 - record%region = -1 + record%hostptr = c_null_ptr + record%num_refs = 0 + record%region = -1 end subroutine subroutine t_record_increment_num_refs_(record) @@ -409,80 +502,147 @@ subroutine t_record_increment_num_refs_(record) record%num_refs = record%num_refs + 1 end subroutine - function t_record_decrement_num_refs_(record) result(ret) + function t_record_decrement_num_refs_(record,threshold) result(ret) implicit none class(t_record),intent(inout) :: record + integer,intent(in),optional :: threshold ! logical :: ret ! + record%num_refs = record%num_refs - 1 - ret = record%num_refs .eq. 0 + ret = record%num_refs <= eval_opt_integer_(threshold,0) end function ! ! records_ ! - subroutine grow_records_() + function t_record_list_is_initialized_(record_list) result(ret) + implicit none + class(t_record_list),intent(inout) :: record_list + logical :: ret + ! + ret = allocated(record_list%records) + end function + + subroutine t_record_list_initialize_(record_list) + implicit none + class(t_record_list),intent(inout) :: record_list + ! + type(t_record), allocatable :: new_records(:) + integer :: old_size + ! + allocate(record_list%records(INITIAL_RECORD_LIST_CAPACITY)) + end subroutine + + subroutine t_record_list_grow_(record_list) implicit none - integer :: old_size - type(t_record), save, allocatable :: new_records(:) + class(t_record_list),intent(inout) :: record_list ! - old_size = SIZE(records_) + type(t_record), allocatable :: new_records(:) + integer :: old_size + ! + old_size = size(record_list%records) allocate(new_records(old_size*2)) - new_records(1:old_size) = records_(1:old_size) - deallocate(records_) - call move_alloc(new_records,records_) + new_records(1:old_size) = record_list%records(1:old_size) + deallocate(record_list%records) + call move_alloc(new_records,record_list%records) + end subroutine + + subroutine t_record_list_destroy_(record_list) + implicit none + class(t_record_list),intent(inout) :: record_list + ! + integer :: i + ! + do i = 1, record_list%last_record_index + if ( record_list%records(i)%is_initialized() ) then + call record_list%records(i)%destroy() + endif + end do + deallocate(record_list%records) end subroutine !> Finds a record for a given host ptr and returns the location. !> !> \note Not thread safe - function find_record_(hostptr,success) result(loc) + function t_record_list_find_record_(record_list,hostptr,success) result(loc) use iso_fortran_env use iso_c_binding use gpufort_acc_runtime_c_bindings implicit none - type(c_ptr), intent(in) :: hostptr - logical, intent(inout) :: success + class(t_record_list),intent(inout) :: record_list + type(c_ptr), intent(in) :: hostptr + logical, intent(inout) :: success ! integer :: i, loc ! - if ( .not. c_associated(hostptr) ) ERROR STOP "gpufort_acc_runtime: find_record_: hostptr not c_associated" - loc = -1 - success = .FALSE. - do i = 1, last_record_index_ - !if ( c_associated(records_(i)%hostptr, hostptr) ) then - if ( records_(i)%is_subarray(hostptr, 0_8) ) then - loc = i - success = .TRUE. - exit ! loop - endif - end do -#if DEBUG > 2 - write(output_unit,fmt="(a)",advance="no") "[3]lookup record: " - flush(output_unit) - if ( success ) then - call records_(loc)%print() - else - write(output_unit,fmt="(a)",advance="yes") "NOT FOUND" + if ( .not. c_associated(hostptr) ) ERROR STOP "gpufort_acc_runtime: t_record_list_find_record_: hostptr not c_associated" + loc = -1 + success = .false. + if ( record_list%last_record_index > 0 ) then + do i = record_list%last_record_index, 1, -1 + if ( record_list%records(i)%is_subarray(hostptr, 0_8) ) then + loc = i + success = .true. + exit ! loop + endif + end do + if ( LOG_LEVEL > 2 ) then + write(output_unit,fmt="(a)",advance="no") "[gpufort-rt][3] lookup record: " + flush(output_unit) + if ( success ) then + call record_list%records(loc)%print() + flush(output_unit) + else + write(output_unit,fmt="(a)",advance="yes") "NOT FOUND" + flush(output_unit) + endif + endif endif -#endif end function - !> Searches first empty record from the begin of the record search space. - !> If it does not find an empty record in the current search space, + !> Searches first available record from the begin of the record search space. + !> If it does not find an available record in the current search space, !> it takes the record right after the end of the search space !> and grows the search space by 1. !> + !> Tries to reuse existing records that have been released. + !> Checks how many times a record has been considered (unsuccessfully) for reusing and deallocates + !> associated device data if that has happend NUM_REFS_TO_DEALLOCATE times (or more). + !> !> \note Not thread safe. - function find_first_empty_record_() result(loc) + function t_record_list_find_available_record_(record_list,num_bytes,reuse_existing) result(loc) implicit none + class(t_record_list),intent(inout) :: record_list + integer(c_size_t),intent(in) :: num_bytes + logical,intent(inout) :: reuse_existing + ! integer :: i, loc ! - do i = 1, last_record_index_ + 1 - if ( .not. records_(i)%is_initialized() ) then - loc = i + reuse_existing = .false. + loc = record_list%last_record_index+1 + do i = 1, record_list%last_record_index + print *, "i=",i + if ( .not. record_list%records(i)%is_initialized() ) then ! 1. buffer is empty + loc = i + reuse_existing = .false. + exit ! exit loop + else if ( record_list%records(i)%is_released() ) then ! 2 found a released array + loc = i + if ( record_list%records(i)%num_bytes < num_bytes .or. & + num_bytes < record_list%records(i)%num_bytes * REUSE_THRESHOLD ) then ! 2.1 buffer too small/big + ! deallocate routinely unused memory blocks + if ( record_list%records(i)%decrement_num_refs(NUM_REFS_TO_DEALLOCATE) ) then ! side effect + record_list%total_memory_bytes = record_list%total_memory_bytes & + - record_list%records(loc)%num_bytes + call record_list%records(i)%destroy() + endif + reuse_existing = .false. + else ! 2. buffer size is fine + reuse_existing = .true. + endif exit ! exit loop endif end do @@ -492,87 +652,77 @@ function find_first_empty_record_() result(loc) !> reference counter. !> !> \note Not thread safe. - function insert_increment_record_(hostptr,num_bytes,creational_event,async) result(loc) + function t_record_list_use_increment_record_(record_list,hostptr,num_bytes,creational_event,async,module_var) result(loc) use iso_c_binding use iso_fortran_env use hipfort use hipfort_check implicit none + class(t_record_list),intent(inout) :: record_list type(c_ptr), intent(in) :: hostptr integer(c_size_t), intent(in) :: num_bytes integer(kind(gpufort_acc_event_create)), intent(in) :: creational_event - integer,optional,intent(in) :: async + integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! integer :: loc - logical :: success + logical :: success, reuse_existing ! - loc = find_record_(hostptr,success) + loc = record_list%find_record(hostptr,success) if ( success ) then - call records_(loc)%increment_num_refs() + call record_list%records(loc)%increment_num_refs() else - loc = find_first_empty_record_() - if (loc .ge. size(records_)) CALL grow_records_() + loc = record_list%find_available_record(num_bytes,reuse_existing) + if (loc .ge. size(record_list%records)) CALL record_list%grow() ! - call records_(loc)%initialize(hostptr,& - num_bytes,creational_event,current_region_) + call record_list%records(loc)%setup(hostptr,& + num_bytes,creational_event,record_list%current_region,reuse_existing) + if ( eval_opt_logical_(module_var,.false.) ) record_list%records(loc)%region = 0 if ( creational_event .eq. gpufort_acc_event_copyin .or. & creational_event .eq. gpufort_acc_event_copy ) & - call records_(loc)%copy_to_device(async) + call record_list%records(loc)%copy_to_device(async) !print *, loc - last_record_index_ = max(loc, last_record_index_) - total_memory_b_ = total_memory_b_ + blocked_size(num_bytes) -#if DEBUG > 1 - write(output_unit,fmt="(a)",advance="no") "[2]created record: " - flush(output_unit) - call records_(loc)%print() - flush(output_unit) -#endif + record_list%last_record_index = max(loc, record_list%last_record_index) + record_list%total_memory_bytes = record_list%total_memory_bytes + record_list%records(loc)%num_bytes + if ( LOG_LEVEL > 1 ) then + if ( reuse_existing ) then + write(output_unit,fmt="(a)",advance="no") "[gpufort-rt][2] reuse record: " + else + write(output_unit,fmt="(a)",advance="no") "[gpufort-rt][2] create record: " + endif + flush(output_unit) + call record_list%records(loc)%print() + flush(output_unit) + endif endif end function - subroutine destroy_record_(record) - use iso_fortran_env - implicit none - class(t_record),intent(inout) :: record - ! - total_memory_b_ = total_memory_b_ - blocked_size(record%num_bytes) - -#if DEBUG > 1 - write(output_unit,fmt="(a)",advance="no") "[2]destroy record: " - flush(output_unit) - call record%print() - flush(output_unit) -#endif - - call record%destroy() - end subroutine - !> Deletes a record's reference counter and destroys the record if !> the reference counter is zero. Copies the data to the host beforehand !> if specified. !> !> \note Not thread safe. - subroutine decrement_delete_record_(hostptr,copy_to_host) + subroutine t_record_list_decrement_release_record_(record_list,hostptr,copy_to_host) use iso_c_binding use hipfort use hipfort_check implicit none - type(c_ptr),intent(in) :: hostptr + class(t_record_list),intent(inout) :: record_list + type(c_ptr),intent(in) :: hostptr ! logical :: copy_to_host ! integer :: loc logical :: success ! - loc = find_record_(hostptr,success) + loc = record_list%find_record(hostptr,success) if ( success ) then - if ( records_(loc)%decrement_num_refs() ) then - if ( copy_to_host ) call records_(loc)%copy_to_host() - call destroy_record_(records_(loc)) + if ( record_list%records(loc)%decrement_num_refs() ) then + if ( copy_to_host ) call record_list%records(loc)%copy_to_host() endif else #ifndef DELETE_NORECORD_MEANS_NOOP - ERROR STOP "gpufort_acc_runtime: decrement_delete_record: could not find matching record for hostptr" + ERROR STOP "gpufort_acc_runtime: t_record_list_decrement_release_record_: could not find matching record for hostptr" #endif return endif @@ -584,23 +734,41 @@ subroutine decrement_delete_record_(hostptr,copy_to_host) ! subroutine gpufort_acc_init() implicit none - allocate(records_(INITIAL_RECORDS_CAPACITY)) - initialized_ = .TRUE. + integer :: j + character(len=255) :: tmp + ! + if ( initialized_ ) then + ERROR STOP "gpufort_acc_init: runtime already initialized" + else + call get_environment_variable("GPUFORT_LOG_LEVEL", tmp) + if (len_trim(tmp) > 0) read(tmp,*) LOG_LEVEL + call get_environment_variable("GPUFORT_REUSE_THRESHOLD", tmp) + if (len_trim(tmp) > 0) read(tmp,*) REUSE_THRESHOLD + call get_environment_variable("GPUFORT_MAX_QUEUES", tmp) + if (len_trim(tmp) > 0) read(tmp,*) MAX_QUEUES + call get_environment_variable("GPUFORT_INITIAL_RECORD_LIST_CAPACITY", tmp) + if (len_trim(tmp) > 0) read(tmp,*) INITIAL_RECORD_LIST_CAPACITY + if ( LOG_LEVEL > 0 ) then + write(*,*) "GPUFORT_LOG_LEVEL=",LOG_LEVEL + write(*,*) "GPUFORT_REUSE_THRESHOLD=",REUSE_THRESHOLD + write(*,*) "GPUFORT_MAX_QUEUES=",MAX_QUEUES + write(*,*) "GPUFORT_INITIAL_RECORD_LIST_CAPACITY=",INITIAL_RECORD_LIST_CAPACITY + endif + ! + call record_list_%initialize() + allocate(queues_(MAX_QUEUES)) + initialized_ = .true. + endif end subroutine !> Deallocate all host data and the records_ and !> queue data structures.. subroutine gpufort_acc_shutdown() implicit none - integer :: i + integer :: i, j if ( .not. initialized_ ) ERROR STOP "gpufort_acc_shutdown: runtime not initialized" ! deallocate records_ - do i = 1, last_record_index_ - if ( records_(i)%is_initialized() ) then - call records_(i)%destroy() - endif - end do - deallocate(records_) + call record_list_%destroy() ! deallocate queues_ elements do i = 1, last_queue_index_ if ( queues_(i)%is_initialized() ) then @@ -651,22 +819,22 @@ subroutine gpufort_acc_wait(arg,async) use hipfort_check implicit none ! - integer,optional,intent(in),dimension(:) :: arg,async + integer,intent(in),optional,dimension(:) :: arg,async ! - integer :: i + integer :: i, j logical :: no_opt_present ! if ( .not. initialized_ ) ERROR STOP "gpufort_acc_wait: runtime not initialized" - no_opt_present = .TRUE. + no_opt_present = .true. if ( present(arg) ) then - no_opt_present = .FALSE. + no_opt_present = .false. do i=1,size(arg) call hipCheck(hipStreamSynchronize(queues_(arg(i))%queueptr)) end do endif ! if ( present(async) ) then - no_opt_present = .FALSE. + no_opt_present = .false. do i=1,size(async) ! acc_wait_async This function enqueues a wait operation on the queue async for any and all asynchronous operations that have been previously enqueued on any queue. !queues_(async(i))%enqueue_wait_event() @@ -688,10 +856,10 @@ subroutine gpufort_acc_wait(arg,async) !> \note We can use this also for any other region that uses device data subroutine gpufort_acc_enter_region(unstructured,implicit_region) implicit none - logical,optional,intent(in) :: unstructured - logical,optional,intent(in) :: implicit_region + logical,intent(in),optional :: unstructured + logical,intent(in),optional :: implicit_region if ( .not. initialized_ ) call gpufort_acc_init() - current_region_ = current_region_ + 1 + record_list_%current_region = record_list_%current_region + 1 end subroutine !> \note We can use this also for a "normal" end data section @@ -702,8 +870,8 @@ subroutine gpufort_acc_exit_region(unstructured,implicit_region) use hipfort_check #endif implicit none - logical,optional,intent(in) :: unstructured - logical,optional,intent(in) :: implicit_region + logical,intent(in),optional :: unstructured + logical,intent(in),optional :: implicit_region ! integer :: i, new_last_record_index ! @@ -714,25 +882,24 @@ subroutine gpufort_acc_exit_region(unstructured,implicit_region) call gpufort_acc_wait() #endif new_last_record_index = 0 - do i = 1, last_record_index_ - if ( records_(i)%is_initialized() ) then - if ( records_(i)%region .eq. current_region_ ) then - if ( records_(i)%creational_event .eq. gpufort_acc_event_create .or.& - records_(i)%creational_event .eq. gpufort_acc_event_copyin ) then - call destroy_record_(records_(i)) - else if ( records_(i)%creational_event .eq. gpufort_acc_event_copyout .or. & - records_(i)%creational_event .eq. gpufort_acc_event_copy ) then - call records_(i)%copy_to_host() ! synchronous - call destroy_record_(records_(i)) + do i = 1, record_list_%last_record_index + if ( record_list_%records(i)%is_initialized() ) then + if ( record_list_%records(i)%region .eq. record_list_%current_region ) then + if ( record_list_%records(i)%creational_event .eq. gpufort_acc_event_create .or.& + record_list_%records(i)%creational_event .eq. gpufort_acc_event_copyin ) then + call record_list_%records(i)%release() + else if ( record_list_%records(i)%creational_event .eq. gpufort_acc_event_copyout .or. & + record_list_%records(i)%creational_event .eq. gpufort_acc_event_copy ) then + call record_list_%records(i)%copy_to_host() ! synchronous + call record_list_%records(i)%release() endif - else - new_last_record_index = i endif + new_last_record_index = i endif end do - last_record_index_ = new_last_record_index + record_list_%last_record_index = new_last_record_index ! - current_region_ = current_region_ -1 + record_list_%current_region = record_list_%current_region -1 ! end subroutine @@ -749,76 +916,68 @@ subroutine gpufort_acc_exit_region(unstructured,implicit_region) !> decremented. !> !> \note We just return the device pointer here and do not modify the counters. - function gpufort_acc_present_b(hostptr,num_bytes,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_b(hostptr,num_bytes,async,module_var,copy,copyin,copyout,create) result(deviceptr) use iso_fortran_env use iso_c_binding use gpufort_acc_runtime_c_bindings implicit none type(c_ptr),intent(in) :: hostptr integer(c_size_t),intent(in) :: num_bytes - !logical,optional,intent(in) :: exiting - integer,optional,intent(in) :: async - logical,optional,intent(in) :: copy - logical,optional,intent(in) :: copyin - logical,optional,intent(in) :: create + !logical,intent(in),optional :: exiting + integer,intent(in),optional :: async + logical,intent(in),optional :: module_var + logical,intent(in),optional :: copy, copyin, copyout, create ! type(c_ptr) :: deviceptr ! - logical :: success,fits - integer :: loc integer(c_size_t) :: offset_bytes - logical :: opt_copy - logical :: opt_copyin - logical :: opt_create + logical :: success, fits + integer :: loc, num_lists_to_check ! + if ( .not. initialized_ .and. eval_opt_logical_(module_var,.false.) ) call gpufort_acc_init() if ( .not. initialized_ ) ERROR STOP "gpufort_acc_present_b: runtime not initialized" if ( .not. c_associated(hostptr) ) then ERROR STOP "gpufort_acc_present_b: hostptr not c_associated" - deviceptr = c_null_ptr else - loc = find_record_(hostptr,success) - if ( .not. success ) then - opt_copy = .FALSE. - opt_copyin = .FALSE. - opt_create = .FALSE. - if ( present(copy) ) opt_copy = copy - if ( present(copyin) ) opt_copyin = copyin - if ( present(create) ) opt_create = create - if ( opt_copy ) then - deviceptr = gpufort_acc_copy_b(hostptr,num_bytes,async) - else if ( opt_copyin ) then - deviceptr = gpufort_acc_copyin_b(hostptr,num_bytes,async) - else if ( opt_create ) then - deviceptr = gpufort_acc_create_b(hostptr,num_bytes,async) - else - print *, "ERROR: did not find record for hostptr:" - CALL print_cptr(hostptr) - ERROR STOP "gpufort_acc_present_b: no record found for hostptr" - end if + loc = record_list_%find_record(hostptr,success) + if ( success ) then + fits = is_subarray(record_list_%records(loc)%hostptr,record_list_%records(loc)%num_bytes,hostptr,num_bytes,offset_bytes) + deviceptr = inc_cptr(record_list_%records(loc)%deviceptr,offset_bytes) + else + if ( eval_opt_logical_(copy,.false.) ) then + deviceptr = gpufort_acc_copy_b(hostptr,num_bytes,async,module_var) + else if ( eval_opt_logical_(create,.false.) ) then + deviceptr = gpufort_acc_create_b(hostptr,num_bytes,async,module_var) + else if ( eval_opt_logical_(copyin,.false.) ) then + deviceptr = gpufort_acc_copyin_b(hostptr,num_bytes,async,module_var) + else if ( eval_opt_logical_(copyout,.false.) ) then + deviceptr = gpufort_acc_copyout_b(hostptr,num_bytes,async,module_var) + else + print *, "ERROR: did not find record for hostptr:" + CALL print_cptr(hostptr) + ERROR STOP "gpufort_acc_present_b: no record found for hostptr" + endif + endif + if ( LOG_LEVEL > 0 ) then + write(output_unit,fmt="(a)",advance="no") "[gpufort-rt][1] gpufort_acc_present_b: retrieved deviceptr=" + flush(output_unit) + CALL print_cptr(deviceptr) + flush(output_unit) + write(output_unit,fmt="(a,i0.0,a)",advance="no") "(offset_bytes=",offset_bytes,",base deviceptr=" + flush(output_unit) + CALL print_cptr(record_list_%records(loc)%deviceptr) + flush(output_unit) + write(output_unit,fmt="(a,i0.0)",advance="no") ",base num_bytes=", record_list_%records(loc)%num_bytes + write(output_unit,fmt="(a)",advance="no") ") for hostptr=" + flush(output_unit) + CALL print_cptr(hostptr) + flush(output_unit) + print *, "" endif - ! TODO replace 0 by size of searched hostptr - fits = is_subarray(records_(loc)%hostptr,records_(loc)%num_bytes,hostptr,0_8,offset_bytes) - deviceptr = inc_cptr(records_(loc)%deviceptr,offset_bytes) -#if DEBUG > 0 - write(output_unit,fmt="(a)",advance="no") "[1]gpufort_acc_present_b: retrieved deviceptr=" - flush(output_unit) - CALL print_cptr(deviceptr) - flush(output_unit) - write(output_unit,fmt="(a,i0.0,a)",advance="no") "(offset_bytes=",offset_bytes,",base deviceptr=" - flush(output_unit) - CALL print_cptr(records_(loc)%deviceptr) - flush(output_unit) - write(output_unit,fmt="(a,i0.0)",advance="no") ",base num_bytes=", records_(loc)%num_bytes - write(output_unit,fmt="(a)",advance="no") ") for hostptr=" - flush(output_unit) - CALL print_cptr(hostptr) - flush(output_unit) - print *, "" -#endif !if (exiting) then - ! records_(loc)%decrement_num_refs() + ! record_list_%records(loc)%decrement_num_refs() !else - ! records_(loc)%increment_num_refs() + ! record_list_%records(loc)%increment_num_refs() !endif endif end function @@ -834,23 +993,26 @@ function gpufort_acc_present_b(hostptr,num_bytes,async,copy,copyin,create) resul !> counts are zero, the device memory is deallocated. !> !> \note Only use this when entering not when exiting - function gpufort_acc_create_b(hostptr,num_bytes,async) result(deviceptr) + function gpufort_acc_create_b(hostptr,num_bytes,async,module_var) result(deviceptr) use iso_c_binding implicit none type(c_ptr),intent(in) :: hostptr integer(c_size_t),intent(in) :: num_bytes - integer,optional,intent(in) :: async ! ignored for now + integer,intent(in),optional :: async ! ignored for now + logical,intent(in),optional :: module_var type(c_ptr) :: deviceptr ! + logical :: opt_module_var integer :: loc ! - if ( .not. initialized_ ) ERROR STOP "gpufort_acc_create_b: runtime not initialized" + if ( .not. initialized_ .and. eval_opt_logical_(module_var,.false.) ) call gpufort_acc_init() + if ( .not. initialized_ ) ERROR STOP "gpufort_acc_create_b: runtime not initalized" if ( .not. c_associated(hostptr) ) then ERROR STOP "gpufort_acc_create_b: hostptr not c_associated" - deviceptr = c_null_ptr else - loc = insert_increment_record_(hostptr,num_bytes,gpufort_acc_event_create) - deviceptr = records_(loc)%deviceptr + loc = record_list_%use_increment_record(hostptr,num_bytes,& + gpufort_acc_event_create,async,module_var) + deviceptr = record_list_%records(loc)%deviceptr endif end function @@ -862,23 +1024,23 @@ function gpufort_acc_create_b(hostptr,num_bytes,async) result(deviceptr) !> for that data. !> !> \note We just return the device pointer here (or c_null_ptr) and do not modify the counters. - function gpufort_acc_no_create_b(hostptr) result(deviceptr) + function gpufort_acc_no_create_b(hostptr,module_var) result(deviceptr) use iso_c_binding implicit none - type(c_ptr), intent(in) :: hostptr + type(c_ptr), intent(in) :: hostptr + logical,intent(in),optional :: module_var type(c_ptr) :: deviceptr ! - integer :: loc logical :: success + integer :: loc ! - if ( .not. initialized_ ) ERROR STOP "gpufort_acc_no_create_b: runtime not initialized" + if ( .not. initialized_ ) ERROR STOP "gpufort_acc_create_b: runtime not initalized" if ( .not. c_associated(hostptr) ) then ERROR STOP "gpufort_acc_no_create_b: hostptr not c_associated" - deviceptr = c_null_ptr else - loc = find_record_(hostptr,success) + loc = record_list_%find_record(hostptr,success) deviceptr = c_null_ptr - if ( success ) deviceptr = records_(loc)%deviceptr + if ( success ) deviceptr = record_list_%records(loc)%deviceptr endif end function @@ -904,8 +1066,8 @@ subroutine gpufort_acc_delete_b(hostptr,finalize) type(c_ptr), intent(in) :: hostptr logical,intent(in),optional :: finalize ! - integer :: loc logical :: success, opt_finalize + integer :: loc ! if ( .not. initialized_ ) ERROR STOP "gpufort_acc_delete_b: runtime not initialized" if ( .not. c_associated(hostptr) ) then @@ -914,14 +1076,14 @@ subroutine gpufort_acc_delete_b(hostptr,finalize) #endif return else - opt_finalize = .FALSE. + opt_finalize = .false. if ( present(finalize) ) opt_finalize = finalize if ( opt_finalize ) then - loc = find_record_(hostptr,success) + loc = record_list_%find_record(hostptr,success) if ( .not. success ) ERROR STOP "gpufort_acc_delete: no record found for hostptr" - call records_(loc)%destroy() + call record_list_%records(loc)%release() else - call decrement_delete_record_(hostptr,copy_to_host=.FALSE.) + call record_list_%decrement_release_record(hostptr,copy_to_host=.false.) endif endif end subroutine @@ -941,17 +1103,19 @@ subroutine gpufort_acc_delete_b(hostptr,finalize) !> zero, the device memory is deallocated. !> !> \note Exiting case handled in gpufort_acc_exit_region - function gpufort_acc_copyin_b(hostptr,num_bytes,async) result(deviceptr) + function gpufort_acc_copyin_b(hostptr,num_bytes,async,module_var) result(deviceptr) use iso_c_binding implicit none type(c_ptr), intent(in) :: hostptr integer(c_size_t),intent(in) :: num_bytes - integer,optional,intent(in) :: async + integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! integer :: loc ! + if ( .not. initialized_ .and. eval_opt_logical_(module_var,.false.) ) call gpufort_acc_init() if ( .not. initialized_ ) ERROR STOP "gpufort_acc_copyin_b: runtime not initialized" if ( .not. c_associated(hostptr) ) then #ifndef NULLPTR_MEANS_NOOP @@ -959,8 +1123,8 @@ function gpufort_acc_copyin_b(hostptr,num_bytes,async) result(deviceptr) #endif deviceptr = c_null_ptr else - loc = insert_increment_record_(hostptr,num_bytes,gpufort_acc_event_copyin,async) - deviceptr = records_(loc)%deviceptr + loc = record_list_%use_increment_record(hostptr,num_bytes,gpufort_acc_event_copyin,async,module_var) + deviceptr = record_list_%records(loc)%deviceptr endif end function @@ -980,18 +1144,20 @@ function gpufort_acc_copyin_b(hostptr,num_bytes,async) result(deviceptr) !> thread and the device memory is deallocated. !> !> \note Exiting case handled in gpufort_acc_exit_region - function gpufort_acc_copyout_b(hostptr,num_bytes,async) result(deviceptr) + function gpufort_acc_copyout_b(hostptr,num_bytes,async,module_var) result(deviceptr) use iso_c_binding implicit none ! Return type(c_ptr) type(c_ptr), intent(in) :: hostptr integer(c_size_t),intent(in) :: num_bytes - integer,optional,intent(in) :: async + integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! integer :: loc ! + if ( .not. initialized_ .and. eval_opt_logical_(module_var,.false.) ) call gpufort_acc_init() if ( .not. initialized_ ) ERROR STOP "gpufort_acc_copyout_b: runtime not initialized" if ( .not. c_associated(hostptr) ) then #ifndef NULLPTR_MEANS_NOOP @@ -999,8 +1165,8 @@ function gpufort_acc_copyout_b(hostptr,num_bytes,async) result(deviceptr) #endif deviceptr = c_null_ptr else - loc = insert_increment_record_(hostptr,num_bytes,gpufort_acc_event_copyout,async) - deviceptr = records_(loc)%deviceptr + loc = record_list_%use_increment_record(hostptr,num_bytes,gpufort_acc_event_copyout,async,module_var) + deviceptr = record_list_%records(loc)%deviceptr endif end function @@ -1015,18 +1181,20 @@ function gpufort_acc_copyout_b(hostptr,num_bytes,async) result(deviceptr) !> encountering thread and the device memory is deallocated. !> !> \note Exiting case handled in gpufort_acc_exit_region - function gpufort_acc_copy_b(hostptr,num_bytes,async) result(deviceptr) + function gpufort_acc_copy_b(hostptr,num_bytes,async,module_var) result(deviceptr) use iso_c_binding implicit none ! Return type(c_ptr) type(c_ptr), intent(in) :: hostptr integer(c_size_t),intent(in) :: num_bytes - integer,optional,intent(in) :: async + integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! integer :: loc ! + if ( .not. initialized_ .and. eval_opt_logical_(module_var,.false.) ) call gpufort_acc_init() if ( .not. initialized_ ) ERROR STOP "gpufort_acc_copy_b: runtime not initialized" if ( .not. c_associated(hostptr) ) then #ifndef NULLPTR_MEANS_NOOP @@ -1034,8 +1202,9 @@ function gpufort_acc_copy_b(hostptr,num_bytes,async) result(deviceptr) #endif deviceptr = c_null_ptr else - loc = insert_increment_record_(hostptr,num_bytes,gpufort_acc_event_copy,async) - deviceptr = records_(loc)%deviceptr + loc = record_list_%use_increment_record(hostptr,num_bytes,& + gpufort_acc_event_copy,async,module_var) + deviceptr = record_list_%records(loc)%deviceptr endif end function @@ -1065,6 +1234,7 @@ subroutine gpufort_acc_update_host_b(hostptr,condition,if_present,async) integer,intent(in),optional :: async ! integer :: loc + ! logical :: success, opt_condition, opt_if_present ! if ( .not. initialized_ ) ERROR STOP "gpufort_acc_update_host_b: runtime not initialized" @@ -1074,20 +1244,20 @@ subroutine gpufort_acc_update_host_b(hostptr,condition,if_present,async) #endif return endif - opt_condition = .True. - opt_if_present = .False. + opt_condition = .true. + opt_if_present = .false. if ( present(condition) ) opt_condition = condition if ( present(if_present) ) opt_if_present = if_present ! if ( opt_condition ) then - loc = find_record_(hostptr,success) + loc = record_list_%find_record(hostptr,success) ! if ( .not. success .and. .not. opt_if_present ) ERROR STOP "gpufort_acc_update_host_b: no deviceptr found for hostptr" ! if ( success .and. present(async) ) then - call records_(loc)%copy_to_host(async) + call record_list_%records(loc)%copy_to_host(async) else if ( success ) then - call records_(loc)%copy_to_host() + call record_list_%records(loc)%copy_to_host() endif endif end subroutine @@ -1111,7 +1281,7 @@ subroutine gpufort_acc_update_host_b(hostptr,condition,if_present,async) !> Copies the data in list from the encountering thread to the !> device. !> if( condition ) - !> When the condition is zero or .FALSE., no data will be moved to + !> When the condition is zero or .false., no data will be moved to !> or from the device. !> if_present !> Issue no error when the data is not present on the device. @@ -1121,11 +1291,11 @@ subroutine gpufort_acc_update_host_b(hostptr,condition,if_present,async) !> wait [( expression-list )] - TODO not implemented !> The data movement will not begin execution until all actions on !> the corresponding async queue(s) are complete. - subroutine gpufort_acc_update_device_b(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_b(hostptr,condition,if_present,async,module_var) use iso_c_binding implicit none type(c_ptr),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! integer :: loc @@ -1138,20 +1308,20 @@ subroutine gpufort_acc_update_device_b(hostptr,condition,if_present,async) #endif return endif - opt_condition = .True. - opt_if_present = .False. + opt_condition = .true. + opt_if_present = .false. if ( present(condition) ) opt_condition = condition if ( present(if_present) ) opt_if_present = if_present ! if ( opt_condition ) then - loc = find_record_(hostptr,success) + loc = record_list_%find_record(hostptr,success) ! if ( .not. success .and. .not. opt_if_present ) ERROR STOP "gpufort_acc_update_device_b: no deviceptr found for hostptr" ! if ( success .and. present(async) ) then - call records_(loc)%copy_to_device(async) + call record_list_%records(loc)%copy_to_device(async) else if ( success ) then - call records_(loc)%copy_to_device() + call record_list_%records(loc)%copy_to_device() endif endif end subroutine diff --git a/runtime/examples/openacc_gomp/Makefile b/runtime/openacc_gomp/examples/Makefile similarity index 100% rename from runtime/examples/openacc_gomp/Makefile rename to runtime/openacc_gomp/examples/Makefile diff --git a/runtime/examples/openacc_gomp/hipblasSaxpy.f90 b/runtime/openacc_gomp/examples/hipblasSaxpy.f90 similarity index 100% rename from runtime/examples/openacc_gomp/hipblasSaxpy.f90 rename to runtime/openacc_gomp/examples/hipblasSaxpy.f90 diff --git a/runtime/examples/openacc_gomp/structured_data_region.f90 b/runtime/openacc_gomp/examples/structured_data_region.f90 similarity index 100% rename from runtime/examples/openacc_gomp/structured_data_region.f90 rename to runtime/openacc_gomp/examples/structured_data_region.f90 diff --git a/runtime/examples/openacc_gomp/unstructured_data_region.f90 b/runtime/openacc_gomp/examples/unstructured_data_region.f90 similarity index 100% rename from runtime/examples/openacc_gomp/unstructured_data_region.f90 rename to runtime/openacc_gomp/examples/unstructured_data_region.f90 From d5803da6e5c58fe14be76548e7ea66e660d12e28 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 25 Oct 2021 09:07:25 -0400 Subject: [PATCH 16/67] WiP/gpufort acc runtime: reuse buffers & make tuneable FEATURE: gpufort acc runtime behavior can now be influenced/ tuned via the following environment variables: GPUFORT_LOG_LEVEL (default=0) log level. Maximum log level used in code 3. GPUFORT_MAX_QUEUES (default=64) maximum number of async queues. GPUFORT_INITIAL_RECORD_LIST_CAPACITY (default=4096) mapping records are managed via a vector. Specify the initial vector capacity via this flag. If the maximum capacity is reached, the vector capacity is doubled. GPUFORT_BLOCK_SIZE (default=32) all device arrays are allocated as multiples of this block size. GPUFORT_REUSE_THRESHOLD (default=0.9) reuse an existing device buffer if the requested buffer size greater than GPUFORT_REUSE_THRESHOLD x size of already existing buffer. GPUFORT_NUM_REFS_TO_DEALLOCATE (default=-5) number of references for which a released array will be deallocated OPTIMIZATION: gpufort acc runtime will now try to reuse device arrays that have been previously released but not allocated yet. Behavior can be tuned via env. vars. GPUFORT_REUSE_THRESHOLD, GPUFORT_NUM_REFS_TO_DEALLOCATE and in some sense via GPUFORT_BLOCK_SIZE. BUGFIX/OPTIMIZATION: Lookup records from back. --- runtime/README.md | 11 ++++---- ...-regions-2.f90 => test-nested-regions.f90} | 0 ...-nested-regions-1.f90 => test-reusing.f90} | 0 runtime/gpufort_acc_runtime/rules.mk | 2 +- .../src/gpufort_acc_runtime_base.f90 | 25 ++++++++++++------- 5 files changed, 23 insertions(+), 15 deletions(-) rename runtime/gpufort_acc_runtime/examples/{test-nested-regions-2.f90 => test-nested-regions.f90} (100%) rename runtime/gpufort_acc_runtime/examples/{test-nested-regions-1.f90 => test-reusing.f90} (100%) diff --git a/runtime/README.md b/runtime/README.md index 3702a1db..6516495a 100644 --- a/runtime/README.md +++ b/runtime/README.md @@ -19,14 +19,15 @@ `hipfort` API calls or `GPUFORT` kernel launch routines. * Examples are likely outdated -* This directory further contains `gpufort_acc_runtime`, a minimal non-standard-compliant runtime written completely - in Fortran, which can be used for teaching/training or prototyping. - +* This directory further contains `gpufort_acc_runtime`, a minimal non-standard-compliant runtime written + mostly in Fortran, which we use for prototyping and characterizing application runtime behavior. + Long term, we plan to rewrite this runtime in C++ or abandon it for a better alternative. + Features: * `hipStream` instances can be obtained from the runtime. Limitations: - * Not thread-safe - * No standard-compliant runtime API (might change in the future) + * No thread-safe access (unless all required arrays are present) + * No standard-compliant runtime API (might change long term) ## Runtime subfolders diff --git a/runtime/gpufort_acc_runtime/examples/test-nested-regions-2.f90 b/runtime/gpufort_acc_runtime/examples/test-nested-regions.f90 similarity index 100% rename from runtime/gpufort_acc_runtime/examples/test-nested-regions-2.f90 rename to runtime/gpufort_acc_runtime/examples/test-nested-regions.f90 diff --git a/runtime/gpufort_acc_runtime/examples/test-nested-regions-1.f90 b/runtime/gpufort_acc_runtime/examples/test-reusing.f90 similarity index 100% rename from runtime/gpufort_acc_runtime/examples/test-nested-regions-1.f90 rename to runtime/gpufort_acc_runtime/examples/test-reusing.f90 diff --git a/runtime/gpufort_acc_runtime/rules.mk b/runtime/gpufort_acc_runtime/rules.mk index 1032fba3..ff10002f 100644 --- a/runtime/gpufort_acc_runtime/rules.mk +++ b/runtime/gpufort_acc_runtime/rules.mk @@ -11,7 +11,7 @@ endif FCFLAGS += -DNULLPTR_MEANS_NOOP -DDELETE_NORECORD_MEANS_NOOP #FCFLAGS += -DBLOCKING_COPIES #FCFLAGS += -DEXIT_REGION_SYNCHRONIZE_STREAMS -FCFLAGS += -g -ggdb -O0 -fbacktrace -fmax-errors=5 # -DDEBUG=3 +#FCFLAGS += -g -ggdb -O0 -fbacktrace -fmax-errors=5 # -DDEBUG=3 CXX ?= g++ CXXFLAGS ?= diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 index 6718468b..21be164f 100644 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 @@ -32,7 +32,7 @@ module gpufort_acc_runtime_base integer, save :: LOG_LEVEL = 0 integer, save :: MAX_QUEUES = 64 - integer, save :: INITIAL_RECORD_LIST_CAPACITY = 4096 + integer, save :: INITIAL_RECORDS_CAPACITY = 4096 ! reuse/fragmentation controls integer, save :: BLOCK_SIZE = 32 real, save :: REUSE_THRESHOLD = 0.9 ! only reuse record if mem_new>=factor*mem_old @@ -533,7 +533,7 @@ subroutine t_record_list_initialize_(record_list) type(t_record), allocatable :: new_records(:) integer :: old_size ! - allocate(record_list%records(INITIAL_RECORD_LIST_CAPACITY)) + allocate(record_list%records(INITIAL_RECORDS_CAPACITY)) end subroutine subroutine t_record_list_grow_(record_list) @@ -624,7 +624,6 @@ function t_record_list_find_available_record_(record_list,num_bytes,reuse_existi reuse_existing = .false. loc = record_list%last_record_index+1 do i = 1, record_list%last_record_index - print *, "i=",i if ( .not. record_list%records(i)%is_initialized() ) then ! 1. buffer is empty loc = i reuse_existing = .false. @@ -742,17 +741,25 @@ subroutine gpufort_acc_init() else call get_environment_variable("GPUFORT_LOG_LEVEL", tmp) if (len_trim(tmp) > 0) read(tmp,*) LOG_LEVEL - call get_environment_variable("GPUFORT_REUSE_THRESHOLD", tmp) - if (len_trim(tmp) > 0) read(tmp,*) REUSE_THRESHOLD + ! call get_environment_variable("GPUFORT_MAX_QUEUES", tmp) if (len_trim(tmp) > 0) read(tmp,*) MAX_QUEUES - call get_environment_variable("GPUFORT_INITIAL_RECORD_LIST_CAPACITY", tmp) - if (len_trim(tmp) > 0) read(tmp,*) INITIAL_RECORD_LIST_CAPACITY + call get_environment_variable("GPUFORT_INITIAL_RECORDS_CAPACITY", tmp) + if (len_trim(tmp) > 0) read(tmp,*) INITIAL_RECORDS_CAPACITY + ! + call get_environment_variable("GPUFORT_BLOCK_SIZE", tmp) + if (len_trim(tmp) > 0) read(tmp,*) BLOCK_SIZE + call get_environment_variable("GPUFORT_REUSE_THRESHOLD", tmp) + if (len_trim(tmp) > 0) read(tmp,*) REUSE_THRESHOLD + call get_environment_variable("GPUFORT_NUM_REFS_TO_DEALLOCATE", tmp) + if (len_trim(tmp) > 0) read(tmp,*) NUM_REFS_TO_DEALLOCATE if ( LOG_LEVEL > 0 ) then write(*,*) "GPUFORT_LOG_LEVEL=",LOG_LEVEL - write(*,*) "GPUFORT_REUSE_THRESHOLD=",REUSE_THRESHOLD write(*,*) "GPUFORT_MAX_QUEUES=",MAX_QUEUES - write(*,*) "GPUFORT_INITIAL_RECORD_LIST_CAPACITY=",INITIAL_RECORD_LIST_CAPACITY + write(*,*) "GPUFORT_INITIAL_RECORDS_CAPACITY=",INITIAL_RECORDS_CAPACITY + write(*,*) "GPUFORT_BLOCK_SIZE=",BLOCK_SIZE + write(*,*) "GPUFORT_REUSE_THRESHOLD=",REUSE_THRESHOLD + write(*,*) "GPUFORT_NUM_REFS_TO_DEALLOCATE=",NUM_REFS_TO_DEALLOCATE endif ! call record_list_%initialize() From 1acbb9316faf73768c6a81a495c6f64d018afae7 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Tue, 26 Oct 2021 10:22:57 -0400 Subject: [PATCH 17/67] bugfix: tr*_dir*.py.in: Add missing arg to intrnl fun * add `scope` arg to signature of _intrnl_inout_arrays_in_subtree * Fixes all tests in /python/test/grammar_translator/openacc --- python/translator/translator_directives.py.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/translator/translator_directives.py.in b/python/translator/translator_directives.py.in index 5856349f..9ef3761b 100644 --- a/python/translator/translator_directives.py.in +++ b/python/translator/translator_directives.py.in @@ -45,8 +45,8 @@ def _intrnl_arrays_in_subtree(ttnode,scope): return isinstance(node,IValue) and\ type(node._value) is TTFunctionCallOrTensorAccess return _intrnl_search_values_in_subtree(ttnode,search_filter,scope,1) -def _intrnl_inout_arrays_in_subtree(ttnode): - def search_filter(node,scope): +def _intrnl_inout_arrays_in_subtree(ttnode,scope): + def search_filter(node): return type(node) is TTLValue and\ type(node._value) is TTFunctionCallOrTensorAccess return _intrnl_search_values_in_subtree(ttnode,search_filter,scope,1) @@ -591,4 +591,4 @@ def format_directive(directive_line,max_line_width): line = sentinel+" " line += tk+" " result += line.rstrip() - return result \ No newline at end of file + return result From d23cd4f371dccb2a61d4430907ac701e260ce24f Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Tue, 26 Oct 2021 10:28:16 -0400 Subject: [PATCH 18/67] bugfix: linemapper: detect additional line cont. expr * Detects now (additionally) expressions such as ``` & !$acc ``` and removes the &\s*\n\s*!$acc --- python/linemapper/linemapper.py | 7 +++++-- python/linemapper/linemapper_options.py.in | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/python/linemapper/linemapper.py b/python/linemapper/linemapper.py index b204ade0..b5b3754b 100644 --- a/python/linemapper/linemapper.py +++ b/python/linemapper/linemapper.py @@ -183,7 +183,7 @@ def _intrnl_convert_lines_to_statements(lines): """ global PATTERN_LINE_CONTINUATION - pContinuation = re.compile(PATTERN_LINE_CONTINUATION) + p_continuation = re.compile(PATTERN_LINE_CONTINUATION) # we look for a sequence ") " were word != "then". p_single_line_if = re.compile(r"^(?P[\s\t]*)(?Pif\s*\(.+\))\s*\b(?!then)(?P\w.+)",re.IGNORECASE) @@ -200,7 +200,10 @@ def _intrnl_convert_lines_to_statements(lines): indent_offset = num_indent_chars * indent_char # replace line continuation by whitespace, split at ";" - single_line_statements = pContinuation.sub(" "," ".join(lines)).split(";") + lines_content = " ".join(lines) + if "&" in lines_content: + lines_content = p_continuation.sub(" ",lines_content) + single_line_statements=lines_content.split(";") # unroll single-line if unrolled_statements = [] for stmt in single_line_statements: diff --git a/python/linemapper/linemapper_options.py.in b/python/linemapper/linemapper_options.py.in index 600d5aeb..56b45f20 100644 --- a/python/linemapper/linemapper_options.py.in +++ b/python/linemapper/linemapper_options.py.in @@ -1,6 +1,6 @@ LOG_PREFIX="linemapper.linemapper" # prefix for logging -PATTERN_LINE_CONTINUATION=r"([\&]\s*\n)|(\n[!c\*]\$\w+\&)" # line continuation pattern. The linemapper's preprocessor removes them. +PATTERN_LINE_CONTINUATION=r"(\&\s*\n\s*([!c\*]\$\w+)?)|(^\s*[!c\*]\$\w+\&\s*)" # line continuation pattern. The linemapper's preprocessor removes them. ERROR_HANDLING="strict" # 'strict': program terminates with error. Otherwise, a warning is printed. From 328af338d0de0e61d4c129282c8ab024ed29733e Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 28 Oct 2021 07:42:55 -0400 Subject: [PATCH 19/67] BUGFIX/translator: Fix syntax error --- python/translator/translator_directives.py.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/translator/translator_directives.py.in b/python/translator/translator_directives.py.in index 9ef3761b..56f2b6a3 100644 --- a/python/translator/translator_directives.py.in +++ b/python/translator/translator_directives.py.in @@ -369,7 +369,7 @@ class TTLoopKernel(TTContainer,IComputeConstruct): return self.__parent_directive().self_condition def deviceptrs(self): if self.__parent_directive().all_arrays_are_on_device(): - return self.arrays_in_body(scope) + return self.arrays_in_body() else: return self.__parent_directive().deviceptrs() def create_alloc_vars(self): From 78825fbda2363c4fc6b7c8f897cf5e257deaeb6d Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 28 Oct 2021 07:43:16 -0400 Subject: [PATCH 20/67] Add gpufort & linemapper feature FEATURE/linemapper: Allow to prepend and append lines directly to statement data structures and not only whole line. New data structure triggered changes in all dependent packages (scanner,indexer) FEATURE/gpufort: Add option to dump linemapper datastructure --- python/fort2hip/fort2hip.py | 4 +- python/gpufort.py | 29 ++- python/gpufort_options.py.in | 4 + python/indexer/indexer.py | 2 +- python/linemapper/linemapper.py | 136 ++++------- python/linemapper/linemapper_options.py.in | 30 ++- .../cudafortran/scanner_tree_cuf.py.in | 16 +- .../cudafortran/scanner_tree_cuf2omp.py.in | 2 +- python/scanner/openacc/scanner_tree_acc.py.in | 65 ++--- .../scanner_tree_acc2hipgpufortrt.py.in | 60 +++-- .../openacc/scanner_tree_acc2omp.py.in | 4 +- python/scanner/scanner.py | 96 ++++---- python/scanner/scanner_tree.py.in | 228 ++++++++++-------- .../linemapper/test.linemapper.linemapper.py | 4 +- 14 files changed, 338 insertions(+), 342 deletions(-) diff --git a/python/fort2hip/fort2hip.py b/python/fort2hip/fort2hip.py index 52ecc9de..e3fba71e 100644 --- a/python/fort2hip/fort2hip.py +++ b/python/fort2hip/fort2hip.py @@ -289,7 +289,7 @@ def _intrnl_update_context_from_loop_kernels(loop_kernels,index,hip_context,f_co hip_context["have_reductions"] = False for stkernel in loop_kernels: parse_result = stkernel.parse_result - parent_tag = stkernel._parent.tag() + parent_tag = stkernel.parent.tag() scope = scoper.create_scope(index,parent_tag) kernel_args, c_kernel_local_vars, macros, input_arrays, local_cpu_routine_args =\ @@ -739,4 +739,4 @@ def device_procedure_filter_(child): utils.logging.log_leave_function(LOG_PREFIX,"generate_hip_files") - return fortran_module_filepath, main_hip_filepath \ No newline at end of file + return fortran_module_filepath, main_hip_filepath diff --git a/python/gpufort.py b/python/gpufort.py index e6cc0741..29846841 100644 --- a/python/gpufort.py +++ b/python/gpufort.py @@ -60,7 +60,7 @@ def _intrnl_translate_source(infilepath,stree,linemaps,index,preamble): # transform statements; to 'linemaps' def transform_(stnode): stnode.transform_statements(index) - for child in stnode._children: + for child in stnode.children: transform_(child) transform_(stree) @@ -83,11 +83,11 @@ def parse_raw_command_line_arguments(): the argparse switches and help information. Further transform some arguments. """ - config_filepath = None + config_filepath = None working_dir_path = os.getcwd() - include_dirs = [] - defines = [] - options = sys.argv[1:] + include_dirs = [] + defines = [] + options = sys.argv[1:] for i,opt in enumerate(list(options)): if opt == "--working-dir": if i+1 < len(options): @@ -159,6 +159,8 @@ def parse_command_line_arguments(): global POST_CLI_ACTIONS global PRETTIFY_MODIFIED_TRANSLATION_SOURCE global INCLUDE_DIRS + global DUMP_LINEMAPS + global DUMP_LINEMAPS # parse command line arguments parser = argparse.ArgumentParser(description="S2S translation tool for CUDA Fortran and Fortran+X") @@ -199,12 +201,13 @@ def parse_command_line_arguments(): group_developer.add_argument("--log-level",dest="log_level",required=False,type=str,default="",help="Set log level. Overrides config value.") group_developer.add_argument("--log-filter",dest="log_filter",required=False,type=str,default=None,help="Filter the log output according to a regular expression.") group_developer.add_argument("--log-traceback",dest="log_traceback",required=False,action="store_true",help="Append gpufort traceback information to the log when encountering warning/error.") + group_developer.add_argument("--dump-linemaps",dest="dump_linemaps",required=False,action="store_true",help="Write the lines-to-statements mappings to disk pre & post applying code transformations.") group_developer.add_argument("--prof",dest="profiling_enable",required=False,action="store_true",help="Profile gpufort.") group_developer.add_argument("--prof-num-functions",dest="profiling_num_functions",required=False,type=int,default=50,help="The number of python functions to include into the summary [default=50].") group_developer.add_argument("--create-gpufort-headers",dest="create_gpufort_headers",action="store_true",help="Generate the GPUFORT header files.") - parser.set_defaults(print_config_defaults=False,dump_index=False,\ - wrap_in_ifdef=False,cublasV2=False, + parser.set_defaults(print_config_defaults=False, + dump_linemaps=False,wrap_in_ifdef=False,cublasV2=False, only_emit_kernels_and_launchers=False,only_emit_kernels=False,only_modify_translation_source=False,\ emit_cpu_implementation=False,emit_debug_code=False,\ create_gpufort_headers=False,print_gfortran_config=False,print_cpp_config=False,\ @@ -325,6 +328,9 @@ def parse_command_line_arguments(): if args.profiling_enable: PROFILING_ENABLE = True PROFILING_OUTPUT_NUM_FUNCTIONS = args.profiling_num_functions + # developer: other + if args.dump_linemaps: + DUMP_LINEMAPS = True # CUDA Fortran if args.cublasV2: scanner.CUBLAS_VERSION = 2 @@ -385,6 +391,11 @@ def init_logging(input_filepath): profiler.enable() # linemaps = linemapper.read_file(input_filepath,defines) + + if DUMP_LINEMAPS: + utils.logging.log_info(LOG_PREFIX,"__main__","dump linemaps (before translation)") + linemapper.dump_linemaps(linemaps,input_filepath+"-linemaps-pre.json") + index = create_index(INCLUDE_DIRS,defines,input_filepath,linemaps) if not ONLY_CREATE_GPUFORT_MODULE_FILES: # configure fort2hip @@ -423,6 +434,10 @@ def init_logging(input_filepath): stats.print_stats(PROFILING_OUTPUT_NUM_FUNCTIONS) print(s.getvalue()) + if DUMP_LINEMAPS: + utils.logging.log_info(LOG_PREFIX,"__main__","dump linemaps (after translation)") + linemapper.dump_linemaps(linemaps,input_filepath+"-linemaps-post.json") + # shutdown logging msg = "log file: {0} (log level: {1}) ".format(log_filepath,LOG_LEVEL) utils.logging.log_info(LOG_PREFIX,"__main__",msg) diff --git a/python/gpufort_options.py.in b/python/gpufort_options.py.in index dc3f8455..66ce03f1 100644 --- a/python/gpufort_options.py.in +++ b/python/gpufort_options.py.in @@ -40,3 +40,7 @@ PROFILING_ENABLE = False # Enable profiling of GPUFORT PROFILING_OUTPUT_NUM_FUNCTIONS = 50 # Number of functions to output when profiling GPUFORT + +DUMP_LINEMAPS = True + # Write the lines-to-statements mappings to disk before & after + # applying code transformations; suffix="-linemaps-(pre|post).json" diff --git a/python/indexer/indexer.py b/python/indexer/indexer.py index a0dd03c0..3e1c9ecc 100644 --- a/python/indexer/indexer.py +++ b/python/indexer/indexer.py @@ -83,7 +83,7 @@ def consider_statement(stripped_statement): for linemap in linemaps: if linemap["is_active"]: for stmt in linemap["statements"]: - stripped_statement = stmt.lower().strip(" \t\n") + stripped_statement = stmt["body"].lower().strip(" \t\n") if consider_statement(stripped_statement): utils.logging.log_debug3(LOG_PREFIX,"_intrnl_collect_statements","select statement '{}'".format(stripped_statement)) filtered_statements.append(stripped_statement) diff --git a/python/linemapper/linemapper.py b/python/linemapper/linemapper.py index b5b3754b..bbd2c51e 100644 --- a/python/linemapper/linemapper.py +++ b/python/linemapper/linemapper.py @@ -1,9 +1,10 @@ import os,sys import re -import addtoplevelpath +import orjson import pyparsing as pyp +import addtoplevelpath import utils.logging ERR_LINEMAPPER_MACRO_DEFINITION_NOT_FOUND = 11001 @@ -49,6 +50,14 @@ def _intrnl_expand_macros(input_string,macro_stack): iterate = True break return result + +def _intrnl_linearize_statements(linemap): + result = [] + for stmt in linemap["statements"]: + result += stmt["prolog"] + result.append(stmt["body"]) + result += stmt["epilog"] + return result def evaluate_condition(input_string,macro_stack): """ @@ -247,84 +256,6 @@ def _intrnl_detect_line_starts(lines): line_starts.append(len(lines)) return line_starts -def preprocess_and_normalize(fortran_file_lines,fortran_filepath,macro_stack,region_stack1,region_stack2): - """:param list file_lines: Lines of a file, terminated with line break characters ('\n'). - :returns: a list of dicts with keys 'lineno', 'original_lines', 'statements'. - """ - global LOG_PREFIX - global ERROR_HANDLING - - global INDENT_WIDTH_WHITESPACE - global INDENT_WIDTH_TABS - - global DEFAULT_INDENT_CHAR - global ONLY_APPLY_USER_DEFINED_MACROS - - utils.logging.log_enter_function(LOG_PREFIX,"preprocess_and_normalize",{ - "fortran_filepath":fortran_filepath - }) - - assert DEFAULT_INDENT_CHAR in [' ','\t'], "Indent char must be whitespace ' ' or tab '\\t'" - - # 1. detect line starts - line_starts = _intrnl_detect_line_starts(fortran_file_lines) - - # 2. go through the blocks of buffered lines - linemaps = [] - for i,_ in enumerate(line_starts[:-1]): - line_start = line_starts[i] - next_line_start = line_starts[i+1] - lines = fortran_file_lines[line_start:next_line_start] - - included_linemaps = [] - is_preprocessor_directive = lines[0].startswith("#") - if is_preprocessor_directive and not ONLY_APPLY_USER_DEFINED_MACROS: - try: - included_linemaps = _intrnl_handle_preprocessor_directive(lines,fortran_filepath,macro_stack,region_stack1,region_stack2) - statements1 = [] - statements3 = [] - except Exception as e: - raise e - elif region_stack1[-1]: # in_active_region - # Convert line to statememts - statements1 = _intrnl_convert_lines_to_statements(lines) - # 2. Apply macros to statements - statements2 = [] - for stmt1 in statements1: - statements2.append(_intrnl_expand_macros(stmt1,macro_stack)) - # 3. Above processing might introduce multiple statements per line againa. - # Hence, convert each element of statements2 to single statements again - statements3 = [] - for stmt2 in statements2: - for stmt3 in _intrnl_convert_lines_to_statements([stmt2]): - statements3.append(stmt3) - # TODO(Dominic): In case, we really need to assume that people write Fortran code - # such as `module mymod; integer :: myint; end module` and we therefore might - # require epilog/prolog per line, this will be the place where replace - # the string stmt3 by a dictionary. - # (If we would do this, we can actually also linemap positional information in a next step.) - - #if len(included_linemaps) or (not is_preprocessor_directive and region_stack1[-1]): - linemap = { - "file": fortran_filepath, - "lineno": line_start+1, # key - "lines": lines, - "raw_statements": statements1, - "included_linemaps": included_linemaps, - "is_preprocessor_directive": is_preprocessor_directive, - "is_active": region_stack1[-1], - # inout - "statements": statements3, - "modified": False, - # out - "prolog": [], - "epilog": [] - } - linemaps.append(linemap) - - utils.logging.log_leave_function(LOG_PREFIX,"preprocess_and_normalize") - return linemaps - def _intrnl_preprocess_and_normalize_fortran_file(fortran_filepath,macro_stack,region_stack1,region_stack2): """ :throws: IOError if the specified file cannot be found/accessed. @@ -403,7 +334,7 @@ def collect_subst_(linemap): for linemap in linemap["included_linemaps"]: subst += collect_subst_(linemap) elif linemap["modified"]: - subst += linemap["statements"] + subst += _intrnl_linearize_statements(linemap) else: # for included linemaps subst += linemap["lines"] if len(linemap["epilog"]): @@ -528,28 +459,28 @@ def preprocess_and_normalize(fortran_file_lines,fortran_filepath,macro_stack=[], statements3 = [] for stmt2 in statements2: for stmt3 in _intrnl_convert_lines_to_statements([stmt2]): - statements3.append(stmt3) - # TODO(Dominic): In case, we really need to assume that people write Fortran code - # such as `module mymod; integer :: myint; end module` and we therefore might - # require epilog/prolog per line, this will be the place where replace - # the string stmt3 by a dictionary. - # (If we would do this, we can actually also linemap positional information in a next step.) + statement = { + "epilog": [], + "prolog": [], + "body": stmt3 + } + statements3.append(statement) #if len(included_linemaps) or (not is_preprocessor_directive and region_stack1[-1]): linemap = { - "file": fortran_filepath, - "lineno": line_start+1, # key - "lines": lines, - "raw_statements": statements1, + "file": fortran_filepath, + "lineno": line_start+1, # key + "lines": lines, + "raw_statements": statements1, "included_linemaps": included_linemaps, "is_preprocessor_directive": is_preprocessor_directive, - "is_active": region_stack1[-1], + "is_active": region_stack1[-1], # inout - "statements": statements3, - "modified": False, + "statements": statements3, + "modified": False, # out - "prolog": [], - "epilog": [] + "prolog": [], + "epilog": [] } linemaps.append(linemap) @@ -666,6 +597,8 @@ def render_file_(linemaps): if condition1 and condition2: if len(linemap["included_linemaps"]): result += render_file_(linemap["included_linemaps"]) + elif stage=="statements": + result += "".join(_intrnl_linearize_statements(linemap)) else: result += "".join(linemap[stage]) return result @@ -673,3 +606,16 @@ def render_file_(linemaps): utils.logging.log_leave_function(LOG_PREFIX,"render_file") return render_file_(linemaps).strip("\n") + +def dump_linemaps(linemaps,filepath): + global PRETTY_PRINT_LINEMAPS_DUMP + global LOG_PREFIX + utils.logging.log_enter_function(LOG_PREFIX,"dump_linemaps",{"filepath":filepath}) + + with open(filepath,"wb") as outfile: + if PRETTY_PRINT_LINEMAPS_DUMP: + outfile.write(orjson.dumps(linemaps,option=orjson.OPT_INDENT_2)) + else: + outfile.write(orjson.dumps(linemaps)) + + utils.logging.log_leave_function(LOG_PREFIX,"dump_linemaps") diff --git a/python/linemapper/linemapper_options.py.in b/python/linemapper/linemapper_options.py.in index 56b45f20..857f9061 100644 --- a/python/linemapper/linemapper_options.py.in +++ b/python/linemapper/linemapper_options.py.in @@ -1,18 +1,28 @@ LOG_PREFIX="linemapper.linemapper" # prefix for logging +PRETTY_PRINT_LINEMAPS_DUMP = False + # Prettify linemaps JSON files. +PATTERN_LINE_CONTINUATION=r"(\&\s*\n\s*([!c\*]\$\w+)?)|(^\s*[!c\*]\$\w+\&\s*)" + # line continuation pattern. The linemapper's preprocessor removes them. -PATTERN_LINE_CONTINUATION=r"(\&\s*\n\s*([!c\*]\$\w+)?)|(^\s*[!c\*]\$\w+\&\s*)" # line continuation pattern. The linemapper's preprocessor removes them. +ERROR_HANDLING="strict" + # 'strict': program terminates with error. Otherwise, a warning is printed. -ERROR_HANDLING="strict" # 'strict': program terminates with error. Otherwise, a warning is printed. +USER_DEFINED_MACROS = [] + # manually add macro definitions: dicts with entries 'name' (str), 'args' (list of str), and 'subst' (str) -USER_DEFINED_MACROS = [] # manually add macro definitions: dicts with entries 'name' (str), 'args' (list of str), and 'subst' (str) +ONLY_APPLY_USER_DEFINED_MACROS = False + # Only apply user defined macros (incl. compiler options) and turn off other preprocessing (-> all code is active) -ONLY_APPLY_USER_DEFINED_MACROS = False # Only apply user defined macros (incl. compiler options) and turn off other preprocessing (-> all code is active) +INDENT_WIDTH_WHITESPACE=2 + # number of indent chars if indentation uses whitespaces +INDENT_WIDTH_TABS=1 + # number of indent chars if indentation uses tabs -INDENT_WIDTH_WHITESPACE=2 # number of indent chars if indentation uses whitespaces -INDENT_WIDTH_TABS=1 # number of indent chars if indentation uses tabs - -DEFAULT_INDENT_CHAR=' ' # The default index char to use if no other char was detected (' ' or '\t'). +DEFAULT_INDENT_CHAR=' ' + # The default index char to use if no other char was detected (' ' or '\t'). LINE_GROUPING_INCLUDE_BLANK_LINES = True -LINE_GROUPING_WRAP_IN_IFDEF = False # Introduce ifdef-else-endif preprocessor block around modified lines and keep the original in the else branch. -LINE_GROUPING_IFDEF_MACRO = "__GPUFORT" # Macro to use in the ifdef directive. +LINE_GROUPING_WRAP_IN_IFDEF = False + # Introduce ifdef-else-endif preprocessor block around modified lines and keep the original in the else branch. +LINE_GROUPING_IFDEF_MACRO = "__GPUFORT" + # Macro to use in the ifdef directive. diff --git a/python/scanner/cudafortran/scanner_tree_cuf.py.in b/python/scanner/cudafortran/scanner_tree_cuf.py.in index 06cf3634..d1e4adfb 100644 --- a/python/scanner/cudafortran/scanner_tree_cuf.py.in +++ b/python/scanner/cudafortran/scanner_tree_cuf.py.in @@ -26,16 +26,16 @@ class STCufDirective(STDirective): https://www.openacc.org/sites/default/files/inline-files/OpenCUF.2.7.pdf) """ - def __init__(self,parent,lineno,lines,directive_no): - STDirective.__init__(self,parent,lineno,lines,directive_no,sentinel="!$cuf") + def __init__(self,lineno,lines,directive_no): + STDirective.__init__(self,lineno,lines,directive_no,sentinel="!$cuf") self._default_present_vars = [] def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): assert False, "Currently, there are only CUF parallel directives" class STCufLoopKernel(STCufDirective,STLoopKernel): - def __init__(self,parent,lineno,lines,directive_no): - STCufDirective.__init__(self,parent,lineno,lines,directive_no) - STLoopKernel.__init__(self,parent,lineno,lines) + def __init__(self,lineno,lines,directive_no): + STCufDirective.__init__(self,lineno,lines,directive_no) + STLoopKernel.__init__(self,lineno,lines) def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[],destination_dialect=""): """ :param destination_dialect: allows to override default if this kernel @@ -53,7 +53,7 @@ def handle_allocate_cuf(stallocate,joined_statements,index): bytes_per_element = [] array_qualifiers = [] for array_name in stallocate.parse_result.variable_names(): - ivar,_ = scoper.search_index_for_variable(index,stallocate._parent.tag(),\ + ivar,_ = scoper.search_index_for_variable(index,stallocate.parent.tag(),\ array_name) bytes_per_element.append(ivar["bytes_per_element"]) qualifier, transformation_required = pinned_or_on_device(ivar) @@ -67,7 +67,7 @@ def handle_deallocate_cuf(stdeallocate,joined_statements,index): transformed = False array_qualifiers = [] for array_name in stdeallocate.parse_result.variable_names(): - ivar,_ = scoper.search_index_for_variable(index,stdeallocate._parent.tag(),\ + ivar,_ = scoper.search_index_for_variable(index,stdeallocate.parent.tag(),\ array_name) on_device = index_variable_is_on_device(ivar) qualifier, transformed1 = pinned_or_on_device(ivar) @@ -95,7 +95,7 @@ def postprocess_tree_cuf(stree,index,destination_dialect=""): indent = self.first_line_indent() last_decl_list_node.add_to_epilog("{0}type(c_ptr) :: hipblasHandle = c_null_ptr\n".format(indent)) - local_cublas_calls = call._parent.find_all(filter=has_cublas_call, recursively=False) + local_cublas_calls = call.parent.find_all(filter=has_cublas_call, recursively=False) first = local_cublas_calls[0] indent = self.first_line_indent() first.add_to_prolog("{0}hipblasCreate(hipblasHandle)\n".format(indent)) diff --git a/python/scanner/cudafortran/scanner_tree_cuf2omp.py.in b/python/scanner/cudafortran/scanner_tree_cuf2omp.py.in index 6b6a0daa..2d80f661 100644 --- a/python/scanner/cudafortran/scanner_tree_cuf2omp.py.in +++ b/python/scanner/cudafortran/scanner_tree_cuf2omp.py.in @@ -9,7 +9,7 @@ class CufLoopKernel2Omp(CufBackendBase): """ global LOG_PREFIX try: - parent_tag = self._stnode._parent.tag() + parent_tag = self._stnode.parent.tag() scope = scoper.create_scope(index,parent_tag) parse_result = translator.parse_loop_kernel(joined_statements.split("\n"),scope) f_snippet = joined_lines if statements_fully_cover_lines else joined_statements diff --git a/python/scanner/openacc/scanner_tree_acc.py.in b/python/scanner/openacc/scanner_tree_acc.py.in index 1ba3a786..c7a730a8 100644 --- a/python/scanner/openacc/scanner_tree_acc.py.in +++ b/python/scanner/openacc/scanner_tree_acc.py.in @@ -49,11 +49,11 @@ exec(open("{0}/openacc/scanner_tree_acc2hipgccrt.py.in".format(scanner_dir)).rea class STAccDirective(STDirective): """Class for handling ACC directives.""" - def __init__(self,parent,first_linemap,first_linemap_first_statement,directive_no): - STDirective.__init__(self,parent,first_linemap,first_linemap_first_statement,directive_no,sentinel="!$acc") + def __init__(self,first_linemap,first_linemap_first_statement,directive_no): + STDirective.__init__(self,first_linemap,first_linemap_first_statement,directive_no,sentinel="!$acc") self._default_present_vars = [] def find_substring(self,token): - return token in self.single_line_statement() + return token in self.first_statement() def find_any_substring(self,tokens): result = False for token in tokens: @@ -113,7 +113,7 @@ class STAccDirective(STDirective): is_kernels_directive={is_kernels_directive}, is_parallel_loop_directive={is_parallel_loop_directive} }} """.format( - single_line_statement=self.single_line_statement(), + single_line_statement=self.first_statement(), is_init_directive=self.is_init_directive(), is_shutdown_directive=self.is_shutdown_directive(), is_end_directive=self.is_end_directive(), @@ -134,9 +134,9 @@ class STAccDirective(STDirective): return ACC_BACKENDS[checked_dialect](self).transform(\ joined_lines,joined_statements,statements_fully_cover_lines,index) class STAccLoopKernel(STAccDirective,STLoopKernel): - def __init__(self,parent,first_linemap,first_linemap_first_statement,directive_no): - STAccDirective.__init__(self,parent,first_linemap,first_linemap_first_statement,directive_no) - STLoopKernel.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,first_linemap,first_linemap_first_statement,directive_no): + STAccDirective.__init__(self,first_linemap,first_linemap_first_statement,directive_no) + STLoopKernel.__init__(self,first_linemap,first_linemap_first_statement) def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[],destination_dialect=""): """ :param destination_dialect: allows to override default if this kernel @@ -151,21 +151,21 @@ def handle_allocate_acc(stallocate,joined_statements,index,destination_dialect=" indent = stallocate.first_line_indent() checked_dialect = check_destination_dialect(\ DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) - epilog = ACC_ALLOCATE_BACKENDS[checked_dialect](stallocate,index) - if len(epilog): - return indent + joined_statements.rstrip("\n")+"\n"+epilog, True - else: - return joined_statements, False + if checked_dialect in ACC_ALLOCATE_BACKENDS: + epilog = ACC_ALLOCATE_BACKENDS[checked_dialect](stallocate,index) + for line in epilog: + stallocate.add_to_epilog(line) + return joined_statements, False def handle_deallocate_acc(stdeallocate,joined_statements,index,destination_dialect=""): indent = stdeallocate.first_line_indent() checked_dialect = check_destination_dialect(\ DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) - prolog = ACC_DEALLOCATE_BACKENDS[checked_dialect](stdeallocate,index) - if len(prolog): - return prolog.rstrip("\n") + "\n" + indent + joined_statements.rstrip("\n"), True - else: - return joined_statements, False + if checked_dialect in ACC_DEALLOCATE_BACKENDS: + prolog = ACC_DEALLOCATE_BACKENDS[checked_dialect](stdeallocate,index) + for line in prolog: + stdeallocate.add_to_prolog(line) + return joined_statements, False def postprocess_tree_acc(stree,index,destination_dialect=""): """ @@ -180,20 +180,21 @@ def postprocess_tree_acc(stree,index,destination_dialect=""): checked_dialect = check_destination_dialect(\ DESTINATION_DIALECT if not len(destination_dialect) else destination_dialect) - def directive_filter(node): - return isinstance(node,STAccDirective) and\ - not node.ignore_in_s2s_translation - directives = stree.find_all(filter=directive_filter, recursively=True) - for directive in directives: - stnode = directive._parent.first_entry_in_decl_list() - # add acc use statements - if not stnode is None: - indent = stnode.first_line_indent() - acc_runtime_module_name = RUNTIME_MODULE_NAMES[checked_dialect] - if acc_runtime_module_name != None and len(acc_runtime_module_name): - stnode.add_to_prolog("{0}use {1}\n{0}use iso_c_binding\n".format(indent,acc_runtime_module_name)) - #if type(directive._parent - # call backend - ACC_POSTPROCESS_BACKENDS[checked_dialect]().run(stree,index) + if checked_dialect in ACC_POSTPROCESS_BACKENDS: + def directive_filter(node): + return isinstance(node,STAccDirective) and\ + not node.ignore_in_s2s_translation + directives = stree.find_all(filter=directive_filter, recursively=True) + for directive in directives: + stnode = directive.parent.first_entry_in_decl_list() + # add acc use statements + if not stnode is None: + indent = stnode.first_line_indent() + acc_runtime_module_name = RUNTIME_MODULE_NAMES[checked_dialect] + if acc_runtime_module_name != None and len(acc_runtime_module_name): + stnode.add_to_prolog("{0}use {1}\n{0}use iso_c_binding\n".format(indent,acc_runtime_module_name)) + #if type(directive.parent + # call backend + ACC_POSTPROCESS_BACKENDS[checked_dialect]().run(stree,index) utils.logging.log_leave_function(LOG_PREFIX,"postprocess_tree_acc") diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index a68424f4..5e738f6d 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -49,12 +49,6 @@ def dev_var_name(var): result = result.replace("$","_") return ACC_DEV_PREFIX + result + ACC_DEV_SUFFIX -def add_device_vars_to_decl_list(stcontainer,temp_vars): - # introduce the new variables - stcontainer.append_to_decl_list(\ - ["type(c_ptr) :: {var}\n".format(var=var) for var in temp_vars],\ - prepend=True) - def add_implicit_region(stcontainer): last_decl_list_node = stcontainer.last_entry_in_decl_list() indent = last_decl_list_node.first_line_indent() @@ -85,7 +79,7 @@ class Acc2HipGpufortRT(AccBackendBase): :return: If a finalize clause is present :rtype: bool """ - return len(translator.acc_clause_finalize.searchString(self.single_line_statement(),1)) + return len(translator.acc_clause_finalize.searchString(self.first_statement(),1)) def _handle_mapping_clauses(self): """ """ @@ -93,7 +87,7 @@ class Acc2HipGpufortRT(AccBackendBase): temp_vars = set() indent = self._stnode.first_line_indent() # - for parse_result in translator.acc_mapping_clause.scanString(self._stnode.single_line_statement()): + for parse_result in translator.acc_mapping_clause.scanString(self._stnode.first_statement()): clause = parse_result[0][0] if clause.kind in MAPPING_CLAUSE_2_TEMPLATE_MAP: var_names = clause.var_names() @@ -112,7 +106,7 @@ class Acc2HipGpufortRT(AccBackendBase): result = "" indent = self._stnode.first_line_indent() # update host - for parse_result in translator.acc_mapping_clause.scanString(self._stnode.single_line_statement()): + for parse_result in translator.acc_mapping_clause.scanString(self._stnode.first_statement()): clause = parse_result[0][0] if clause.kind in ["self","host","device"]: clause_kind = "host" if clause.kind=="self" else clause.kind @@ -129,7 +123,7 @@ class Acc2HipGpufortRT(AccBackendBase): # wait indent = self._stnode.first_line_indent() template = HIP_GPUFORT_RT_ACC_WAIT - for parse_result in translator.acc_clause_wait.scanString(self._stnode.single_line_statement()): + for parse_result in translator.acc_clause_wait.scanString(self._stnode.first_statement()): queue_list=[] asyncr_list=[] for rvalue in parse_result[0][0]: # queue ids @@ -150,7 +144,7 @@ class Acc2HipGpufortRT(AccBackendBase): :rtype: str """ condition = "" - for parse_result in translator.acc_clause_if.searchString(self._stnode.single_line_statement(),1): + for parse_result in translator.acc_clause_if.searchString(self._stnode.first_statement(),1): condition = parse_result[0].condition() return condition def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[],handle_if=True): @@ -219,7 +213,7 @@ class Acc2HipGpufortRT(AccBackendBase): condition=condition, result=result.rstrip("\n")) # introduce the new variables - add_device_vars_to_decl_list(stnode._parent,all_temp_vars) + stnode.parent.append_vars_to_decl_list(all_temp_vars) return result, len(result) @@ -237,7 +231,7 @@ class AccLoopKernel2HipGpufortRT(Acc2HipGpufortRT): "{indent}{dev_var} = gpufort_acc_present({var}{asyncr}{alloc})\n" template = HIP_GPUFORT_RT_ACC_PRESENT indent = stloopkernel.first_line_indent() - default_clauses = translator.acc_clause_default.searchString(stloopkernel.single_line_statement(),1) + default_clauses = translator.acc_clause_default.searchString(stloopkernel.first_statement(),1) if len(default_clauses): value = str(default_clauses[0][0][0]).lower() #print(value) @@ -266,10 +260,10 @@ class AccLoopKernel2HipGpufortRT(Acc2HipGpufortRT): result, _ = Acc2HipGpufortRT.transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index,handle_if=False) partial_result, transformed, temp_vars = self._handle_default() if transformed: - add_device_vars_to_decl_list(stloopkernel._parent,temp_vars) - result = result.rstrip("\n") + "\n" + partial_result + stloopkernel.parent.append_vars_to_decl_list(temp_vars) + result = "\n".join([result.rstrip("\n"), partial_result]) partial_result, _ = STLoopKernel.transform(stloopkernel,joined_lines,joined_statements,statements_fully_cover_lines,index) - result = result.rstrip("\n") + "\n" + partial_result + result = "\n".join([result.rstrip("\n"), partial_result]) # handle default self._handle_default() @@ -302,9 +296,9 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): recursively=True) for stcontainer in containers: last_decl_list_node = stcontainer.last_entry_in_decl_list() - indent = last_decl_list_node.first_line_indent() - scope = scoper.create_scope(index,stcontainer.tag()) - scope_vars = scope["variables"] + indent = last_decl_list_node.first_line_indent() + scope = scoper.create_scope(index,stcontainer.tag()) + scope_vars = scope["variables"] local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) # TODO also process type members acc_present_calls = "" @@ -320,7 +314,7 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): is_pointer = "pointer" in ivar["qualifiers"] if not is_allocatable: if not is_used_module_var: implicit_region = True - global_var = ",global=.TRUE." if is_used_module_var else "" + module_var = ",module_var=.TRUE." if is_used_module_var else "" if is_pointer: cond = "{indent}if (associated({var})) " acc_present_template = (cond+HIP_GPUFORT_RT_ACC_PRESENT.replace("{indent}","")) @@ -331,23 +325,23 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): map_kind=HIP_GPUFORT_RT_CLAUSES_OMP2ACC[ivar["declare_on_target"]] acc_present_calls += acc_present_template.format(\ indent=indent,var=host_var,asyncr="",\ - alloc=global_var+","+map_kind+"=.TRUE.",dev_var=dev_var) + alloc=module_var+","+map_kind+"=.TRUE.",dev_var=dev_var) temp_vars.append(dev_var) if len(acc_present_calls): - add_device_vars_to_decl_list(stcontainer,temp_vars) + stcontainer.append_vars_to_decl_list(temp_vars) if implicit_region: add_implicit_region(stcontainer) last_decl_list_node.add_to_epilog(acc_present_calls) utils.logging.log_leave_function(LOG_PREFIX,"Acc2HipGpufortRTPostprocess.run") def AllocateHipGpufortRT(stallocate,index): - stcontainer = stallocate._parent + stcontainer = stallocate.parent parent_tag = stcontainer.tag() scope = scoper.create_scope(index,parent_tag) scope_vars = scope["variables"] indent = stallocate.first_line_indent() local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) - acc_present_calls = "" + acc_present_calls = [] temp_vars = [] implicit_region = False for var in stallocate.variable_names: @@ -360,28 +354,28 @@ def AllocateHipGpufortRT(stallocate,index): is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ "pointer" in ivar["qualifiers"] assert is_allocatable_or_pointer - global_var = ",global=.TRUE." if is_used_module_var else "" + module_var = ",module_var=.TRUE." if is_used_module_var else "" if not is_used_module_var: implicit_region = True if ivar["declare_on_target"] in HIP_GPUFORT_RT_CLAUSES_OMP2ACC.keys(): map_kind=HIP_GPUFORT_RT_CLAUSES_OMP2ACC[ivar["declare_on_target"]] - acc_present_calls += HIP_GPUFORT_RT_ACC_PRESENT.format(\ + acc_present_calls.append(HIP_GPUFORT_RT_ACC_PRESENT.format(\ indent=indent,var=host_var,asyncr="",\ - alloc=global_var+","+map_kind+"=.TRUE.",dev_var=dev_var) + alloc=module_var+","+map_kind+"=.TRUE.",dev_var=dev_var)) temp_vars.append(dev_var) if len(acc_present_calls): - add_device_vars_to_decl_list(stcontainer,temp_vars) + stcontainer.append_vars_to_decl_list(temp_vars) if implicit_region: add_implicit_region(stcontainer) return acc_present_calls def DeallocateHipGpufortRT(stdeallocate,index): - stcontainer = stdeallocate._parent + stcontainer = stdeallocate.parent parent_tag = stcontainer.tag() scope = scoper.create_scope(index,parent_tag) scope_vars = scope["variables"] indent = stdeallocate.first_line_indent() local_var_names, dummy_arg_names = stcontainer.local_and_dummy_variable_names(index) - acc_delete_calls = "" + acc_delete_calls = [] for var in stdeallocate.variable_names: ivar,_ = scoper.search_index_for_variable(index,parent_tag,var) host_var = ivar["name"] @@ -392,11 +386,11 @@ def DeallocateHipGpufortRT(stdeallocate,index): is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ "pointer" in ivar["qualifiers"] assert is_allocatable_or_pointer - global_var = ",global=.TRUE." if is_used_module_var else "" + module_var = ",module_var=.TRUE." if is_used_module_var else "" if ivar["declare_on_target"] in ["alloc","to","tofrom"]: - acc_delete_calls += HIP_GPUFORT_RT_ACC_DELETE.format(\ + acc_delete_calls.append(HIP_GPUFORT_RT_ACC_DELETE.format(\ indent=indent,var=host_var,asyncr="",finalize="",\ - alloc=global_var,dev_var=dev_var) + alloc=module_var,dev_var=dev_var)) return acc_delete_calls register_acc_backend("hip-gpufort-rt",\ diff --git a/python/scanner/openacc/scanner_tree_acc2omp.py.in b/python/scanner/openacc/scanner_tree_acc2omp.py.in index 09c3b36e..843a2f3e 100644 --- a/python/scanner/openacc/scanner_tree_acc2omp.py.in +++ b/python/scanner/openacc/scanner_tree_acc2omp.py.in @@ -24,7 +24,7 @@ class AccLoopKernel2Omp(AccBackendBase): else: snippet = joined_statements try: - parent_tag = self._stnode._parent.tag() + parent_tag = self._stnode.parent.tag() scope = scoper.create_scope(index,parent_tag) parse_result = translator.parse_loop_kernel(snippet.split("\n"),scope) return parse_result.omp_f_str(snippet), True @@ -44,4 +44,4 @@ register_acc_backend("omp",\ AccPostprocessBackendBase,\ AllocateOmp,\ DeallocateOmp,\ - None) + None) \ No newline at end of file diff --git a/python/scanner/scanner.py b/python/scanner/scanner.py index df0c7e0d..9016c9be 100644 --- a/python/scanner/scanner.py +++ b/python/scanner/scanner.py @@ -74,20 +74,24 @@ def append_if_not_recording_(new): nonlocal current_node nonlocal keep_recording if not keep_recording: + new.parent=current_node current_node.append(new) def descend_(new): nonlocal current_node nonlocal current_linemap nonlocal current_statement_no + parent_node_id = current_node.kind + parent_node_name = current_node.name + + new.parent=current_node current_node.append(new) current_node=new current_node_id = current_node.kind if current_node.name != None: current_node_id += " '"+current_node.name+"'" - parent_node_id = current_node._parent.kind - if current_node._parent.name != None: - parent_node_id += ":"+current_node._parent.name + if parent_node_name != None: + parent_node_id += ":"+parent_node_name utils.logging.log_debug(LOG_PREFIX,"parse_file","[current-node={0}] enter {1} in line {2}: '{3}'".format(\ parent_node_id,current_node_id,current_linemap["lineno"],current_linemap["lines"][0].rstrip("\n"))) @@ -96,18 +100,17 @@ def ascend_(): nonlocal current_file nonlocal current_linemap nonlocal current_statement_no - assert not current_node._parent is None, "In file {}: parent of {} is none".format(current_file,type(current_node)) - + assert not current_node.parent is None, "In file {}: parent of {} is none".format(current_file,type(current_node)) current_node_id = current_node.kind if current_node.name != None: current_node_id += " '"+current_node.name+"'" - parent_node_id = current_node._parent.kind - if current_node._parent.name != None: - parent_node_id += ":"+current_node._parent.name + parent_node_id = current_node.parent.kind + if current_node.parent.name != None: + parent_node_id += ":"+current_node.parent.name utils.logging.log_debug(LOG_PREFIX,"parse_file","[current-node={0}] leave {1} in line {2}: '{3}'".format(\ parent_node_id,current_node_id,current_linemap["lineno"],current_linemap["lines"][0].rstrip("\n"))) - current_node = current_node._parent + current_node = current_node.parent # parse actions def Module_visit(tokens): @@ -116,7 +119,7 @@ def Module_visit(tokens): nonlocal current_linemap nonlocal current_statement_no log_detection_("module") - new = STModule(tokens[0],current_node,current_linemap,current_statement_no) + new = STModule(tokens[0],current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled descend_(new) def Program_visit(tokens): @@ -125,7 +128,7 @@ def Program_visit(tokens): nonlocal current_linemap nonlocal current_statement_no log_detection_("program") - new = STProgram(tokens[0],current_node,current_linemap,current_statement_no) + new = STProgram(tokens[0],current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled descend_(new) def Function_visit(tokens): @@ -135,8 +138,8 @@ def Function_visit(tokens): nonlocal keep_recording nonlocal index log_detection_("function") - new = STProcedure(tokens[1],"function",\ - current_node,current_linemap,current_statement_no,index) + new = STProcedure(tokens[1],current_node.tag(),"function",\ + current_linemap,current_statement_no,index) new.ignore_in_s2s_translation = not translation_enabled keep_recording = new.keep_recording() descend_(new) @@ -147,8 +150,8 @@ def Subroutine_visit(tokens): nonlocal keep_recording nonlocal index log_detection_("subroutine") - new = STProcedure(tokens[1],"subroutine",\ - current_node,current_linemap,current_statement_no,index) + new = STProcedure(tokens[1],current_node.tag(),"subroutine",\ + current_linemap,current_statement_no,index) new.ignore_in_s2s_translation = not translation_enabled keep_recording = new.keep_recording() descend_(new) @@ -165,7 +168,7 @@ def End(): current_node.complete_init(index) keep_recording = False if not keep_recording and type(current_node) in [STProcedure,STProgram]: - new = STEndOrReturn(current_node,current_linemap,current_statement_no) + new = STEndOrReturn(current_linemap,current_statement_no) append_if_not_recording_(new) ascend_() def Return(): @@ -174,7 +177,7 @@ def Return(): nonlocal keep_recording log_detection_("return statement") if not keep_recording and type(current_node) in [STProcedure,STProgram]: - new = STEndOrReturn(current_node,current_linemap,current_statement_no) + new = STEndOrReturn(current_linemap,current_statement_no) append_if_not_recording_(new) def in_kernels_acc_region_and_not_recording(): nonlocal current_node @@ -190,7 +193,7 @@ def DoLoop_visit(): nonlocal keep_recording log_detection_("do loop") if in_kernels_acc_region_and_not_recording(): - new = STAccLoopKernel(current_node,current_linemap,current_statement_no) + new = STAccLoopKernel(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled new._do_loop_ctr_memorised=do_loop_ctr descend_(new) @@ -218,7 +221,7 @@ def Declaration(): nonlocal current_linemap nonlocal current_statement_no log_detection_("declaration") - new = STDeclaration(current_node,current_linemap,current_statement_no) + new = STDeclaration(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def Attributes(tokens): @@ -227,7 +230,7 @@ def Attributes(tokens): nonlocal current_linemap nonlocal current_statement_no log_detection_("attributes statement") - new = STAttributes(current_node,current_linemap,current_statement_no) + new = STAttributes(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled current_node.append(new) def UseStatement(tokens): @@ -235,7 +238,7 @@ def UseStatement(tokens): nonlocal current_linemap nonlocal current_statement_no log_detection_("use statement") - new = STUseStatement(current_node,current_linemap,current_statement_no) + new = STUseStatement(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled new.name = translator.make_f_str(tokens[1]) # just get the name, ignore specific includes append_if_not_recording_(new) @@ -245,7 +248,7 @@ def PlaceHolder(): nonlocal current_linemap nonlocal current_statement_no log_detection_("placeholder") - new = STPlaceHolder(current_node,current_linemap,current_statement_no) + new = STPlaceHolder(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def NonZeroCheck(tokens): @@ -254,7 +257,7 @@ def NonZeroCheck(tokens): nonlocal current_linemap nonlocal current_statement_no log_detection_("non-zero check") - new = STNonZeroCheck(current_node,current_linemap,current_statement_no) + new = STNonZeroCheck(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def Allocated(tokens): @@ -263,7 +266,7 @@ def Allocated(tokens): nonlocal current_linemap nonlocal current_statement_no log_detection_("allocated statement") - new = STAllocated(current_node,current_linemap,current_statement_no) + new = STAllocated(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def Allocate(tokens): @@ -272,7 +275,7 @@ def Allocate(tokens): nonlocal current_linemap nonlocal current_statement_no log_detection_("allocate statement") - new = STAllocate(current_node,current_linemap,current_statement_no) + new = STAllocate(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def Deallocate(tokens): @@ -282,7 +285,7 @@ def Deallocate(tokens): nonlocal current_statement_no log_detection_("deallocate statement") # TODO filter variable, replace with hipFree - new = STDeallocate(current_node,current_linemap,current_statement_no) + new = STDeallocate(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def Memcpy(tokens): @@ -291,7 +294,7 @@ def Memcpy(tokens): nonlocal current_linemap nonlocal current_statement_no log_detection_("memcpy") - new = STMemcpy(current_node,current_linemap,current_statement_no) + new = STMemcpy(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def CudaLibCall(tokens): @@ -304,11 +307,11 @@ def CudaLibCall(tokens): log_detection_("CUDA API call") cudaApi, args = tokens if not type(current_node) in [STCudaLibCall,STCudaKernelCall]: - new = STCudaLibCall(current_node,current_linemap,current_statement_no) + new = STCudaLibCall(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled new.cudaApi = cudaApi #print("finishes_on_first_line={}".format(finishes_on_first_line)) - assert type(new._parent) in [STModule,STProcedure,STProgram], type(new._parent) + assert type(new.parent) in [STModule,STProcedure,STProgram], type(new.parent) append_if_not_recording_(new) def CudaKernelCall(tokens): nonlocal translation_enabled @@ -319,7 +322,7 @@ def CudaKernelCall(tokens): log_detection_("CUDA kernel call") kernel_name, kernel_launch_args, args = tokens assert type(current_node) in [STModule,STProcedure,STProgram], "type is: "+str(type(current_node)) - new = STCudaKernelCall(current_node,current_linemap,current_statement_no) + new = STCudaKernelCall(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def AccDirective(): @@ -331,19 +334,18 @@ def AccDirective(): nonlocal do_loop_ctr nonlocal directive_no log_detection_("OpenACC directive") - new = STAccDirective(current_node,current_linemap,current_statement_no,directive_no) + new = STAccDirective(current_linemap,current_statement_no,directive_no) new.ignore_in_s2s_translation = not translation_enabled directive_no += 1 # if end directive ascend - if new.is_end_directive() and\ - type(current_node) is STAccDirective and current_node.is_kernels_directive(): - ascend_() - current_node.append(new) + if new.is_end_directive() and type(current_node) is STAccDirective and\ + current_node.is_kernels_directive(): + ascend_() # descend in constructs or new node elif new.is_parallel_loop_directive() or new.is_kernels_loop_directive() or\ (not new.is_end_directive() and new.is_parallel_directive()): - new = STAccLoopKernel(current_node,current_linemap,current_statement_no,directive_no) - new.kind = "acc-compute-construct" + new = STAccLoopKernel(current_linemap,current_statement_no,directive_no) + new.kind = "acc-compute-construct" new.ignore_in_s2s_translation = not translation_enabled new._do_loop_ctr_memorised=do_loop_ctr descend_(new) # descend also appends @@ -363,7 +365,7 @@ def CufLoopKernel(): nonlocal keep_recording nonlocal directive_no log_detection_("CUDA Fortran loop kernel directive") - new = STCufLoopKernel(current_node,current_linemap,current_statement_no,directive_no) + new = STCufLoopKernel(current_linemap,current_statement_no,directive_no) new.kind = "cuf-kernel-do" new.ignore_in_s2s_translation = not translation_enabled new._do_loop_ctr_memorised=do_loop_ctr @@ -378,19 +380,19 @@ def Assignment(tokens): nonlocal current_statement log_detection_("assignment") if in_kernels_acc_region_and_not_recording(): - parse_result = translator.assignment_begin.parseString(current_statement) + parse_result = translator.assignment_begin.parseString(current_statement["body"]) lvalue = translator.find_first(parse_result,translator.TTLValue) if not lvalue is None and lvalue.has_matrix_range_args(): - new = STAccLoopKernel(current_node,current_linemap,current_statement_no) + new = STAccLoopKernel(current_linemap,current_statement_no) new.ignore_in_s2s_translation = not translation_enabled append_if_not_recording_(new) def GpufortControl(): nonlocal current_statement nonlocal translation_enabled log_detection_("gpufortran control statement") - if "on" in current_statement: + if "on" in current_statement["body"]: translation_enabled = True - elif "off" in current_statement: + elif "off" in current_statement["body"]: translation_enabled = False # TODO completely remove / comment out !$acc end kernels @@ -424,7 +426,7 @@ def GpufortControl(): gpufort_control.setParseAction(GpufortControl) current_file = str(fortran_filepath) - current_node._children.clear() + current_node.children.clear() def scan_string(expression_name,expression): """ @@ -434,7 +436,7 @@ def scan_string(expression_name,expression): nonlocal current_statement_no nonlocal current_statement - matched = len(expression.searchString(current_statement,1)) + matched = len(expression.searchString(current_statement["body"],1)) if matched: utils.logging.log_debug3(LOG_PREFIX,"parse_file.scanString","found expression '{}' in line {}: '{}'".format(expression_name,current_linemap["lineno"],current_linemap["lines"][0].rstrip())) else: @@ -473,10 +475,10 @@ def is_end_statement_(tokens,kind): condition2 = len(current_linemap["included_linemaps"]) or not current_linemap["is_preprocessor_directive"] if condition1 and condition2: for current_statement_no,current_statement in enumerate(current_linemap["statements"]): - utils.logging.log_debug4(LOG_PREFIX,"parse_file","parsing statement '{}' associated with lines [{},{}]".format(current_statement.rstrip(),\ + utils.logging.log_debug4(LOG_PREFIX,"parse_file","parsing statement '{}' associated with lines [{},{}]".format(current_statement["body"].rstrip(),\ current_linemap["lineno"],current_linemap["lineno"]+len(current_linemap["lines"])-1)) - current_tokens = utils.parsingutils.tokenize(current_statement.lower(),padded_size=6) + current_tokens = utils.parsingutils.tokenize(current_statement["body"].lower(),padded_size=6) current_statement_stripped = " ".join(current_tokens) current_statement_stripped_no_comments = current_statement_stripped.split("!")[0] if len(current_tokens): @@ -566,7 +568,7 @@ def is_accelerated(child): if "hip" in DESTINATION_DIALECT or\ kernel.min_lineno() in kernels_to_convert_to_hip or\ kernel.kernel_name() in kernels_to_convert_to_hip: - stnode = kernel._parent.find_first(filter=lambda child: type(child) in [STUseStatement,STDeclaration,STPlaceHolder]) + stnode = kernel.parent.find_first(filter=lambda child: type(child) in [STUseStatement,STDeclaration,STPlaceHolder]) assert not stnode is None indent = stnode.first_line_indent() stnode.add_to_prolog("{}use {}{}\n".format(indent,module_name,hip_module_suffix)) diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index 63538183..619234f6 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -19,20 +19,22 @@ def flatten_list(items): # scanner tree class STNode: - def __init__(self,parent,first_linemap,first_statement_index=0): - self.name = None - self.kind = None - self._linemaps = [] + def __init__(self,first_linemap,first_statement_index=0): + self.name = None + self.kind = None + self._linemaps = [] if first_linemap != None: self._linemaps.append(first_linemap) - self._first_statement_index = first_statement_index - self._last_statement_index = first_statement_index # inclusive - self._children = [] - self._parent = parent + self._first_statement_index = first_statement_index + self._last_statement_index = first_statement_index # inclusive + self._prolog = [] + self._epilog = [] + # metadata + self.parent = None + self.children = [] self.ignore_in_s2s_translation = False def __get_linemap_content(self,key,first_linemap_first_elem=0,last_linemap_last_elem=-1): - """Collects entries for the given key from all linemaps associated - with this node.""" + """Collects entries for the given key from the node's linemaps.""" result = [] for i,linemap in enumerate(self._linemaps): if len(self._linemaps)==1: @@ -82,10 +84,16 @@ class STNode: :param bool include_none_entries: Also include entries that are None [default=False]. :note: None entries might have been introduced by other nodes transforming the same linemap(s). """ - result = self.__get_linemap_content("statements",\ + statements_of_node = self.__get_linemap_content("statements",\ self._first_statement_index,self._last_statement_index) - if not include_none_entries: - return [stmt.rstrip("\n\t ;") for stmt in result if stmt != None] + result = [] + if len(statements_of_node): + for stmt in statements_of_node: + if stmt["body"] != None: + result.append(stmt["body"].rstrip("\n\t ;")) + elif include_none_entries: + result.append(None) + return result def min_lineno(self): """ :return: Inclusive first line number belonging to this object. @@ -111,9 +119,9 @@ class STNode: """ :return: First line in first linemap. """ - return self._linemaps[0]["statements"][0] + return self._linemaps[0]["statements"][0]["body"] def append(self,child): - self._children.append(child) + self.children.append(child) def list_of_parents(self): """ Returns a list that contains all @@ -123,7 +131,7 @@ class STNode: def recursive_parent_lookup(curr): if curr != None: result.append(curr) - recursive_parent_lookup(curr._parent) + recursive_parent_lookup(curr.parent) recursive_parent_lookup(self) return result @@ -131,7 +139,7 @@ class STNode: result = [] def descend_(curr): nonlocal result - for child in curr._children: + for child in curr.children: if filter(child): result.append(child) if recursively: @@ -139,12 +147,12 @@ class STNode: descend_(self) return result def find_first(self,filter=lambda child: True): - for child in self._children: + for child in self.children: if filter(child): return child return None def find_last(self,filter=lambda child: True): - for child in reversed(self._children): + for child in reversed(self.children): if filter(child): return child return None @@ -168,18 +176,32 @@ class STNode: return result def add_to_prolog(self,line,prepend=False): """Add some prolog lines to the first linemap.""" - if not line in self._linemaps[0]["prolog"]: + line_preproc = line.rstrip() + prolog = self._linemaps[0]["statements"][self._first_statement_index]["prolog"] + if self._first_statement_index == 0: + prolog = self._linemaps[0]["prolog"] + else: + self._linemaps[0]["modified"] = True + if not line_preproc.lower() in map(str.lower, prolog): if prepend: - self._linemaps[0]["prolog"].insert(0,line) + prolog.insert(0,line_preproc) else: - self._linemaps[0]["prolog"].append(line) + prolog.append(line_preproc) def add_to_epilog(self,line,prepend=False): """Add some epilog lines to the first linemap.""" - if not line in self._linemaps[-1]["epilog"]: + line_preproc = line.rstrip() + epilog = self._linemaps[-1]["statements"][self._last_statement_index]["epilog"] + have_last_in_last_linemap = self._last_statement_index == -1 or\ + self._last_statement_index == len(self._linemaps[-1]["statements"])-1 + if have_last_in_last_linemap: + epilog = self._linemaps[0]["epilog"] + else: + self._linemaps[0]["modified"] = True + if not line_preproc.lower() in map(str.lower, epilog): if prepend: - self._linemaps[-1]["epilog"].insert(0,line) + epilog.insert(0,line_preproc) else: - self._linemaps[-1]["epilog"].append(line) + epilog.append(line_preproc) def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): """Transforms statements associated with underlying linemaps (hook) :param line: An excerpt from a Fortran file, possibly multiple lines @@ -207,8 +229,8 @@ class STNode: first_linemap_first_elem = self._first_statement_index last_linemap_last_elem = self._last_statement_index # write subst into first linemap first statement - self._linemaps[0]["modified"] = True - self._linemaps[0]["statements"][first_linemap_first_elem] = substitution + self._linemaps[0]["modified"] = True + self._linemaps[0]["statements"][first_linemap_first_elem]["body"] = substitution assert len(self._linemaps), "self._linemaps should not be empty" last_linemap_ubound = last_linemap_last_elem if last_linemap_ubound != -1: @@ -217,7 +239,7 @@ class STNode: if ubound == -1: ubound = len(statements) for i in range(lbound,ubound): - statements[i] = None + statements[i]["body"] = None if len(self._linemaps) == 1: assign_none_(self._linemaps[0]["statements"],first_linemap_first_elem+1,last_linemap_ubound) else: @@ -230,28 +252,31 @@ class STNode: def transform_statements(self,index=[]): """ Replaces original statements by generated code. Modifies the 'statements' - entries of the associated linemaps. - :param list index: TBA + epilog and prolog entries of the associated linemaps. + :param list index: Index dictionary containing indexer modules/programs/top-level procedures + as entries. :note: When multiple linemaps contain the expression associated with this note, the transformed code is written into the first associated statement in the first linemap and the remaining associated statements in the first and all other linemaps are replaced by None. - :note: When prepending a preamble, it is assumed that the modified statement is the - first in the linemap/line and that this statement is only modified once. - :note: When appending an epilog, it is assumed that the modified statement is the - last in the linemap/line and that this statement is only modified once. + :note: If the node's first statement in a linemap, the node's prolog + lines are appended to the linemaps prolog field. Analogously, + the epilog is appended to the linemaps epilog field if + the node's last statement is the last statement in + the last line map. Otherwise, epilog / prolog are appended/prepended + directly to the statement. """ if not self.ignore_in_s2s_translation: - have_first_in_first_linemap = self._first_statement_index == 0 - have_last_in_last_linemap = self._last_statement_index == -1 or\ - self._last_statement_index == len(self._linemaps[-1]["statements"])-1 - statements_fully_cover_lines = have_first_in_first_linemap and have_last_in_last_linemap - - joined_lines = "".join(self.lines()) - joined_statements = "\n".join(self.statements()) - transformed_code, modified = self.transform(joined_lines,joined_statements,statements_fully_cover_lines,index) - if modified: - self._modify_linemaps(transformed_code) + have_first_in_first_linemap = self._first_statement_index == 0 + have_last_in_last_linemap = self._last_statement_index == -1 or\ + self._last_statement_index == len(self._linemaps[-1]["statements"])-1 + statements_fully_cover_lines = have_first_in_first_linemap and have_last_in_last_linemap + joined_statements = "\n".join(self.statements()) + joined_lines = "".join(self.lines()) + transformed_code, transformed = \ + self.transform(joined_lines,joined_statements,statements_fully_cover_lines,index) + if transformed: + self._modify_linemaps(transformed_code) def decl_list_entry_filter(stnode): """:return: If the scanner tree node is member of the declaration list.""" @@ -281,7 +306,13 @@ class STContainerBase(STNode): if last_decl_list_node is None: last_decl_list_node = self for line in lines: - last_decl_list_node.add_to_epilog(indent+line,prepend) + last_decl_list_node.add_to_epilog("".join([indent,line]),prepend) + def append_vars_to_decl_list(self,varnames,vartype="type(c_ptr)"): + """Create and add declaration expression from `varnames` and `vartype` to declaration list + if they are not part of the declartion list yet.""" + if len(varnames): + self.append_to_decl_list(\ + [" :: ".join([vartype,name]) for name in varnames],prepend=True) def prepend_to_return_or_end_statements(self,lines): """ Prepend lines to the last statement in the declaration list. @@ -299,8 +330,8 @@ class STContainerBase(STNode): nonlocal result if type(curr) != STRoot: result = curr.name.lower() + ":" + result - recursive_parent_lookup(curr._parent) - recursive_parent_lookup(self._parent) + recursive_parent_lookup(curr.parent) + recursive_parent_lookup(self.parent) return result def local_and_dummy_variable_names(self,index): """:return: names of local variables (1st retval) and dummy variables (2nd retval).""" @@ -311,7 +342,7 @@ class STContainerBase(STNode): irecord = next((ientry for ientry in index if ientry["name"]==self.name),None) dummy_arg_names = [] else: - parent_tag = self._parent.tag() + parent_tag = self.parent.tag() irecord, _ = scoper.search_index_for_subprogram(index,parent_tag,self.name) dummy_arg_names = irecord["dummy_args"] local_var_names = [ivar["name"] for ivar in irecord["variables"] if ivar["name"] not in dummy_arg_names] @@ -331,25 +362,25 @@ class STEndOrReturn(STNode): class STRoot(STContainerBase): def __init__(self): - STNode.__init__(self,None,None,-1) + STNode.__init__(self,None,-1) def tag(self): return None class STModule(STContainerBase): - def __init__(self,name,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,name,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) self.name = name.lower() self.kind = "module" class STProgram(STContainerBase): - def __init__(self,name,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,name,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) self.name = name.lower() self.kind = "program" class STUseStatement(STNode): - def __init__(self,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO clean indent = self.first_line_indent() @@ -366,18 +397,18 @@ class STUseStatement(STNode): return snippet, use_cuda class STPlaceHolder(STNode): - def __init__(self,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) self.name = None class STProcedure(STContainerBase): - def __init__(self,name,kind,parent,first_linemap,first_linemap_first_statement,index): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,name,parent_tag,kind,first_linemap,first_linemap_first_statement,index): + STNode.__init__(self,first_linemap,first_linemap_first_statement) self.name = name self.kind = kind self.code = [] # check attributes - self.index_record, _ = scoper.search_index_for_subprogram(index,self._parent.tag(),name) + self.index_record, _ = scoper.search_index_for_subprogram(index,parent_tag,name) self.c_result_type = "void" self.parse_result = None def __must_be_available_on_host(self): @@ -443,20 +474,14 @@ class STProcedure(STContainerBase): return original, False class STDirective(STNode): - def __init__(self,parent,first_linemap,first_linemap_first_statement,directive_no,sentinel="!$cuf"): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) - self._sentinel = sentinel + def __init__(self,first_linemap,first_linemap_first_statement,directive_no,sentinel="!$cuf"): + STNode.__init__(self,first_linemap,first_linemap_first_statement) + self._sentinel = sentinel self._directive_no = directive_no - self._first_directive = self._linemaps[0]["statements"][0] - def single_line_statement(self): - """ - Express the statement as lower case single-line statement - """ - return self._first_directive class STLoopKernel(STNode): - def __init__(self,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) self.grid_f_str = None self.block_f_str = None self.sharedmem_f_str = "0" # set from extraction routine @@ -474,12 +499,12 @@ class STLoopKernel(STNode): return hashlib.md5(snippet.encode()).hexdigest()[0:6] def complete_init(self,index=[]): self.code = self.statements() - parent_tag = self._parent.tag() + parent_tag = self.parent.tag() scope = scoper.create_scope(index,parent_tag) self.parse_result = translator.parse_loop_kernel(self.code,scope) def kernel_name(self): """Derive a name for the kernel""" - return LOOP_KERNEL_NAME_TEMPLATE.format(parent=self._parent.name.lower(),lineno=self.min_lineno(),hash=self.__hash()) + return LOOP_KERNEL_NAME_TEMPLATE.format(parent=self.parent.name.lower(),lineno=self.min_lineno(),hash=self.__hash()) def kernel_launcher_name(self): return "launch_{}".format(self.kernel_name()) def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): @@ -506,8 +531,8 @@ class STDeclaration(STNode): Complex(DP), allocatable, device :: dev_array(:,:) ``` """ - def __init__(self,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) self._ttdeclaration = translator.parse_declaration(self.first_statement()) self._vars = [name.lower() for name in self._ttdeclaration.variable_names()] def create_codegen_context(self): @@ -536,14 +561,14 @@ class STDeclaration(STNode): indent = self.first_line_indent() # argument names if declared in procedure - if isinstance(self._parent, STProcedure): - argnames = list(self._parent.index_record["dummy_args"]) + if isinstance(self.parent, STProcedure): + argnames = list(self.parent.index_record["dummy_args"]) else: argnames = [] result = "" for var_name in self._vars: ivar,discovered = scoper.search_index_for_variable(\ - index,self._parent.tag(),\ + index,self.parent.tag(),\ var_name) rank = ivar["rank"] has_device = "device" in ivar["qualifiers"] @@ -581,8 +606,8 @@ class STAttributes(STNode): CUDA Fortran specific intrinsic that needs to be removed/commented out in any case. """ - def __init__(self,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO return "", True @@ -599,15 +624,15 @@ def pinned_or_on_device(ivar): return None, False class STNonZeroCheck(STNode): - def __init__(self,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO result = snippet transformed = False for tokens,start,end in translator.non_zero_check.scanString(result): parse_result = tokens[0] lhs_name = parse_result.lhs_f_str() - ivar,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ + ivar,_ = scoper.search_index_for_variable(index,self.parent.tag(),\ lhs_name) on_device = index_variable_is_on_device(ivar) transformed |= on_device @@ -617,12 +642,12 @@ class STNonZeroCheck(STNode): return result, transformed class STAllocated(STNode): - def __init__(self,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO def repl(parse_result): var_name = parse_result.var_name() - ivar,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ + ivar,_ = scoper.search_index_for_variable(index,self.parent.tag(),\ var_name) on_device = index_variable_is_on_device(ivar) return (parse_result.f_str(), on_device) # TODO backend specific @@ -631,8 +656,8 @@ class STAllocated(STNode): return result, transformed class STAllocate(STNode): - def __init__(self,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) self.parse_result = translator.allocate.parseString(self.statements()[0])[0] self.variable_names = self.parse_result.variable_names() def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO @@ -642,8 +667,8 @@ class STAllocate(STNode): return result2, (transformed1 or transformed2) class STDeallocate(STNode): - def __init__(self,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) self.parse_result = translator.deallocate.parseString(self.statements()[0])[0] self.variable_names = self.parse_result.variable_names() def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO @@ -657,16 +682,16 @@ class STDeallocate(STNode): class STMemcpy(STNode): - def __init__(self,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) - self._parse_result = translator.memcpy.parseString(self.statements()[0]) + def __init__(self,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) + self._parse_result = translator.memcpy.parseString(self.statements()[0])[0] def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): # TODO def repl_memcpy_(parse_result): dest_name = parse_result.dest_name_f_str() src_name = parse_result.src_name_f_str() - dest_indexed_var,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ + dest_indexed_var,_ = scoper.search_index_for_variable(index,self.parent.tag(),\ dest_name) - src_indexed_var,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ + src_indexed_var,_ = scoper.search_index_for_variable(index,self.parent.tag(),\ src_name) dest_on_device = index_variable_is_on_device(dest_indexed_var) src_on_device = index_variable_is_on_device(src_indexed_var) @@ -680,8 +705,8 @@ class STMemcpy(STNode): #return utils.pyparsingutils.replace_all(joined_statements,translator.memcpy,repl_memcpy) class STCudaLibCall(STNode): - def __init__(self,parent,first_linemap,first_linemap_first_statement): - STNode.__init__(self,parent,first_linemap,first_linemap_first_statement) + def __init__(self,first_linemap,first_linemap_first_statement): + STNode.__init__(self,first_linemap,first_linemap_first_statement) self._cuda_api = "" self._has_cublas = False def has_cublas(self): @@ -701,9 +726,9 @@ class STCudaLibCall(STNode): def repl_memcpy(parse_result): dest_name = parse_result.dest_name_f_str() src_name = parse_result.src_name_f_str() - dest_indexed_var,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ + dest_indexed_var,_ = scoper.search_index_for_variable(index,self.parent.tag(),\ dest_name) - src_indexed_var ,_ = scoper.search_index_for_variable(index,self._parent.tag(),\ + src_indexed_var ,_ = scoper.search_index_for_variable(index,self.parent.tag(),\ src_name) dest_on_device = index_variable_is_on_device(dest_indexed_var) src_on_device = index_variable_is_on_device(src_indexed_var) @@ -728,8 +753,7 @@ class STCudaLibCall(STNode): return snippet, transformed class STCudaKernelCall(STNode): - """TODO(gpufort): Fix - Translates a CUDA kernel call to a call to a subroutine interface. + """Convers CUDA kernel calls to calls to subroutine interfaces. """ def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): snippet = joined_statements @@ -741,7 +765,7 @@ class STCudaKernelCall(STNode): max_rank = 0 for rvalue in translator.find_all(ttexpr,translator.TTRValue): # TODO lookup the subprogram first - ivar, discovered = scoper.search_index_for_variable(index,self._parent.tag(),\ + ivar, discovered = scoper.search_index_for_variable(index,self.parent.tag(),\ rvalue.name()) if discovered: max_rank = max(max_rank,ivar["rank"]) diff --git a/python/test/linemapper/test.linemapper.linemapper.py b/python/test/linemapper/test.linemapper.linemapper.py index 7662a07f..d20ffd0c 100644 --- a/python/test/linemapper/test.linemapper.linemapper.py +++ b/python/test/linemapper/test.linemapper.linemapper.py @@ -38,7 +38,7 @@ def test_0_donothing(self): pass def test_1_full_test(self): options = "-DCUDA -DCUDA2" - linemaps = linemapper.read_file("test1.f90",options) + linemaps = linemapper.read_file("test1.f90",options) result_lines = linemapper.render_file(linemaps,stage="lines") result_raw_statements = linemapper.render_file(linemaps,stage="raw_statements") result_statements = linemapper.render_file(linemaps,stage="statements") @@ -91,4 +91,4 @@ def clean_(text): self.assertEqual(clean_(result_statements),clean_(testdata_statements)) if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() From ab358388d7d9e26db4100b6fee4fa66667274c7b Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 28 Oct 2021 07:45:43 -0400 Subject: [PATCH 21/67] examples/openacc/vector-add-declare: Rename example --- examples/openacc/vector-add-declare/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/openacc/vector-add-declare/Makefile b/examples/openacc/vector-add-declare/Makefile index 8d738247..8bf86219 100644 --- a/examples/openacc/vector-add-declare/Makefile +++ b/examples/openacc/vector-add-declare/Makefile @@ -1,6 +1,6 @@ include ../rules.mk -TEST_SRC = vector-add.f90 vector-add-procedures.f90 vector-add-globals.f90 +TEST_SRC = vector-add.f90 vector-add-procedures.f90 vector-add-module-vars.f90 TEST_NAME = $(TEST_SRC:.f90=) TEST_CONV_SRC = $(TEST_SRC:.f90=.f90-gpufort.f08) @@ -13,4 +13,4 @@ $(TEST_NAME): %: %.f90-gpufort.f08 $(TEST_CONV_SRC): %-gpufort.f08: % gpufort -w $^ -E hip-gpufort-rt clean: - rm -rf *-gpufort.* *-fort2hip.* *.o *.mod gpufort*.h $(TEST_NAME) *.gpufort_mod log/ + rm -rf *-gpufort.* *-fort2hip.* *.o *.mod gpufort*.h $(TEST_NAME) *.gpufort_mod *-linemaps-*.json log/ From c5e528c7eeeae4b0af52dd7309a2f2315ba6c8ff Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 28 Oct 2021 07:46:59 -0400 Subject: [PATCH 22/67] gpufort_acc_runtime: Add opt arg to indicate module variables --- .../codegen/gpufort_acc_runtime.f90 | 2688 +++++++++-------- .../templates/gpufort_acc_runtime.template.f | 50 +- .../src/gpufort_acc_runtime.f90 | 2688 +++++++++-------- .../src/gpufort_acc_runtime_base.f90 | 14 +- 4 files changed, 3058 insertions(+), 2382 deletions(-) diff --git a/runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 b/runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 index 62e7405f..eed4885d 100644 --- a/runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 +++ b/runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 @@ -178,5833 +178,6169 @@ module gpufort_acc_runtime ! - function gpufort_acc_present_l_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_0(hostptr) result(deviceptr) + function gpufort_acc_create_l_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),1_8) end function - function gpufort_acc_no_create_l_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_0(hostptr,finalize) + subroutine gpufort_acc_delete_l_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),1_8,async,module_var) end function - function gpufort_acc_copyout_l_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),1_8,async,module_var) end function - function gpufort_acc_copy_l_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),1_8,async) end function - subroutine gpufort_acc_update_host_l_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_1(hostptr) result(deviceptr) + function gpufort_acc_create_l_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_1(hostptr,finalize) + subroutine gpufort_acc_delete_l_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_2(hostptr) result(deviceptr) + function gpufort_acc_create_l_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_2(hostptr,finalize) + subroutine gpufort_acc_delete_l_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_3(hostptr) result(deviceptr) + function gpufort_acc_create_l_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_3(hostptr,finalize) + subroutine gpufort_acc_delete_l_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_4(hostptr) result(deviceptr) + function gpufort_acc_create_l_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_4(hostptr,finalize) + subroutine gpufort_acc_delete_l_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_5(hostptr) result(deviceptr) + function gpufort_acc_create_l_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_5(hostptr,finalize) + subroutine gpufort_acc_delete_l_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_6(hostptr) result(deviceptr) + function gpufort_acc_create_l_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_6(hostptr,finalize) + subroutine gpufort_acc_delete_l_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_7(hostptr) result(deviceptr) + function gpufort_acc_create_l_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_7(hostptr,finalize) + subroutine gpufort_acc_delete_l_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_0(hostptr) result(deviceptr) + function gpufort_acc_create_i4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),4_8) end function - function gpufort_acc_no_create_i4_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_0(hostptr,finalize) + subroutine gpufort_acc_delete_i4_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async,module_var) end function - function gpufort_acc_copyout_i4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async,module_var) end function - function gpufort_acc_copy_i4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),4_8,async) end function - subroutine gpufort_acc_update_host_i4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_1(hostptr) result(deviceptr) + function gpufort_acc_create_i4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_1(hostptr,finalize) + subroutine gpufort_acc_delete_i4_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_2(hostptr) result(deviceptr) + function gpufort_acc_create_i4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_2(hostptr,finalize) + subroutine gpufort_acc_delete_i4_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_3(hostptr) result(deviceptr) + function gpufort_acc_create_i4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_3(hostptr,finalize) + subroutine gpufort_acc_delete_i4_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_4(hostptr) result(deviceptr) + function gpufort_acc_create_i4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_4(hostptr,finalize) + subroutine gpufort_acc_delete_i4_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_5(hostptr) result(deviceptr) + function gpufort_acc_create_i4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_5(hostptr,finalize) + subroutine gpufort_acc_delete_i4_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_6(hostptr) result(deviceptr) + function gpufort_acc_create_i4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_6(hostptr,finalize) + subroutine gpufort_acc_delete_i4_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_7(hostptr) result(deviceptr) + function gpufort_acc_create_i4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_7(hostptr,finalize) + subroutine gpufort_acc_delete_i4_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_0(hostptr) result(deviceptr) + function gpufort_acc_create_i8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),8_8) end function - function gpufort_acc_no_create_i8_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_0(hostptr,finalize) + subroutine gpufort_acc_delete_i8_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async,module_var) end function - function gpufort_acc_copyout_i8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async,module_var) end function - function gpufort_acc_copy_i8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),8_8,async) end function - subroutine gpufort_acc_update_host_i8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_1(hostptr) result(deviceptr) + function gpufort_acc_create_i8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_1(hostptr,finalize) + subroutine gpufort_acc_delete_i8_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_2(hostptr) result(deviceptr) + function gpufort_acc_create_i8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_2(hostptr,finalize) + subroutine gpufort_acc_delete_i8_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_3(hostptr) result(deviceptr) + function gpufort_acc_create_i8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_3(hostptr,finalize) + subroutine gpufort_acc_delete_i8_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_4(hostptr) result(deviceptr) + function gpufort_acc_create_i8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_4(hostptr,finalize) + subroutine gpufort_acc_delete_i8_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_5(hostptr) result(deviceptr) + function gpufort_acc_create_i8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_5(hostptr,finalize) + subroutine gpufort_acc_delete_i8_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_6(hostptr) result(deviceptr) + function gpufort_acc_create_i8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_6(hostptr,finalize) + subroutine gpufort_acc_delete_i8_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_7(hostptr) result(deviceptr) + function gpufort_acc_create_i8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_7(hostptr,finalize) + subroutine gpufort_acc_delete_i8_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_0(hostptr) result(deviceptr) + function gpufort_acc_create_r4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),4_8) end function - function gpufort_acc_no_create_r4_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_0(hostptr,finalize) + subroutine gpufort_acc_delete_r4_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async,module_var) end function - function gpufort_acc_copyout_r4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async,module_var) end function - function gpufort_acc_copy_r4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),4_8,async) end function - subroutine gpufort_acc_update_host_r4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_1(hostptr) result(deviceptr) + function gpufort_acc_create_r4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_1(hostptr,finalize) + subroutine gpufort_acc_delete_r4_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_2(hostptr) result(deviceptr) + function gpufort_acc_create_r4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_2(hostptr,finalize) + subroutine gpufort_acc_delete_r4_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_3(hostptr) result(deviceptr) + function gpufort_acc_create_r4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_3(hostptr,finalize) + subroutine gpufort_acc_delete_r4_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_4(hostptr) result(deviceptr) + function gpufort_acc_create_r4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_4(hostptr,finalize) + subroutine gpufort_acc_delete_r4_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_5(hostptr) result(deviceptr) + function gpufort_acc_create_r4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_5(hostptr,finalize) + subroutine gpufort_acc_delete_r4_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_6(hostptr) result(deviceptr) + function gpufort_acc_create_r4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_6(hostptr,finalize) + subroutine gpufort_acc_delete_r4_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_7(hostptr) result(deviceptr) + function gpufort_acc_create_r4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_7(hostptr,finalize) + subroutine gpufort_acc_delete_r4_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_0(hostptr) result(deviceptr) + function gpufort_acc_create_r8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),8_8) end function - function gpufort_acc_no_create_r8_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_0(hostptr,finalize) + subroutine gpufort_acc_delete_r8_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async,module_var) end function - function gpufort_acc_copyout_r8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async,module_var) end function - function gpufort_acc_copy_r8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),8_8,async) end function - subroutine gpufort_acc_update_host_r8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_1(hostptr) result(deviceptr) + function gpufort_acc_create_r8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_1(hostptr,finalize) + subroutine gpufort_acc_delete_r8_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_2(hostptr) result(deviceptr) + function gpufort_acc_create_r8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_2(hostptr,finalize) + subroutine gpufort_acc_delete_r8_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_3(hostptr) result(deviceptr) + function gpufort_acc_create_r8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_3(hostptr,finalize) + subroutine gpufort_acc_delete_r8_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_4(hostptr) result(deviceptr) + function gpufort_acc_create_r8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_4(hostptr,finalize) + subroutine gpufort_acc_delete_r8_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_5(hostptr) result(deviceptr) + function gpufort_acc_create_r8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_5(hostptr,finalize) + subroutine gpufort_acc_delete_r8_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_6(hostptr) result(deviceptr) + function gpufort_acc_create_r8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_6(hostptr,finalize) + subroutine gpufort_acc_delete_r8_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_7(hostptr) result(deviceptr) + function gpufort_acc_create_r8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_7(hostptr,finalize) + subroutine gpufort_acc_delete_r8_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_0(hostptr) result(deviceptr) + function gpufort_acc_create_c4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),2*4_8) end function - function gpufort_acc_no_create_c4_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_0(hostptr,finalize) + subroutine gpufort_acc_delete_c4_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_1(hostptr) result(deviceptr) + function gpufort_acc_create_c4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_1(hostptr,finalize) + subroutine gpufort_acc_delete_c4_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_2(hostptr) result(deviceptr) + function gpufort_acc_create_c4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_2(hostptr,finalize) + subroutine gpufort_acc_delete_c4_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_3(hostptr) result(deviceptr) + function gpufort_acc_create_c4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_3(hostptr,finalize) + subroutine gpufort_acc_delete_c4_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_4(hostptr) result(deviceptr) + function gpufort_acc_create_c4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_4(hostptr,finalize) + subroutine gpufort_acc_delete_c4_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_5(hostptr) result(deviceptr) + function gpufort_acc_create_c4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_5(hostptr,finalize) + subroutine gpufort_acc_delete_c4_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_6(hostptr) result(deviceptr) + function gpufort_acc_create_c4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_6(hostptr,finalize) + subroutine gpufort_acc_delete_c4_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_7(hostptr) result(deviceptr) + function gpufort_acc_create_c4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_7(hostptr,finalize) + subroutine gpufort_acc_delete_c4_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_0(hostptr) result(deviceptr) + function gpufort_acc_create_c8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),2*8_8) end function - function gpufort_acc_no_create_c8_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_0(hostptr,finalize) + subroutine gpufort_acc_delete_c8_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_1(hostptr) result(deviceptr) + function gpufort_acc_create_c8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_1(hostptr,finalize) + subroutine gpufort_acc_delete_c8_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_2(hostptr) result(deviceptr) + function gpufort_acc_create_c8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_2(hostptr,finalize) + subroutine gpufort_acc_delete_c8_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_3(hostptr) result(deviceptr) + function gpufort_acc_create_c8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_3(hostptr,finalize) + subroutine gpufort_acc_delete_c8_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_4(hostptr) result(deviceptr) + function gpufort_acc_create_c8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_4(hostptr,finalize) + subroutine gpufort_acc_delete_c8_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_5(hostptr) result(deviceptr) + function gpufort_acc_create_c8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_5(hostptr,finalize) + subroutine gpufort_acc_delete_c8_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_6(hostptr) result(deviceptr) + function gpufort_acc_create_c8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_6(hostptr,finalize) + subroutine gpufort_acc_delete_c8_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_7(hostptr) result(deviceptr) + function gpufort_acc_create_c8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_7(hostptr,finalize) + subroutine gpufort_acc_delete_c8_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine diff --git a/runtime/gpufort_acc_runtime/codegen/templates/gpufort_acc_runtime.template.f b/runtime/gpufort_acc_runtime/codegen/templates/gpufort_acc_runtime.template.f index 988e3c0e..e2b30cc4 100644 --- a/runtime/gpufort_acc_runtime/codegen/templates/gpufort_acc_runtime.template.f +++ b/runtime/gpufort_acc_runtime/codegen/templates/gpufort_acc_runtime.template.f @@ -243,110 +243,116 @@ module gpufort_acc_runtime {% set rank = '' %} {% endif %} {% set suffix = tuple[0] + "_" + dims|string %} - function gpufort_acc_present_{{suffix}}(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_{{suffix}}(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none {{tuple[2]}},target{{ rank }},intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_{{suffix}}(hostptr) result(deviceptr) + function gpufort_acc_create_{{suffix}}(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none {{tuple[2]}},target{{ rank }},intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8) end function - function gpufort_acc_no_create_{{suffix}}(hostptr) result(deviceptr) + function gpufort_acc_no_create_{{suffix}}(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none {{tuple[2]}},target{{ rank }},intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_{{suffix}}(hostptr,finalize) + subroutine gpufort_acc_delete_{{suffix}}(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none {{tuple[2]}},target{{ rank }},intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_{{suffix}}(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_{{suffix}}(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none {{tuple[2]}},target{{ rank }},intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,async,module_var) end function - function gpufort_acc_copyout_{{suffix}}(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_{{suffix}}(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none {{tuple[2]}},target{{ rank }},intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,async,module_var) end function - function gpufort_acc_copy_{{suffix}}(hostptr,async) result(deviceptr) + function gpufort_acc_copy_{{suffix}}(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none {{tuple[2]}},target{{ rank }},intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,async) end function - subroutine gpufort_acc_update_host_{{suffix}}(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_{{suffix}}(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none {{tuple[2]}},target{{ rank }},intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_{{suffix}}(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_{{suffix}}(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none {{tuple[2]}},target{{ rank }},intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine {% endfor %} {% endfor %} -end module +end module \ No newline at end of file diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 index 62e7405f..eed4885d 100644 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 @@ -178,5833 +178,6169 @@ module gpufort_acc_runtime ! - function gpufort_acc_present_l_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_0(hostptr) result(deviceptr) + function gpufort_acc_create_l_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),1_8) end function - function gpufort_acc_no_create_l_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_0(hostptr,finalize) + subroutine gpufort_acc_delete_l_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),1_8,async,module_var) end function - function gpufort_acc_copyout_l_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),1_8,async,module_var) end function - function gpufort_acc_copy_l_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),1_8,async) end function - subroutine gpufort_acc_update_host_l_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_1(hostptr) result(deviceptr) + function gpufort_acc_create_l_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_1(hostptr,finalize) + subroutine gpufort_acc_delete_l_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_2(hostptr) result(deviceptr) + function gpufort_acc_create_l_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_2(hostptr,finalize) + subroutine gpufort_acc_delete_l_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_3(hostptr) result(deviceptr) + function gpufort_acc_create_l_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_3(hostptr,finalize) + subroutine gpufort_acc_delete_l_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_4(hostptr) result(deviceptr) + function gpufort_acc_create_l_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_4(hostptr,finalize) + subroutine gpufort_acc_delete_l_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_5(hostptr) result(deviceptr) + function gpufort_acc_create_l_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_5(hostptr,finalize) + subroutine gpufort_acc_delete_l_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_6(hostptr) result(deviceptr) + function gpufort_acc_create_l_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_6(hostptr,finalize) + subroutine gpufort_acc_delete_l_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_l_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_l_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_l_7(hostptr) result(deviceptr) + function gpufort_acc_create_l_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) end function - function gpufort_acc_no_create_l_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_l_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_l_7(hostptr,finalize) + subroutine gpufort_acc_delete_l_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_l_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_l_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copyout_l_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_l_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) end function - function gpufort_acc_copy_l_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_l_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) end function - subroutine gpufort_acc_update_host_l_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_l_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_l_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_l_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_0(hostptr) result(deviceptr) + function gpufort_acc_create_i4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),4_8) end function - function gpufort_acc_no_create_i4_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_0(hostptr,finalize) + subroutine gpufort_acc_delete_i4_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async,module_var) end function - function gpufort_acc_copyout_i4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async,module_var) end function - function gpufort_acc_copy_i4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),4_8,async) end function - subroutine gpufort_acc_update_host_i4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_1(hostptr) result(deviceptr) + function gpufort_acc_create_i4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_1(hostptr,finalize) + subroutine gpufort_acc_delete_i4_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_2(hostptr) result(deviceptr) + function gpufort_acc_create_i4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_2(hostptr,finalize) + subroutine gpufort_acc_delete_i4_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_3(hostptr) result(deviceptr) + function gpufort_acc_create_i4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_3(hostptr,finalize) + subroutine gpufort_acc_delete_i4_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_4(hostptr) result(deviceptr) + function gpufort_acc_create_i4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_4(hostptr,finalize) + subroutine gpufort_acc_delete_i4_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_5(hostptr) result(deviceptr) + function gpufort_acc_create_i4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_5(hostptr,finalize) + subroutine gpufort_acc_delete_i4_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_6(hostptr) result(deviceptr) + function gpufort_acc_create_i4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_6(hostptr,finalize) + subroutine gpufort_acc_delete_i4_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i4_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i4_7(hostptr) result(deviceptr) + function gpufort_acc_create_i4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_i4_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_i4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i4_7(hostptr,finalize) + subroutine gpufort_acc_delete_i4_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_i4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_i4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_i4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_0(hostptr) result(deviceptr) + function gpufort_acc_create_i8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),8_8) end function - function gpufort_acc_no_create_i8_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_0(hostptr,finalize) + subroutine gpufort_acc_delete_i8_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async,module_var) end function - function gpufort_acc_copyout_i8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async,module_var) end function - function gpufort_acc_copy_i8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),8_8,async) end function - subroutine gpufort_acc_update_host_i8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_1(hostptr) result(deviceptr) + function gpufort_acc_create_i8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_1(hostptr,finalize) + subroutine gpufort_acc_delete_i8_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_2(hostptr) result(deviceptr) + function gpufort_acc_create_i8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_2(hostptr,finalize) + subroutine gpufort_acc_delete_i8_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_3(hostptr) result(deviceptr) + function gpufort_acc_create_i8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_3(hostptr,finalize) + subroutine gpufort_acc_delete_i8_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_4(hostptr) result(deviceptr) + function gpufort_acc_create_i8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_4(hostptr,finalize) + subroutine gpufort_acc_delete_i8_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_5(hostptr) result(deviceptr) + function gpufort_acc_create_i8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_5(hostptr,finalize) + subroutine gpufort_acc_delete_i8_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_6(hostptr) result(deviceptr) + function gpufort_acc_create_i8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_6(hostptr,finalize) + subroutine gpufort_acc_delete_i8_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_i8_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_i8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_i8_7(hostptr) result(deviceptr) + function gpufort_acc_create_i8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_i8_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_i8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_i8_7(hostptr,finalize) + subroutine gpufort_acc_delete_i8_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_i8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_i8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_i8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_i8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_i8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_i8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_i8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_i8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_i8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_i8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_0(hostptr) result(deviceptr) + function gpufort_acc_create_r4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),4_8) end function - function gpufort_acc_no_create_r4_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_0(hostptr,finalize) + subroutine gpufort_acc_delete_r4_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async,module_var) end function - function gpufort_acc_copyout_r4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async,module_var) end function - function gpufort_acc_copy_r4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),4_8,async) end function - subroutine gpufort_acc_update_host_r4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_1(hostptr) result(deviceptr) + function gpufort_acc_create_r4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_1(hostptr,finalize) + subroutine gpufort_acc_delete_r4_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_2(hostptr) result(deviceptr) + function gpufort_acc_create_r4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_2(hostptr,finalize) + subroutine gpufort_acc_delete_r4_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_3(hostptr) result(deviceptr) + function gpufort_acc_create_r4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_3(hostptr,finalize) + subroutine gpufort_acc_delete_r4_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_4(hostptr) result(deviceptr) + function gpufort_acc_create_r4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_4(hostptr,finalize) + subroutine gpufort_acc_delete_r4_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_5(hostptr) result(deviceptr) + function gpufort_acc_create_r4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_5(hostptr,finalize) + subroutine gpufort_acc_delete_r4_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_6(hostptr) result(deviceptr) + function gpufort_acc_create_r4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_6(hostptr,finalize) + subroutine gpufort_acc_delete_r4_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r4_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r4_7(hostptr) result(deviceptr) + function gpufort_acc_create_r4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) end function - function gpufort_acc_no_create_r4_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_r4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r4_7(hostptr,finalize) + subroutine gpufort_acc_delete_r4_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copyout_r4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) end function - function gpufort_acc_copy_r4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) end function - subroutine gpufort_acc_update_host_r4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_0(hostptr) result(deviceptr) + function gpufort_acc_create_r8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),8_8) end function - function gpufort_acc_no_create_r8_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_0(hostptr,finalize) + subroutine gpufort_acc_delete_r8_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async,module_var) end function - function gpufort_acc_copyout_r8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async,module_var) end function - function gpufort_acc_copy_r8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),8_8,async) end function - subroutine gpufort_acc_update_host_r8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_1(hostptr) result(deviceptr) + function gpufort_acc_create_r8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_1(hostptr,finalize) + subroutine gpufort_acc_delete_r8_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_2(hostptr) result(deviceptr) + function gpufort_acc_create_r8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_2(hostptr,finalize) + subroutine gpufort_acc_delete_r8_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_3(hostptr) result(deviceptr) + function gpufort_acc_create_r8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_3(hostptr,finalize) + subroutine gpufort_acc_delete_r8_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_4(hostptr) result(deviceptr) + function gpufort_acc_create_r8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_4(hostptr,finalize) + subroutine gpufort_acc_delete_r8_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_5(hostptr) result(deviceptr) + function gpufort_acc_create_r8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_5(hostptr,finalize) + subroutine gpufort_acc_delete_r8_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_6(hostptr) result(deviceptr) + function gpufort_acc_create_r8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_6(hostptr,finalize) + subroutine gpufort_acc_delete_r8_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_r8_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_r8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_r8_7(hostptr) result(deviceptr) + function gpufort_acc_create_r8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) end function - function gpufort_acc_no_create_r8_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_r8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_r8_7(hostptr,finalize) + subroutine gpufort_acc_delete_r8_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_r8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_r8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copyout_r8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_r8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) end function - function gpufort_acc_copy_r8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_r8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) end function - subroutine gpufort_acc_update_host_r8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_r8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_r8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_r8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_0(hostptr) result(deviceptr) + function gpufort_acc_create_c4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),2*4_8) end function - function gpufort_acc_no_create_c4_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_0(hostptr,finalize) + subroutine gpufort_acc_delete_c4_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_1(hostptr) result(deviceptr) + function gpufort_acc_create_c4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_1(hostptr,finalize) + subroutine gpufort_acc_delete_c4_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_2(hostptr) result(deviceptr) + function gpufort_acc_create_c4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_2(hostptr,finalize) + subroutine gpufort_acc_delete_c4_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_3(hostptr) result(deviceptr) + function gpufort_acc_create_c4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_3(hostptr,finalize) + subroutine gpufort_acc_delete_c4_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_4(hostptr) result(deviceptr) + function gpufort_acc_create_c4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_4(hostptr,finalize) + subroutine gpufort_acc_delete_c4_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_5(hostptr) result(deviceptr) + function gpufort_acc_create_c4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_5(hostptr,finalize) + subroutine gpufort_acc_delete_c4_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_6(hostptr) result(deviceptr) + function gpufort_acc_create_c4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_6(hostptr,finalize) + subroutine gpufort_acc_delete_c4_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c4_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c4_7(hostptr) result(deviceptr) + function gpufort_acc_create_c4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) end function - function gpufort_acc_no_create_c4_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_c4_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c4_7(hostptr,finalize) + subroutine gpufort_acc_delete_c4_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copyout_c4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) end function - function gpufort_acc_copy_c4_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c4_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) end function - subroutine gpufort_acc_update_host_c4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c4_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c4_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_0(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_0(hostptr) result(deviceptr) + function gpufort_acc_create_c8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),2*8_8) end function - function gpufort_acc_no_create_c8_0(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_0(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_0(hostptr,finalize) + subroutine gpufort_acc_delete_c8_0(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_0(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_0(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_0(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_0(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_1(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_1(hostptr) result(deviceptr) + function gpufort_acc_create_c8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_1(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_1(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_1(hostptr,finalize) + subroutine gpufort_acc_delete_c8_1(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_1(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_1(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_1(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_1(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_2(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_2(hostptr) result(deviceptr) + function gpufort_acc_create_c8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_2(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_2(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_2(hostptr,finalize) + subroutine gpufort_acc_delete_c8_2(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_2(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_2(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_2(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_2(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_3(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_3(hostptr) result(deviceptr) + function gpufort_acc_create_c8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_3(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_3(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_3(hostptr,finalize) + subroutine gpufort_acc_delete_c8_3(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_3(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_3(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_3(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_3(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_4(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_4(hostptr) result(deviceptr) + function gpufort_acc_create_c8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_4(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_4(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_4(hostptr,finalize) + subroutine gpufort_acc_delete_c8_4(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_4(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_4(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_4(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_4(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_5(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_5(hostptr) result(deviceptr) + function gpufort_acc_create_c8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_5(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_5(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_5(hostptr,finalize) + subroutine gpufort_acc_delete_c8_5(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_5(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_5(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_5(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_5(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_6(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_6(hostptr) result(deviceptr) + function gpufort_acc_create_c8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_6(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_6(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_6(hostptr,finalize) + subroutine gpufort_acc_delete_c8_6(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_6(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_6(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_6(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_6(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - function gpufort_acc_present_c8_7(hostptr,async,copy,copyin,create) result(deviceptr) + function gpufort_acc_present_c8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async - logical,intent(in),optional :: copy - logical,intent(in),optional :: copyin - logical,intent(in),optional :: create + logical,intent(in),optional :: copy, copyin, create + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) end function - function gpufort_acc_create_c8_7(hostptr) result(deviceptr) + function gpufort_acc_create_c8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_create_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) end function - function gpufort_acc_no_create_c8_7(hostptr) result(deviceptr) + function gpufort_acc_no_create_c8_7(hostptr,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr + logical,intent(in),optional :: module_var + ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) end function - subroutine gpufort_acc_delete_c8_7(hostptr,finalize) + subroutine gpufort_acc_delete_c8_7(hostptr,finalize,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_delete_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize) + call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) end subroutine - function gpufort_acc_copyin_c8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyin_c8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copyout_c8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copyout_c8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async) + deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) end function - function gpufort_acc_copy_c8_7(hostptr,async) result(deviceptr) + function gpufort_acc_copy_c8_7(hostptr,async,module_var) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_copy_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr integer,intent(in),optional :: async + logical,intent(in),optional :: module_var ! type(c_ptr) :: deviceptr ! deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) end function - subroutine gpufort_acc_update_host_c8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_c8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine - subroutine gpufort_acc_update_device_c8_7(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_device_c8_7(hostptr,condition,if_present,async,module_var) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b implicit none complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async) + call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) end subroutine diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 index 21be164f..96377ca6 100644 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 @@ -1,7 +1,5 @@ ! SPDX-License-Identifier: MIT ! Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. -! TODO not thread-safe, make use of OMP_LIB module if this becomes a problem - ! TODO will be slow for large pointer storages ! If this becomes an issue, use faster data structures or bind the public interfaces to ! a faster C runtime @@ -30,8 +28,8 @@ module gpufort_acc_runtime_base ! members ! - integer, save :: LOG_LEVEL = 0 - integer, save :: MAX_QUEUES = 64 + integer, save :: LOG_LEVEL = 0 + integer, save :: MAX_QUEUES = 64 integer, save :: INITIAL_RECORDS_CAPACITY = 4096 ! reuse/fragmentation controls integer, save :: BLOCK_SIZE = 32 @@ -1067,11 +1065,11 @@ function gpufort_acc_no_create_b(hostptr,module_var) result(deviceptr) !> the acc_delete_finalize or acc_delete API routine, respectively, as described in Section 3.2.23. !> !> \note use - subroutine gpufort_acc_delete_b(hostptr,finalize) + subroutine gpufort_acc_delete_b(hostptr,finalize,module_var) use iso_c_binding implicit none type(c_ptr), intent(in) :: hostptr - logical,intent(in),optional :: finalize + logical,intent(in),optional :: finalize, module_var ! logical :: success, opt_finalize integer :: loc @@ -1233,11 +1231,11 @@ function gpufort_acc_copy_b(hostptr,num_bytes,async,module_var) result(deviceptr !> device( list ) !> Copies the data in list from the encountering thread to the !> device. - subroutine gpufort_acc_update_host_b(hostptr,condition,if_present,async) + subroutine gpufort_acc_update_host_b(hostptr,condition,if_present,async,module_var) use iso_c_binding implicit none type(c_ptr),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present + logical,intent(in),optional :: condition, if_present, module_var integer,intent(in),optional :: async ! integer :: loc From 527f587943b1e3d6f0e1036d84faeb71d11191a0 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 28 Oct 2021 08:37:51 -0400 Subject: [PATCH 23/67] scoper/search_*_for_*: Allow to turn error/warning off --- python/indexer/scoper.py | 35 +++++++++++++++++-------------- python/scanner/scanner_tree.py.in | 4 ++-- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/python/indexer/scoper.py b/python/indexer/scoper.py index 08cae584..a0c67078 100644 --- a/python/indexer/scoper.py +++ b/python/indexer/scoper.py @@ -60,7 +60,7 @@ __SCOPE_ENTRY_TYPES = ["subprograms","variables","types"] -def _intrnl_resolve_dependencies(scope,index_record,index): +def _intrnl_resolve_dependencies(scope,index_record,index,error_handling=None): """ Include variable, type, and subprogram records from modules used by the current record (module,program or subprogram). @@ -109,37 +109,39 @@ def handle_use_statements_(scope,imodule): copied_entry = copy.deepcopy(entry) copied_entry["name"] = mapping["renamed"] scope[entry_type].append(copied_entry) - if not used_module_found: + if not used_module_found: msg = "no index record for module '{}' could be found".format(used_module["name"]) if ERROR_HANDLING == "strict": utils.logging.log_error(LOG_PREFIX,"_intrnl_resolve_dependencies",msg) sys.exit(ERR_INDEXER_RESOLVE_DEPENDENCIES_FAILED) - else: + elif ERROR_HANDLING == "warn": utils.logging.log_warning(LOG_PREFIX,"_intrnl_resolve_dependencies",msg) handle_use_statements_(scope,index_record) utils.logging.log_leave_function(LOG_PREFIX,"_intrnl_resolve_dependencies") -def _intrnl_search_scope_for_type_or_subprogram(scope,entry_name,entry_type,empty_record): +def _intrnl_search_scope_for_type_or_subprogram(scope,entry_name,entry_type,empty_record,error_handling=None): """ :param str entry_type: either 'types' or 'subprograms' """ global LOG_PREFIX utils.logging.log_enter_function(LOG_PREFIX,"_intrnl_search_scope_for_type_or_subprogram",\ {"entry_name":entry_name,"entry_type":entry_type}) - + # reverse access such that entries from the inner-most scope come first scope_entities = reversed(scope[entry_type]) entry_name_lower = entry_name.lower() result = next((entry for entry in scope_entities if entry["name"] == entry_name_lower),None) if result is None: + if error_handling == None: + error_handling = ERROR_HANDLING msg = "no entry found for {} '{}'.".format(entry_type[:-1],entry_name) if ERROR_HANDLING == "strict": utils.logging.log_error(LOG_PREFIX,"_intrnl_search_scope_for_type_or_subprogram",msg) sys.exit(ERR_SCOPER_LOOKUP_FAILED) - else: + elif ERROR_HANDLING == "warn": utils.logging.log_warning(LOG_PREFIX,"_intrnl_search_scope_for_type_or_subprogram",msg) return empty_record, False else: @@ -215,7 +217,7 @@ def create_scope(index,tag): global REMOVE_OUTDATED_SCOPES global MODULE_IGNORE_LIST global LOG_PREFIX - utils.logging.log_enter_function(LOG_PREFIX,"create_scope",{"tag":tag,"ERROR_HANDLING":ERROR_HANDLING}) + utils.logging.log_enter_function(LOG_PREFIX,"create_scope",{"tag":tag}) # check if already a scope exists for the tag or if # it can be derived from a higher-level scope @@ -287,11 +289,12 @@ def create_scope(index,tag): utils.logging.log_leave_function(LOG_PREFIX,"create_scope") return new_scope -def search_scope_for_variable(scope,variable_expression,resolve=False): +def search_scope_for_variable(scope,variable_expression,error_handling=None,resolve=False): """ %param str variable_tag% a simple identifier such as 'a' or 'A_d' or a more complicated tag representing a derived-type member, e.g. 'a%b%c' or 'a%b(i,j)%c(a%i5)'. """ global LOG_PREFIX + global ERROR_HANDLING utils.logging.log_enter_function(LOG_PREFIX,"search_scope_for_variable",\ {"variable_expression":variable_expression}) @@ -302,9 +305,7 @@ def search_scope_for_variable(scope,variable_expression,resolve=False): variable_tag = create_index_search_tag_for_variable(variable_expression) list_of_var_names = variable_tag.split("%") def lookup_from_left_to_right_(scope_variables,pos=0): - """ - :note: recursive - """ + """:note: recursive""" nonlocal scope_types nonlocal list_of_var_names @@ -326,11 +327,13 @@ def lookup_from_left_to_right_(scope_variables,pos=0): result = lookup_from_left_to_right_(reversed(scope["variables"])) if result is None: - msg = "no entry found for variable '{}'.".format(variable_tag) - if ERROR_HANDLING == "strict": + if error_handling == None: + error_handling = ERROR_HANDLING + msg = "no entry found for variable '{}'.".format(variable_tag) + if error_handling == "strict": utils.logging.log_error(LOG_PREFIX,"search_scope_for_variable",msg) sys.exit(ERR_SCOPER_LOOKUP_FAILED) - else: + elif error_handling == "warn": utils.logging.log_warning(LOG_PREFIX,"search_scope_for_variable",msg) return EMPTY_VARIABLE, False else: @@ -382,7 +385,7 @@ def search_scope_for_subprogram(scope,subprogram_name): utils.logging.log_leave_function(LOG_PREFIX,"search_scope_for_subprogram") return result -def search_index_for_variable(index,parent_tag,variable_expression,resolve=False): +def search_index_for_variable(index,parent_tag,variable_expression,error_handling=None,resolve=False): """ :param str parent_tag: tag created of colon-separated identifiers, e.g. "mymodule" or "mymodule:mysubroutine". %param str variable_expression% a simple identifier such as 'a' or 'A_d' or a more complicated tag representing a derived-type member, e.g. 'a%b%c'. Note that all array indexing expressions must be stripped away. @@ -392,7 +395,7 @@ def search_index_for_variable(index,parent_tag,variable_expression,resolve=False {"parent_tag":parent_tag,"variable_expression":variable_expression}) scope = create_scope(index,parent_tag) - return search_scope_for_variable(scope,variable_expression,resolve=False) + return search_scope_for_variable(scope,variable_expression,error_handling,resolve) def search_index_for_type(index,parent_tag,type_name): """ diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index 619234f6..8190f15c 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -690,9 +690,9 @@ class STMemcpy(STNode): dest_name = parse_result.dest_name_f_str() src_name = parse_result.src_name_f_str() dest_indexed_var,_ = scoper.search_index_for_variable(index,self.parent.tag(),\ - dest_name) + dest_name,error_handling="off") src_indexed_var,_ = scoper.search_index_for_variable(index,self.parent.tag(),\ - src_name) + src_name,error_handling="off") dest_on_device = index_variable_is_on_device(dest_indexed_var) src_on_device = index_variable_is_on_device(src_indexed_var) bytes_per_element = dest_indexed_var["bytes_per_element"] From daf779c39322c3f33b7c44dc8d627776ee42ec85 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 3 Nov 2021 11:57:43 -0400 Subject: [PATCH 24/67] BUGFIX/gpufort_acc_runtime: gpufort_acc_present_... dummy arg order *Fix mismatching arg lists between wrapper/impl function; put long dummy arg list of gpufort_acc_present_... in macro and reuse macro in wrapper (gpufort_acc_runtime) and implementation (gpufort_acc_runtime_base). minor/unrelated: *rename internal function in gpufort.py (parse_cl_args) --- python/gpufort.py | 4 +- runtime/gpufort_acc_runtime/Makefile | 7 +- .../{codegen/model.py => codegen.py} | 25 +- .../codegen/gpufort_acc_runtime.f90 | 6349 ----------------- .../src/gpufort_acc_runtime.def | 4 + .../src/gpufort_acc_runtime.f90 | 6349 ----------------- .../gpufort_acc_runtime.template.f90} | 14 +- .../src/gpufort_acc_runtime_base.f90 | 10 +- runtime/gpufort_acc_runtime/test/Makefile | 2 +- .../{test.f90 => test_c_ptr_association.f90} | 0 .../test/test_optional_values.f90 | 29 + 11 files changed, 67 insertions(+), 12726 deletions(-) rename runtime/gpufort_acc_runtime/{codegen/model.py => codegen.py} (64%) delete mode 100644 runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 create mode 100644 runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.def delete mode 100644 runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 rename runtime/gpufort_acc_runtime/{codegen/templates/gpufort_acc_runtime.template.f => src/gpufort_acc_runtime.template.f90} (97%) rename runtime/gpufort_acc_runtime/test/{test.f90 => test_c_ptr_association.f90} (100%) create mode 100644 runtime/gpufort_acc_runtime/test/test_optional_values.f90 diff --git a/python/gpufort.py b/python/gpufort.py index 29846841..13c7e90c 100644 --- a/python/gpufort.py +++ b/python/gpufort.py @@ -142,7 +142,7 @@ def parse_config(config_filepath): utils.logging.log_error(LOG_PREFIX,"parse_config",msg) sys.exit(1) -def parse_command_line_arguments(): +def parse_cl_args(): """ Parse command line arguments after all changes and argument transformations by the config file have been applied. """ @@ -358,7 +358,7 @@ def init_logging(input_filepath): config_filepath, include_dirs, defines = parse_raw_command_line_arguments() if config_filepath != None: parse_config(config_filepath) - args, unknown_args = parse_command_line_arguments() + args, unknown_args = parse_cl_args() if len(POST_CLI_ACTIONS): msg = "run registered actions" utils.logging.log_info(msg,verbose=False) diff --git a/runtime/gpufort_acc_runtime/Makefile b/runtime/gpufort_acc_runtime/Makefile index 1ee9227a..0b72a31a 100644 --- a/runtime/gpufort_acc_runtime/Makefile +++ b/runtime/gpufort_acc_runtime/Makefile @@ -2,6 +2,9 @@ include rules.mk .PHONY: build codegen all clean +codegen: + python3 codegen.py src/gpufort_acc_runtime.template.f90 -d 7 + build: mkdir -p lib/ mkdir -p include/ @@ -10,10 +13,6 @@ build: mv src/libgpufort_acc.a lib/ make -C src/ clean -codegen: - cd codegen && python3 ./model.py - cp codegen/gpufort_acc_runtime.f90 src/gpufort_acc_runtime.f90 - all: | codegen build clean: diff --git a/runtime/gpufort_acc_runtime/codegen/model.py b/runtime/gpufort_acc_runtime/codegen.py similarity index 64% rename from runtime/gpufort_acc_runtime/codegen/model.py rename to runtime/gpufort_acc_runtime/codegen.py index a86728cf..e30cb519 100644 --- a/runtime/gpufort_acc_runtime/codegen/model.py +++ b/runtime/gpufort_acc_runtime/codegen.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 import os import pprint +import argparse import jinja2 -class BaseModel(): +class Model(): def __init__(self,template): self._template = template def generate_code(self,context={}): @@ -21,12 +22,18 @@ def generate_file(self,output_file_path,context={}): with open(output_file_path, "w") as output: output.write(self.generate_code(context)) -class GpufortAccRuntimeModuleModel(BaseModel): - def __init__(self): - BaseModel.__init__(self,"templates/gpufort_acc_runtime.template.f") +def parse_cl_args(): + parser = argparse.ArgumentParser(description="Codegenerator") + parser.add_argument("input",type=str,help="Path to template file. (in format: .template.") + parser.add_argument("-d","--max-dims",type=int,dest="max_dims",help="Maximum number of array dimensions to support.") + return parser.parse_args() if __name__ == "__main__": - maxDims = 7 + args = parse_cl_args() + + max_dims = args.max_dims + template_path = args.input + outfile_path = template_path.replace(".template","") datatypes = [\ ["l","1","logical"], \ @@ -34,8 +41,8 @@ def __init__(self): ["r4","4","real(4)"], ["r8","8","real(8)"], \ ["c4","2*4","complex(4)"],["c8","2*8","complex(8)"] \ ] - dimensions = range(0,maxDims+1) + dimensions = range(0,max_dims+1) context = { "datatypes" : datatypes, "dimensions" : dimensions } - - GpufortAccRuntimeModuleModel().\ - generate_file("gpufort_acc_runtime.f90",context) + + Model(template_path).\ + generate_file(outfile_path,context) diff --git a/runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 b/runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 deleted file mode 100644 index eed4885d..00000000 --- a/runtime/gpufort_acc_runtime/codegen/gpufort_acc_runtime.f90 +++ /dev/null @@ -1,6349 +0,0 @@ -! SPDX-License-Identifier: MIT -! Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. - -! TODO not thread-safe, make use of OMP_LIB module if this becomes a problem - -! TODO will be slow for large pointer storages -! If this becomes an issue, use faster data structures or bind the public interfaces to -! a faster C runtime - -module gpufort_acc_runtime - use gpufort_acc_runtime_base - - !> copyin( list ) parallel, kernels, serial, data, enter data, - !> declare - !> When entering the region or at an enter data directive, - !> if the data in list is already present on the current device, the - !> appropriate reference count is incremented and that copy is - !> used. Otherwise, it allocates device memory and copies the - !> values from the encountering thread and sets the appropriate - !> reference count to one. When exiting the region the structured - !> reference count is decremented. If both reference counts are - !> zero, the device memory is deallocated. - interface gpufort_acc_copyin - module procedure gpufort_acc_copyin_b,gpufort_acc_copyin_l_0,gpufort_acc_copyin_l_1,gpufort_acc_copyin_l_2,gpufort_acc_copyin_l_3,gpufort_acc_copyin_l_4,gpufort_acc_copyin_l_5,gpufort_acc_copyin_l_6,gpufort_acc_copyin_l_7,gpufort_acc_copyin_i4_0,gpufort_acc_copyin_i4_1,gpufort_acc_copyin_i4_2,gpufort_acc_copyin_i4_3,gpufort_acc_copyin_i4_4,gpufort_acc_copyin_i4_5,gpufort_acc_copyin_i4_6,gpufort_acc_copyin_i4_7,gpufort_acc_copyin_i8_0,gpufort_acc_copyin_i8_1,gpufort_acc_copyin_i8_2,gpufort_acc_copyin_i8_3,gpufort_acc_copyin_i8_4,gpufort_acc_copyin_i8_5,gpufort_acc_copyin_i8_6,gpufort_acc_copyin_i8_7,gpufort_acc_copyin_r4_0,gpufort_acc_copyin_r4_1,gpufort_acc_copyin_r4_2,gpufort_acc_copyin_r4_3,gpufort_acc_copyin_r4_4,gpufort_acc_copyin_r4_5,gpufort_acc_copyin_r4_6,gpufort_acc_copyin_r4_7,gpufort_acc_copyin_r8_0,gpufort_acc_copyin_r8_1,gpufort_acc_copyin_r8_2,gpufort_acc_copyin_r8_3,gpufort_acc_copyin_r8_4,gpufort_acc_copyin_r8_5,gpufort_acc_copyin_r8_6,gpufort_acc_copyin_r8_7,gpufort_acc_copyin_c4_0,gpufort_acc_copyin_c4_1,gpufort_acc_copyin_c4_2,gpufort_acc_copyin_c4_3,gpufort_acc_copyin_c4_4,gpufort_acc_copyin_c4_5,gpufort_acc_copyin_c4_6,gpufort_acc_copyin_c4_7,gpufort_acc_copyin_c8_0,gpufort_acc_copyin_c8_1,gpufort_acc_copyin_c8_2,gpufort_acc_copyin_c8_3,gpufort_acc_copyin_c8_4,gpufort_acc_copyin_c8_5,gpufort_acc_copyin_c8_6,gpufort_acc_copyin_c8_7 - end interface - - !> copyout( list ) parallel, kernels, serial, data, exit data, - !> declare - !> When entering the region, if the data in list is already present on - !> the current device, the structured reference count is incremented - !> and that copy is used. Otherwise, it allocates device memory and - !> sets the structured reference count to one. At an exit data - !> directive with no finalize clause or when exiting the region, - !> the appropriate reference count is decremented. At an exit - !> data directive with a finalize clause, the dynamic reference - !> count is set to zero. In any case, if both reference counts are zero, - !> the data is copied from device memory to the encountering - !> thread and the device memory is deallocated. - interface gpufort_acc_copyout - module procedure gpufort_acc_copyout_b,gpufort_acc_copyout_l_0,gpufort_acc_copyout_l_1,gpufort_acc_copyout_l_2,gpufort_acc_copyout_l_3,gpufort_acc_copyout_l_4,gpufort_acc_copyout_l_5,gpufort_acc_copyout_l_6,gpufort_acc_copyout_l_7,gpufort_acc_copyout_i4_0,gpufort_acc_copyout_i4_1,gpufort_acc_copyout_i4_2,gpufort_acc_copyout_i4_3,gpufort_acc_copyout_i4_4,gpufort_acc_copyout_i4_5,gpufort_acc_copyout_i4_6,gpufort_acc_copyout_i4_7,gpufort_acc_copyout_i8_0,gpufort_acc_copyout_i8_1,gpufort_acc_copyout_i8_2,gpufort_acc_copyout_i8_3,gpufort_acc_copyout_i8_4,gpufort_acc_copyout_i8_5,gpufort_acc_copyout_i8_6,gpufort_acc_copyout_i8_7,gpufort_acc_copyout_r4_0,gpufort_acc_copyout_r4_1,gpufort_acc_copyout_r4_2,gpufort_acc_copyout_r4_3,gpufort_acc_copyout_r4_4,gpufort_acc_copyout_r4_5,gpufort_acc_copyout_r4_6,gpufort_acc_copyout_r4_7,gpufort_acc_copyout_r8_0,gpufort_acc_copyout_r8_1,gpufort_acc_copyout_r8_2,gpufort_acc_copyout_r8_3,gpufort_acc_copyout_r8_4,gpufort_acc_copyout_r8_5,gpufort_acc_copyout_r8_6,gpufort_acc_copyout_r8_7,gpufort_acc_copyout_c4_0,gpufort_acc_copyout_c4_1,gpufort_acc_copyout_c4_2,gpufort_acc_copyout_c4_3,gpufort_acc_copyout_c4_4,gpufort_acc_copyout_c4_5,gpufort_acc_copyout_c4_6,gpufort_acc_copyout_c4_7,gpufort_acc_copyout_c8_0,gpufort_acc_copyout_c8_1,gpufort_acc_copyout_c8_2,gpufort_acc_copyout_c8_3,gpufort_acc_copyout_c8_4,gpufort_acc_copyout_c8_5,gpufort_acc_copyout_c8_6,gpufort_acc_copyout_c8_7 - end interface - - !> copy( list ) parallel, kernels, serial, data, declare - !> When entering the region, if the data in list is already present on - !> the current device, the structured reference count is incremented - !> and that copy is used. Otherwise, it allocates device memory - !> and copies the values from the encountering thread and sets - !> the structured reference count to one. When exiting the region, - !> the structured reference count is decremented. If both reference - !> counts are zero, the data is copied from device memory to the - !> encountering thread and the device memory is deallocated. - interface gpufort_acc_copy - module procedure gpufort_acc_copy_b,gpufort_acc_copy_l_0,gpufort_acc_copy_l_1,gpufort_acc_copy_l_2,gpufort_acc_copy_l_3,gpufort_acc_copy_l_4,gpufort_acc_copy_l_5,gpufort_acc_copy_l_6,gpufort_acc_copy_l_7,gpufort_acc_copy_i4_0,gpufort_acc_copy_i4_1,gpufort_acc_copy_i4_2,gpufort_acc_copy_i4_3,gpufort_acc_copy_i4_4,gpufort_acc_copy_i4_5,gpufort_acc_copy_i4_6,gpufort_acc_copy_i4_7,gpufort_acc_copy_i8_0,gpufort_acc_copy_i8_1,gpufort_acc_copy_i8_2,gpufort_acc_copy_i8_3,gpufort_acc_copy_i8_4,gpufort_acc_copy_i8_5,gpufort_acc_copy_i8_6,gpufort_acc_copy_i8_7,gpufort_acc_copy_r4_0,gpufort_acc_copy_r4_1,gpufort_acc_copy_r4_2,gpufort_acc_copy_r4_3,gpufort_acc_copy_r4_4,gpufort_acc_copy_r4_5,gpufort_acc_copy_r4_6,gpufort_acc_copy_r4_7,gpufort_acc_copy_r8_0,gpufort_acc_copy_r8_1,gpufort_acc_copy_r8_2,gpufort_acc_copy_r8_3,gpufort_acc_copy_r8_4,gpufort_acc_copy_r8_5,gpufort_acc_copy_r8_6,gpufort_acc_copy_r8_7,gpufort_acc_copy_c4_0,gpufort_acc_copy_c4_1,gpufort_acc_copy_c4_2,gpufort_acc_copy_c4_3,gpufort_acc_copy_c4_4,gpufort_acc_copy_c4_5,gpufort_acc_copy_c4_6,gpufort_acc_copy_c4_7,gpufort_acc_copy_c8_0,gpufort_acc_copy_c8_1,gpufort_acc_copy_c8_2,gpufort_acc_copy_c8_3,gpufort_acc_copy_c8_4,gpufort_acc_copy_c8_5,gpufort_acc_copy_c8_6,gpufort_acc_copy_c8_7 - end interface - - !> create( list ) parallel, kernels, serial, data, enter data, - !> declare - !> When entering the region or at an enter data directive, - !> if the data in list is already present on the current device, the - !> appropriate reference count is incremented and that copy - !> is used. Otherwise, it allocates device memory and sets the - !> appropriate reference count to one. When exiting the region, - !> the structured reference count is decremented. If both reference - !> counts are zero, the device memory is deallocated. - interface gpufort_acc_create - module procedure gpufort_acc_create_b,gpufort_acc_create_l_0,gpufort_acc_create_l_1,gpufort_acc_create_l_2,gpufort_acc_create_l_3,gpufort_acc_create_l_4,gpufort_acc_create_l_5,gpufort_acc_create_l_6,gpufort_acc_create_l_7,gpufort_acc_create_i4_0,gpufort_acc_create_i4_1,gpufort_acc_create_i4_2,gpufort_acc_create_i4_3,gpufort_acc_create_i4_4,gpufort_acc_create_i4_5,gpufort_acc_create_i4_6,gpufort_acc_create_i4_7,gpufort_acc_create_i8_0,gpufort_acc_create_i8_1,gpufort_acc_create_i8_2,gpufort_acc_create_i8_3,gpufort_acc_create_i8_4,gpufort_acc_create_i8_5,gpufort_acc_create_i8_6,gpufort_acc_create_i8_7,gpufort_acc_create_r4_0,gpufort_acc_create_r4_1,gpufort_acc_create_r4_2,gpufort_acc_create_r4_3,gpufort_acc_create_r4_4,gpufort_acc_create_r4_5,gpufort_acc_create_r4_6,gpufort_acc_create_r4_7,gpufort_acc_create_r8_0,gpufort_acc_create_r8_1,gpufort_acc_create_r8_2,gpufort_acc_create_r8_3,gpufort_acc_create_r8_4,gpufort_acc_create_r8_5,gpufort_acc_create_r8_6,gpufort_acc_create_r8_7,gpufort_acc_create_c4_0,gpufort_acc_create_c4_1,gpufort_acc_create_c4_2,gpufort_acc_create_c4_3,gpufort_acc_create_c4_4,gpufort_acc_create_c4_5,gpufort_acc_create_c4_6,gpufort_acc_create_c4_7,gpufort_acc_create_c8_0,gpufort_acc_create_c8_1,gpufort_acc_create_c8_2,gpufort_acc_create_c8_3,gpufort_acc_create_c8_4,gpufort_acc_create_c8_5,gpufort_acc_create_c8_6,gpufort_acc_create_c8_7 - end interface - - !> no_create( list ) parallel, kernels, serial, data - !> When entering the region, if the data in list is already present on - !> the current device, the structured reference count is incremented - !> and that copy is used. Otherwise, no action is performed and any - !> device code in the construct will use the local memory address - !> for that data. - interface gpufort_acc_no_create - module procedure gpufort_acc_no_create_b,gpufort_acc_no_create_l_0,gpufort_acc_no_create_l_1,gpufort_acc_no_create_l_2,gpufort_acc_no_create_l_3,gpufort_acc_no_create_l_4,gpufort_acc_no_create_l_5,gpufort_acc_no_create_l_6,gpufort_acc_no_create_l_7,gpufort_acc_no_create_i4_0,gpufort_acc_no_create_i4_1,gpufort_acc_no_create_i4_2,gpufort_acc_no_create_i4_3,gpufort_acc_no_create_i4_4,gpufort_acc_no_create_i4_5,gpufort_acc_no_create_i4_6,gpufort_acc_no_create_i4_7,gpufort_acc_no_create_i8_0,gpufort_acc_no_create_i8_1,gpufort_acc_no_create_i8_2,gpufort_acc_no_create_i8_3,gpufort_acc_no_create_i8_4,gpufort_acc_no_create_i8_5,gpufort_acc_no_create_i8_6,gpufort_acc_no_create_i8_7,gpufort_acc_no_create_r4_0,gpufort_acc_no_create_r4_1,gpufort_acc_no_create_r4_2,gpufort_acc_no_create_r4_3,gpufort_acc_no_create_r4_4,gpufort_acc_no_create_r4_5,gpufort_acc_no_create_r4_6,gpufort_acc_no_create_r4_7,gpufort_acc_no_create_r8_0,gpufort_acc_no_create_r8_1,gpufort_acc_no_create_r8_2,gpufort_acc_no_create_r8_3,gpufort_acc_no_create_r8_4,gpufort_acc_no_create_r8_5,gpufort_acc_no_create_r8_6,gpufort_acc_no_create_r8_7,gpufort_acc_no_create_c4_0,gpufort_acc_no_create_c4_1,gpufort_acc_no_create_c4_2,gpufort_acc_no_create_c4_3,gpufort_acc_no_create_c4_4,gpufort_acc_no_create_c4_5,gpufort_acc_no_create_c4_6,gpufort_acc_no_create_c4_7,gpufort_acc_no_create_c8_0,gpufort_acc_no_create_c8_1,gpufort_acc_no_create_c8_2,gpufort_acc_no_create_c8_3,gpufort_acc_no_create_c8_4,gpufort_acc_no_create_c8_5,gpufort_acc_no_create_c8_6,gpufort_acc_no_create_c8_7 - end interface - - !> The delete clause may appear on exit data directives. - !> - !> For each var in varlist, if var is in shared memory, no action is taken; if var is not in shared memory, - !> the delete clause behaves as follows: - !> If var is not present in the current device memory, a runtime error is issued. - !> Otherwise, the dynamic reference counter is updated: - !> On an exit data directive with a finalize clause, the dynamic reference counter - !> is set to zero. - !> Otherwise, a present decrement action with the dynamic reference counter is performed. - !> If var is a pointer reference, a detach action is performed. If both structured and dynamic - !> reference counters are zero, a delete action is performed. - !> An exit data directive with a delete clause and with or without a finalize clause is - !> functionally equivalent to a call to - !> the acc_delete_finalize or acc_delete API routine, respectively, as described in Section 3.2.23. - !> - !> \note use - interface gpufort_acc_delete - module procedure gpufort_acc_delete_b,gpufort_acc_delete_l_0,gpufort_acc_delete_l_1,gpufort_acc_delete_l_2,gpufort_acc_delete_l_3,gpufort_acc_delete_l_4,gpufort_acc_delete_l_5,gpufort_acc_delete_l_6,gpufort_acc_delete_l_7,gpufort_acc_delete_i4_0,gpufort_acc_delete_i4_1,gpufort_acc_delete_i4_2,gpufort_acc_delete_i4_3,gpufort_acc_delete_i4_4,gpufort_acc_delete_i4_5,gpufort_acc_delete_i4_6,gpufort_acc_delete_i4_7,gpufort_acc_delete_i8_0,gpufort_acc_delete_i8_1,gpufort_acc_delete_i8_2,gpufort_acc_delete_i8_3,gpufort_acc_delete_i8_4,gpufort_acc_delete_i8_5,gpufort_acc_delete_i8_6,gpufort_acc_delete_i8_7,gpufort_acc_delete_r4_0,gpufort_acc_delete_r4_1,gpufort_acc_delete_r4_2,gpufort_acc_delete_r4_3,gpufort_acc_delete_r4_4,gpufort_acc_delete_r4_5,gpufort_acc_delete_r4_6,gpufort_acc_delete_r4_7,gpufort_acc_delete_r8_0,gpufort_acc_delete_r8_1,gpufort_acc_delete_r8_2,gpufort_acc_delete_r8_3,gpufort_acc_delete_r8_4,gpufort_acc_delete_r8_5,gpufort_acc_delete_r8_6,gpufort_acc_delete_r8_7,gpufort_acc_delete_c4_0,gpufort_acc_delete_c4_1,gpufort_acc_delete_c4_2,gpufort_acc_delete_c4_3,gpufort_acc_delete_c4_4,gpufort_acc_delete_c4_5,gpufort_acc_delete_c4_6,gpufort_acc_delete_c4_7,gpufort_acc_delete_c8_0,gpufort_acc_delete_c8_1,gpufort_acc_delete_c8_2,gpufort_acc_delete_c8_3,gpufort_acc_delete_c8_4,gpufort_acc_delete_c8_5,gpufort_acc_delete_c8_6,gpufort_acc_delete_c8_7 - end interface - - !> present( list ) parallel, kernels, serial, data, declare - !> When entering the region, the data must be present in device - !> memory, and the structured reference count is incremented. - !> When exiting the region, the structured reference count is - !> decremented. - interface gpufort_acc_present - module procedure gpufort_acc_present_b,gpufort_acc_present_l_0,gpufort_acc_present_l_1,gpufort_acc_present_l_2,gpufort_acc_present_l_3,gpufort_acc_present_l_4,gpufort_acc_present_l_5,gpufort_acc_present_l_6,gpufort_acc_present_l_7,gpufort_acc_present_i4_0,gpufort_acc_present_i4_1,gpufort_acc_present_i4_2,gpufort_acc_present_i4_3,gpufort_acc_present_i4_4,gpufort_acc_present_i4_5,gpufort_acc_present_i4_6,gpufort_acc_present_i4_7,gpufort_acc_present_i8_0,gpufort_acc_present_i8_1,gpufort_acc_present_i8_2,gpufort_acc_present_i8_3,gpufort_acc_present_i8_4,gpufort_acc_present_i8_5,gpufort_acc_present_i8_6,gpufort_acc_present_i8_7,gpufort_acc_present_r4_0,gpufort_acc_present_r4_1,gpufort_acc_present_r4_2,gpufort_acc_present_r4_3,gpufort_acc_present_r4_4,gpufort_acc_present_r4_5,gpufort_acc_present_r4_6,gpufort_acc_present_r4_7,gpufort_acc_present_r8_0,gpufort_acc_present_r8_1,gpufort_acc_present_r8_2,gpufort_acc_present_r8_3,gpufort_acc_present_r8_4,gpufort_acc_present_r8_5,gpufort_acc_present_r8_6,gpufort_acc_present_r8_7,gpufort_acc_present_c4_0,gpufort_acc_present_c4_1,gpufort_acc_present_c4_2,gpufort_acc_present_c4_3,gpufort_acc_present_c4_4,gpufort_acc_present_c4_5,gpufort_acc_present_c4_6,gpufort_acc_present_c4_7,gpufort_acc_present_c8_0,gpufort_acc_present_c8_1,gpufort_acc_present_c8_2,gpufort_acc_present_c8_3,gpufort_acc_present_c8_4,gpufort_acc_present_c8_5,gpufort_acc_present_c8_6,gpufort_acc_present_c8_7 - end interface - - !> Update Directive - !> - !> The update directive copies data between the memory for the - !> encountering thread and the device. An update directive may - !> appear in any data region, including an implicit data region. - !> - !> FORTRAN - !> - !> !$acc update [clause [[,] clause]…] - !> - !> CLAUSES - !> - !> self( list ) or host( list ) - !> Copies the data in list from the device to the encountering - !> thread. - !> device( list ) - !> Copies the data in list from the encountering thread to the - !> device. - !> if( condition ) - !> When the condition is zero or .FALSE., no data will be moved to - !> or from the device. - !> if_present - !> Issue no error when the data is not present on the device. - !> async [( expression )] - !> The data movement will execute asynchronously with the - !> encountering thread on the corresponding async queue. - !> wait [( expression-list )] - !> The data movement will not begin execution until all actions on - !> the corresponding async queue(s) are complete. - interface gpufort_acc_update_host - module procedure gpufort_acc_update_host_b,gpufort_acc_update_host_l_0,gpufort_acc_update_host_l_1,gpufort_acc_update_host_l_2,gpufort_acc_update_host_l_3,gpufort_acc_update_host_l_4,gpufort_acc_update_host_l_5,gpufort_acc_update_host_l_6,gpufort_acc_update_host_l_7,gpufort_acc_update_host_i4_0,gpufort_acc_update_host_i4_1,gpufort_acc_update_host_i4_2,gpufort_acc_update_host_i4_3,gpufort_acc_update_host_i4_4,gpufort_acc_update_host_i4_5,gpufort_acc_update_host_i4_6,gpufort_acc_update_host_i4_7,gpufort_acc_update_host_i8_0,gpufort_acc_update_host_i8_1,gpufort_acc_update_host_i8_2,gpufort_acc_update_host_i8_3,gpufort_acc_update_host_i8_4,gpufort_acc_update_host_i8_5,gpufort_acc_update_host_i8_6,gpufort_acc_update_host_i8_7,gpufort_acc_update_host_r4_0,gpufort_acc_update_host_r4_1,gpufort_acc_update_host_r4_2,gpufort_acc_update_host_r4_3,gpufort_acc_update_host_r4_4,gpufort_acc_update_host_r4_5,gpufort_acc_update_host_r4_6,gpufort_acc_update_host_r4_7,gpufort_acc_update_host_r8_0,gpufort_acc_update_host_r8_1,gpufort_acc_update_host_r8_2,gpufort_acc_update_host_r8_3,gpufort_acc_update_host_r8_4,gpufort_acc_update_host_r8_5,gpufort_acc_update_host_r8_6,gpufort_acc_update_host_r8_7,gpufort_acc_update_host_c4_0,gpufort_acc_update_host_c4_1,gpufort_acc_update_host_c4_2,gpufort_acc_update_host_c4_3,gpufort_acc_update_host_c4_4,gpufort_acc_update_host_c4_5,gpufort_acc_update_host_c4_6,gpufort_acc_update_host_c4_7,gpufort_acc_update_host_c8_0,gpufort_acc_update_host_c8_1,gpufort_acc_update_host_c8_2,gpufort_acc_update_host_c8_3,gpufort_acc_update_host_c8_4,gpufort_acc_update_host_c8_5,gpufort_acc_update_host_c8_6,gpufort_acc_update_host_c8_7 - end interface - - !> Update Directive - !> - !> The update directive copies data between the memory for the - !> encountering thread and the device. An update directive may - !> appear in any data region, including an implicit data region. - !> - !> FORTRAN - !> - !> !$acc update [clause [[,] clause]…] - !> - !> CLAUSES - !> - !> self( list ) or host( list ) - !> Copies the data in list from the device to the encountering - !> thread. - !> device( list ) - !> Copies the data in list from the encountering thread to the - !> device. - !> if( condition ) - !> When the condition is zero or .FALSE., no data will be moved to - !> or from the device. - !> if_present - !> Issue no error when the data is not present on the device. - !> async [( expression )] - !> The data movement will execute asynchronously with the - !> encountering thread on the corresponding async queue. - !> wait [( expression-list )] - !> The data movement will not begin execution until all actions on - !> the corresponding async queue(s) are complete. - interface gpufort_acc_update_device - module procedure gpufort_acc_update_device_b,gpufort_acc_update_device_l_0,gpufort_acc_update_device_l_1,gpufort_acc_update_device_l_2,gpufort_acc_update_device_l_3,gpufort_acc_update_device_l_4,gpufort_acc_update_device_l_5,gpufort_acc_update_device_l_6,gpufort_acc_update_device_l_7,gpufort_acc_update_device_i4_0,gpufort_acc_update_device_i4_1,gpufort_acc_update_device_i4_2,gpufort_acc_update_device_i4_3,gpufort_acc_update_device_i4_4,gpufort_acc_update_device_i4_5,gpufort_acc_update_device_i4_6,gpufort_acc_update_device_i4_7,gpufort_acc_update_device_i8_0,gpufort_acc_update_device_i8_1,gpufort_acc_update_device_i8_2,gpufort_acc_update_device_i8_3,gpufort_acc_update_device_i8_4,gpufort_acc_update_device_i8_5,gpufort_acc_update_device_i8_6,gpufort_acc_update_device_i8_7,gpufort_acc_update_device_r4_0,gpufort_acc_update_device_r4_1,gpufort_acc_update_device_r4_2,gpufort_acc_update_device_r4_3,gpufort_acc_update_device_r4_4,gpufort_acc_update_device_r4_5,gpufort_acc_update_device_r4_6,gpufort_acc_update_device_r4_7,gpufort_acc_update_device_r8_0,gpufort_acc_update_device_r8_1,gpufort_acc_update_device_r8_2,gpufort_acc_update_device_r8_3,gpufort_acc_update_device_r8_4,gpufort_acc_update_device_r8_5,gpufort_acc_update_device_r8_6,gpufort_acc_update_device_r8_7,gpufort_acc_update_device_c4_0,gpufort_acc_update_device_c4_1,gpufort_acc_update_device_c4_2,gpufort_acc_update_device_c4_3,gpufort_acc_update_device_c4_4,gpufort_acc_update_device_c4_5,gpufort_acc_update_device_c4_6,gpufort_acc_update_device_c4_7,gpufort_acc_update_device_c8_0,gpufort_acc_update_device_c8_1,gpufort_acc_update_device_c8_2,gpufort_acc_update_device_c8_3,gpufort_acc_update_device_c8_4,gpufort_acc_update_device_c8_5,gpufort_acc_update_device_c8_6,gpufort_acc_update_device_c8_7 - end interface - - contains - - ! - ! autogenerated routines for different inputs - ! - - - function gpufort_acc_present_l_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),1_8) - end function - - function gpufort_acc_no_create_l_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),1_8,async,module_var) - end function - - function gpufort_acc_copy_l_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),1_8,async) - end function - - subroutine gpufort_acc_update_host_l_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_i4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),4_8) - end function - - function gpufort_acc_no_create_i4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_i8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),8_8) - end function - - function gpufort_acc_no_create_i8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_r4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),4_8) - end function - - function gpufort_acc_no_create_r4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_r8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),8_8) - end function - - function gpufort_acc_no_create_r8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_c4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),2*4_8) - end function - - function gpufort_acc_no_create_c4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_c8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),2*8_8) - end function - - function gpufort_acc_no_create_c8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - -end module \ No newline at end of file diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.def b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.def new file mode 100644 index 00000000..2a7cb8b9 --- /dev/null +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.def @@ -0,0 +1,4 @@ +#define __PRESENT_OPTIONALS_DUMMY_ARGS async,module_var,create,copy,copyin,copyout +#define __PRESENT_OPTIONALS_DECLARATIONS integer,intent(in),optional :: async\ + logical,intent(in),optional :: module_var\ + logical,intent(in),optional :: copy, copyin, copyout, create diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 deleted file mode 100644 index eed4885d..00000000 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.f90 +++ /dev/null @@ -1,6349 +0,0 @@ -! SPDX-License-Identifier: MIT -! Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. - -! TODO not thread-safe, make use of OMP_LIB module if this becomes a problem - -! TODO will be slow for large pointer storages -! If this becomes an issue, use faster data structures or bind the public interfaces to -! a faster C runtime - -module gpufort_acc_runtime - use gpufort_acc_runtime_base - - !> copyin( list ) parallel, kernels, serial, data, enter data, - !> declare - !> When entering the region or at an enter data directive, - !> if the data in list is already present on the current device, the - !> appropriate reference count is incremented and that copy is - !> used. Otherwise, it allocates device memory and copies the - !> values from the encountering thread and sets the appropriate - !> reference count to one. When exiting the region the structured - !> reference count is decremented. If both reference counts are - !> zero, the device memory is deallocated. - interface gpufort_acc_copyin - module procedure gpufort_acc_copyin_b,gpufort_acc_copyin_l_0,gpufort_acc_copyin_l_1,gpufort_acc_copyin_l_2,gpufort_acc_copyin_l_3,gpufort_acc_copyin_l_4,gpufort_acc_copyin_l_5,gpufort_acc_copyin_l_6,gpufort_acc_copyin_l_7,gpufort_acc_copyin_i4_0,gpufort_acc_copyin_i4_1,gpufort_acc_copyin_i4_2,gpufort_acc_copyin_i4_3,gpufort_acc_copyin_i4_4,gpufort_acc_copyin_i4_5,gpufort_acc_copyin_i4_6,gpufort_acc_copyin_i4_7,gpufort_acc_copyin_i8_0,gpufort_acc_copyin_i8_1,gpufort_acc_copyin_i8_2,gpufort_acc_copyin_i8_3,gpufort_acc_copyin_i8_4,gpufort_acc_copyin_i8_5,gpufort_acc_copyin_i8_6,gpufort_acc_copyin_i8_7,gpufort_acc_copyin_r4_0,gpufort_acc_copyin_r4_1,gpufort_acc_copyin_r4_2,gpufort_acc_copyin_r4_3,gpufort_acc_copyin_r4_4,gpufort_acc_copyin_r4_5,gpufort_acc_copyin_r4_6,gpufort_acc_copyin_r4_7,gpufort_acc_copyin_r8_0,gpufort_acc_copyin_r8_1,gpufort_acc_copyin_r8_2,gpufort_acc_copyin_r8_3,gpufort_acc_copyin_r8_4,gpufort_acc_copyin_r8_5,gpufort_acc_copyin_r8_6,gpufort_acc_copyin_r8_7,gpufort_acc_copyin_c4_0,gpufort_acc_copyin_c4_1,gpufort_acc_copyin_c4_2,gpufort_acc_copyin_c4_3,gpufort_acc_copyin_c4_4,gpufort_acc_copyin_c4_5,gpufort_acc_copyin_c4_6,gpufort_acc_copyin_c4_7,gpufort_acc_copyin_c8_0,gpufort_acc_copyin_c8_1,gpufort_acc_copyin_c8_2,gpufort_acc_copyin_c8_3,gpufort_acc_copyin_c8_4,gpufort_acc_copyin_c8_5,gpufort_acc_copyin_c8_6,gpufort_acc_copyin_c8_7 - end interface - - !> copyout( list ) parallel, kernels, serial, data, exit data, - !> declare - !> When entering the region, if the data in list is already present on - !> the current device, the structured reference count is incremented - !> and that copy is used. Otherwise, it allocates device memory and - !> sets the structured reference count to one. At an exit data - !> directive with no finalize clause or when exiting the region, - !> the appropriate reference count is decremented. At an exit - !> data directive with a finalize clause, the dynamic reference - !> count is set to zero. In any case, if both reference counts are zero, - !> the data is copied from device memory to the encountering - !> thread and the device memory is deallocated. - interface gpufort_acc_copyout - module procedure gpufort_acc_copyout_b,gpufort_acc_copyout_l_0,gpufort_acc_copyout_l_1,gpufort_acc_copyout_l_2,gpufort_acc_copyout_l_3,gpufort_acc_copyout_l_4,gpufort_acc_copyout_l_5,gpufort_acc_copyout_l_6,gpufort_acc_copyout_l_7,gpufort_acc_copyout_i4_0,gpufort_acc_copyout_i4_1,gpufort_acc_copyout_i4_2,gpufort_acc_copyout_i4_3,gpufort_acc_copyout_i4_4,gpufort_acc_copyout_i4_5,gpufort_acc_copyout_i4_6,gpufort_acc_copyout_i4_7,gpufort_acc_copyout_i8_0,gpufort_acc_copyout_i8_1,gpufort_acc_copyout_i8_2,gpufort_acc_copyout_i8_3,gpufort_acc_copyout_i8_4,gpufort_acc_copyout_i8_5,gpufort_acc_copyout_i8_6,gpufort_acc_copyout_i8_7,gpufort_acc_copyout_r4_0,gpufort_acc_copyout_r4_1,gpufort_acc_copyout_r4_2,gpufort_acc_copyout_r4_3,gpufort_acc_copyout_r4_4,gpufort_acc_copyout_r4_5,gpufort_acc_copyout_r4_6,gpufort_acc_copyout_r4_7,gpufort_acc_copyout_r8_0,gpufort_acc_copyout_r8_1,gpufort_acc_copyout_r8_2,gpufort_acc_copyout_r8_3,gpufort_acc_copyout_r8_4,gpufort_acc_copyout_r8_5,gpufort_acc_copyout_r8_6,gpufort_acc_copyout_r8_7,gpufort_acc_copyout_c4_0,gpufort_acc_copyout_c4_1,gpufort_acc_copyout_c4_2,gpufort_acc_copyout_c4_3,gpufort_acc_copyout_c4_4,gpufort_acc_copyout_c4_5,gpufort_acc_copyout_c4_6,gpufort_acc_copyout_c4_7,gpufort_acc_copyout_c8_0,gpufort_acc_copyout_c8_1,gpufort_acc_copyout_c8_2,gpufort_acc_copyout_c8_3,gpufort_acc_copyout_c8_4,gpufort_acc_copyout_c8_5,gpufort_acc_copyout_c8_6,gpufort_acc_copyout_c8_7 - end interface - - !> copy( list ) parallel, kernels, serial, data, declare - !> When entering the region, if the data in list is already present on - !> the current device, the structured reference count is incremented - !> and that copy is used. Otherwise, it allocates device memory - !> and copies the values from the encountering thread and sets - !> the structured reference count to one. When exiting the region, - !> the structured reference count is decremented. If both reference - !> counts are zero, the data is copied from device memory to the - !> encountering thread and the device memory is deallocated. - interface gpufort_acc_copy - module procedure gpufort_acc_copy_b,gpufort_acc_copy_l_0,gpufort_acc_copy_l_1,gpufort_acc_copy_l_2,gpufort_acc_copy_l_3,gpufort_acc_copy_l_4,gpufort_acc_copy_l_5,gpufort_acc_copy_l_6,gpufort_acc_copy_l_7,gpufort_acc_copy_i4_0,gpufort_acc_copy_i4_1,gpufort_acc_copy_i4_2,gpufort_acc_copy_i4_3,gpufort_acc_copy_i4_4,gpufort_acc_copy_i4_5,gpufort_acc_copy_i4_6,gpufort_acc_copy_i4_7,gpufort_acc_copy_i8_0,gpufort_acc_copy_i8_1,gpufort_acc_copy_i8_2,gpufort_acc_copy_i8_3,gpufort_acc_copy_i8_4,gpufort_acc_copy_i8_5,gpufort_acc_copy_i8_6,gpufort_acc_copy_i8_7,gpufort_acc_copy_r4_0,gpufort_acc_copy_r4_1,gpufort_acc_copy_r4_2,gpufort_acc_copy_r4_3,gpufort_acc_copy_r4_4,gpufort_acc_copy_r4_5,gpufort_acc_copy_r4_6,gpufort_acc_copy_r4_7,gpufort_acc_copy_r8_0,gpufort_acc_copy_r8_1,gpufort_acc_copy_r8_2,gpufort_acc_copy_r8_3,gpufort_acc_copy_r8_4,gpufort_acc_copy_r8_5,gpufort_acc_copy_r8_6,gpufort_acc_copy_r8_7,gpufort_acc_copy_c4_0,gpufort_acc_copy_c4_1,gpufort_acc_copy_c4_2,gpufort_acc_copy_c4_3,gpufort_acc_copy_c4_4,gpufort_acc_copy_c4_5,gpufort_acc_copy_c4_6,gpufort_acc_copy_c4_7,gpufort_acc_copy_c8_0,gpufort_acc_copy_c8_1,gpufort_acc_copy_c8_2,gpufort_acc_copy_c8_3,gpufort_acc_copy_c8_4,gpufort_acc_copy_c8_5,gpufort_acc_copy_c8_6,gpufort_acc_copy_c8_7 - end interface - - !> create( list ) parallel, kernels, serial, data, enter data, - !> declare - !> When entering the region or at an enter data directive, - !> if the data in list is already present on the current device, the - !> appropriate reference count is incremented and that copy - !> is used. Otherwise, it allocates device memory and sets the - !> appropriate reference count to one. When exiting the region, - !> the structured reference count is decremented. If both reference - !> counts are zero, the device memory is deallocated. - interface gpufort_acc_create - module procedure gpufort_acc_create_b,gpufort_acc_create_l_0,gpufort_acc_create_l_1,gpufort_acc_create_l_2,gpufort_acc_create_l_3,gpufort_acc_create_l_4,gpufort_acc_create_l_5,gpufort_acc_create_l_6,gpufort_acc_create_l_7,gpufort_acc_create_i4_0,gpufort_acc_create_i4_1,gpufort_acc_create_i4_2,gpufort_acc_create_i4_3,gpufort_acc_create_i4_4,gpufort_acc_create_i4_5,gpufort_acc_create_i4_6,gpufort_acc_create_i4_7,gpufort_acc_create_i8_0,gpufort_acc_create_i8_1,gpufort_acc_create_i8_2,gpufort_acc_create_i8_3,gpufort_acc_create_i8_4,gpufort_acc_create_i8_5,gpufort_acc_create_i8_6,gpufort_acc_create_i8_7,gpufort_acc_create_r4_0,gpufort_acc_create_r4_1,gpufort_acc_create_r4_2,gpufort_acc_create_r4_3,gpufort_acc_create_r4_4,gpufort_acc_create_r4_5,gpufort_acc_create_r4_6,gpufort_acc_create_r4_7,gpufort_acc_create_r8_0,gpufort_acc_create_r8_1,gpufort_acc_create_r8_2,gpufort_acc_create_r8_3,gpufort_acc_create_r8_4,gpufort_acc_create_r8_5,gpufort_acc_create_r8_6,gpufort_acc_create_r8_7,gpufort_acc_create_c4_0,gpufort_acc_create_c4_1,gpufort_acc_create_c4_2,gpufort_acc_create_c4_3,gpufort_acc_create_c4_4,gpufort_acc_create_c4_5,gpufort_acc_create_c4_6,gpufort_acc_create_c4_7,gpufort_acc_create_c8_0,gpufort_acc_create_c8_1,gpufort_acc_create_c8_2,gpufort_acc_create_c8_3,gpufort_acc_create_c8_4,gpufort_acc_create_c8_5,gpufort_acc_create_c8_6,gpufort_acc_create_c8_7 - end interface - - !> no_create( list ) parallel, kernels, serial, data - !> When entering the region, if the data in list is already present on - !> the current device, the structured reference count is incremented - !> and that copy is used. Otherwise, no action is performed and any - !> device code in the construct will use the local memory address - !> for that data. - interface gpufort_acc_no_create - module procedure gpufort_acc_no_create_b,gpufort_acc_no_create_l_0,gpufort_acc_no_create_l_1,gpufort_acc_no_create_l_2,gpufort_acc_no_create_l_3,gpufort_acc_no_create_l_4,gpufort_acc_no_create_l_5,gpufort_acc_no_create_l_6,gpufort_acc_no_create_l_7,gpufort_acc_no_create_i4_0,gpufort_acc_no_create_i4_1,gpufort_acc_no_create_i4_2,gpufort_acc_no_create_i4_3,gpufort_acc_no_create_i4_4,gpufort_acc_no_create_i4_5,gpufort_acc_no_create_i4_6,gpufort_acc_no_create_i4_7,gpufort_acc_no_create_i8_0,gpufort_acc_no_create_i8_1,gpufort_acc_no_create_i8_2,gpufort_acc_no_create_i8_3,gpufort_acc_no_create_i8_4,gpufort_acc_no_create_i8_5,gpufort_acc_no_create_i8_6,gpufort_acc_no_create_i8_7,gpufort_acc_no_create_r4_0,gpufort_acc_no_create_r4_1,gpufort_acc_no_create_r4_2,gpufort_acc_no_create_r4_3,gpufort_acc_no_create_r4_4,gpufort_acc_no_create_r4_5,gpufort_acc_no_create_r4_6,gpufort_acc_no_create_r4_7,gpufort_acc_no_create_r8_0,gpufort_acc_no_create_r8_1,gpufort_acc_no_create_r8_2,gpufort_acc_no_create_r8_3,gpufort_acc_no_create_r8_4,gpufort_acc_no_create_r8_5,gpufort_acc_no_create_r8_6,gpufort_acc_no_create_r8_7,gpufort_acc_no_create_c4_0,gpufort_acc_no_create_c4_1,gpufort_acc_no_create_c4_2,gpufort_acc_no_create_c4_3,gpufort_acc_no_create_c4_4,gpufort_acc_no_create_c4_5,gpufort_acc_no_create_c4_6,gpufort_acc_no_create_c4_7,gpufort_acc_no_create_c8_0,gpufort_acc_no_create_c8_1,gpufort_acc_no_create_c8_2,gpufort_acc_no_create_c8_3,gpufort_acc_no_create_c8_4,gpufort_acc_no_create_c8_5,gpufort_acc_no_create_c8_6,gpufort_acc_no_create_c8_7 - end interface - - !> The delete clause may appear on exit data directives. - !> - !> For each var in varlist, if var is in shared memory, no action is taken; if var is not in shared memory, - !> the delete clause behaves as follows: - !> If var is not present in the current device memory, a runtime error is issued. - !> Otherwise, the dynamic reference counter is updated: - !> On an exit data directive with a finalize clause, the dynamic reference counter - !> is set to zero. - !> Otherwise, a present decrement action with the dynamic reference counter is performed. - !> If var is a pointer reference, a detach action is performed. If both structured and dynamic - !> reference counters are zero, a delete action is performed. - !> An exit data directive with a delete clause and with or without a finalize clause is - !> functionally equivalent to a call to - !> the acc_delete_finalize or acc_delete API routine, respectively, as described in Section 3.2.23. - !> - !> \note use - interface gpufort_acc_delete - module procedure gpufort_acc_delete_b,gpufort_acc_delete_l_0,gpufort_acc_delete_l_1,gpufort_acc_delete_l_2,gpufort_acc_delete_l_3,gpufort_acc_delete_l_4,gpufort_acc_delete_l_5,gpufort_acc_delete_l_6,gpufort_acc_delete_l_7,gpufort_acc_delete_i4_0,gpufort_acc_delete_i4_1,gpufort_acc_delete_i4_2,gpufort_acc_delete_i4_3,gpufort_acc_delete_i4_4,gpufort_acc_delete_i4_5,gpufort_acc_delete_i4_6,gpufort_acc_delete_i4_7,gpufort_acc_delete_i8_0,gpufort_acc_delete_i8_1,gpufort_acc_delete_i8_2,gpufort_acc_delete_i8_3,gpufort_acc_delete_i8_4,gpufort_acc_delete_i8_5,gpufort_acc_delete_i8_6,gpufort_acc_delete_i8_7,gpufort_acc_delete_r4_0,gpufort_acc_delete_r4_1,gpufort_acc_delete_r4_2,gpufort_acc_delete_r4_3,gpufort_acc_delete_r4_4,gpufort_acc_delete_r4_5,gpufort_acc_delete_r4_6,gpufort_acc_delete_r4_7,gpufort_acc_delete_r8_0,gpufort_acc_delete_r8_1,gpufort_acc_delete_r8_2,gpufort_acc_delete_r8_3,gpufort_acc_delete_r8_4,gpufort_acc_delete_r8_5,gpufort_acc_delete_r8_6,gpufort_acc_delete_r8_7,gpufort_acc_delete_c4_0,gpufort_acc_delete_c4_1,gpufort_acc_delete_c4_2,gpufort_acc_delete_c4_3,gpufort_acc_delete_c4_4,gpufort_acc_delete_c4_5,gpufort_acc_delete_c4_6,gpufort_acc_delete_c4_7,gpufort_acc_delete_c8_0,gpufort_acc_delete_c8_1,gpufort_acc_delete_c8_2,gpufort_acc_delete_c8_3,gpufort_acc_delete_c8_4,gpufort_acc_delete_c8_5,gpufort_acc_delete_c8_6,gpufort_acc_delete_c8_7 - end interface - - !> present( list ) parallel, kernels, serial, data, declare - !> When entering the region, the data must be present in device - !> memory, and the structured reference count is incremented. - !> When exiting the region, the structured reference count is - !> decremented. - interface gpufort_acc_present - module procedure gpufort_acc_present_b,gpufort_acc_present_l_0,gpufort_acc_present_l_1,gpufort_acc_present_l_2,gpufort_acc_present_l_3,gpufort_acc_present_l_4,gpufort_acc_present_l_5,gpufort_acc_present_l_6,gpufort_acc_present_l_7,gpufort_acc_present_i4_0,gpufort_acc_present_i4_1,gpufort_acc_present_i4_2,gpufort_acc_present_i4_3,gpufort_acc_present_i4_4,gpufort_acc_present_i4_5,gpufort_acc_present_i4_6,gpufort_acc_present_i4_7,gpufort_acc_present_i8_0,gpufort_acc_present_i8_1,gpufort_acc_present_i8_2,gpufort_acc_present_i8_3,gpufort_acc_present_i8_4,gpufort_acc_present_i8_5,gpufort_acc_present_i8_6,gpufort_acc_present_i8_7,gpufort_acc_present_r4_0,gpufort_acc_present_r4_1,gpufort_acc_present_r4_2,gpufort_acc_present_r4_3,gpufort_acc_present_r4_4,gpufort_acc_present_r4_5,gpufort_acc_present_r4_6,gpufort_acc_present_r4_7,gpufort_acc_present_r8_0,gpufort_acc_present_r8_1,gpufort_acc_present_r8_2,gpufort_acc_present_r8_3,gpufort_acc_present_r8_4,gpufort_acc_present_r8_5,gpufort_acc_present_r8_6,gpufort_acc_present_r8_7,gpufort_acc_present_c4_0,gpufort_acc_present_c4_1,gpufort_acc_present_c4_2,gpufort_acc_present_c4_3,gpufort_acc_present_c4_4,gpufort_acc_present_c4_5,gpufort_acc_present_c4_6,gpufort_acc_present_c4_7,gpufort_acc_present_c8_0,gpufort_acc_present_c8_1,gpufort_acc_present_c8_2,gpufort_acc_present_c8_3,gpufort_acc_present_c8_4,gpufort_acc_present_c8_5,gpufort_acc_present_c8_6,gpufort_acc_present_c8_7 - end interface - - !> Update Directive - !> - !> The update directive copies data between the memory for the - !> encountering thread and the device. An update directive may - !> appear in any data region, including an implicit data region. - !> - !> FORTRAN - !> - !> !$acc update [clause [[,] clause]…] - !> - !> CLAUSES - !> - !> self( list ) or host( list ) - !> Copies the data in list from the device to the encountering - !> thread. - !> device( list ) - !> Copies the data in list from the encountering thread to the - !> device. - !> if( condition ) - !> When the condition is zero or .FALSE., no data will be moved to - !> or from the device. - !> if_present - !> Issue no error when the data is not present on the device. - !> async [( expression )] - !> The data movement will execute asynchronously with the - !> encountering thread on the corresponding async queue. - !> wait [( expression-list )] - !> The data movement will not begin execution until all actions on - !> the corresponding async queue(s) are complete. - interface gpufort_acc_update_host - module procedure gpufort_acc_update_host_b,gpufort_acc_update_host_l_0,gpufort_acc_update_host_l_1,gpufort_acc_update_host_l_2,gpufort_acc_update_host_l_3,gpufort_acc_update_host_l_4,gpufort_acc_update_host_l_5,gpufort_acc_update_host_l_6,gpufort_acc_update_host_l_7,gpufort_acc_update_host_i4_0,gpufort_acc_update_host_i4_1,gpufort_acc_update_host_i4_2,gpufort_acc_update_host_i4_3,gpufort_acc_update_host_i4_4,gpufort_acc_update_host_i4_5,gpufort_acc_update_host_i4_6,gpufort_acc_update_host_i4_7,gpufort_acc_update_host_i8_0,gpufort_acc_update_host_i8_1,gpufort_acc_update_host_i8_2,gpufort_acc_update_host_i8_3,gpufort_acc_update_host_i8_4,gpufort_acc_update_host_i8_5,gpufort_acc_update_host_i8_6,gpufort_acc_update_host_i8_7,gpufort_acc_update_host_r4_0,gpufort_acc_update_host_r4_1,gpufort_acc_update_host_r4_2,gpufort_acc_update_host_r4_3,gpufort_acc_update_host_r4_4,gpufort_acc_update_host_r4_5,gpufort_acc_update_host_r4_6,gpufort_acc_update_host_r4_7,gpufort_acc_update_host_r8_0,gpufort_acc_update_host_r8_1,gpufort_acc_update_host_r8_2,gpufort_acc_update_host_r8_3,gpufort_acc_update_host_r8_4,gpufort_acc_update_host_r8_5,gpufort_acc_update_host_r8_6,gpufort_acc_update_host_r8_7,gpufort_acc_update_host_c4_0,gpufort_acc_update_host_c4_1,gpufort_acc_update_host_c4_2,gpufort_acc_update_host_c4_3,gpufort_acc_update_host_c4_4,gpufort_acc_update_host_c4_5,gpufort_acc_update_host_c4_6,gpufort_acc_update_host_c4_7,gpufort_acc_update_host_c8_0,gpufort_acc_update_host_c8_1,gpufort_acc_update_host_c8_2,gpufort_acc_update_host_c8_3,gpufort_acc_update_host_c8_4,gpufort_acc_update_host_c8_5,gpufort_acc_update_host_c8_6,gpufort_acc_update_host_c8_7 - end interface - - !> Update Directive - !> - !> The update directive copies data between the memory for the - !> encountering thread and the device. An update directive may - !> appear in any data region, including an implicit data region. - !> - !> FORTRAN - !> - !> !$acc update [clause [[,] clause]…] - !> - !> CLAUSES - !> - !> self( list ) or host( list ) - !> Copies the data in list from the device to the encountering - !> thread. - !> device( list ) - !> Copies the data in list from the encountering thread to the - !> device. - !> if( condition ) - !> When the condition is zero or .FALSE., no data will be moved to - !> or from the device. - !> if_present - !> Issue no error when the data is not present on the device. - !> async [( expression )] - !> The data movement will execute asynchronously with the - !> encountering thread on the corresponding async queue. - !> wait [( expression-list )] - !> The data movement will not begin execution until all actions on - !> the corresponding async queue(s) are complete. - interface gpufort_acc_update_device - module procedure gpufort_acc_update_device_b,gpufort_acc_update_device_l_0,gpufort_acc_update_device_l_1,gpufort_acc_update_device_l_2,gpufort_acc_update_device_l_3,gpufort_acc_update_device_l_4,gpufort_acc_update_device_l_5,gpufort_acc_update_device_l_6,gpufort_acc_update_device_l_7,gpufort_acc_update_device_i4_0,gpufort_acc_update_device_i4_1,gpufort_acc_update_device_i4_2,gpufort_acc_update_device_i4_3,gpufort_acc_update_device_i4_4,gpufort_acc_update_device_i4_5,gpufort_acc_update_device_i4_6,gpufort_acc_update_device_i4_7,gpufort_acc_update_device_i8_0,gpufort_acc_update_device_i8_1,gpufort_acc_update_device_i8_2,gpufort_acc_update_device_i8_3,gpufort_acc_update_device_i8_4,gpufort_acc_update_device_i8_5,gpufort_acc_update_device_i8_6,gpufort_acc_update_device_i8_7,gpufort_acc_update_device_r4_0,gpufort_acc_update_device_r4_1,gpufort_acc_update_device_r4_2,gpufort_acc_update_device_r4_3,gpufort_acc_update_device_r4_4,gpufort_acc_update_device_r4_5,gpufort_acc_update_device_r4_6,gpufort_acc_update_device_r4_7,gpufort_acc_update_device_r8_0,gpufort_acc_update_device_r8_1,gpufort_acc_update_device_r8_2,gpufort_acc_update_device_r8_3,gpufort_acc_update_device_r8_4,gpufort_acc_update_device_r8_5,gpufort_acc_update_device_r8_6,gpufort_acc_update_device_r8_7,gpufort_acc_update_device_c4_0,gpufort_acc_update_device_c4_1,gpufort_acc_update_device_c4_2,gpufort_acc_update_device_c4_3,gpufort_acc_update_device_c4_4,gpufort_acc_update_device_c4_5,gpufort_acc_update_device_c4_6,gpufort_acc_update_device_c4_7,gpufort_acc_update_device_c8_0,gpufort_acc_update_device_c8_1,gpufort_acc_update_device_c8_2,gpufort_acc_update_device_c8_3,gpufort_acc_update_device_c8_4,gpufort_acc_update_device_c8_5,gpufort_acc_update_device_c8_6,gpufort_acc_update_device_c8_7 - end interface - - contains - - ! - ! autogenerated routines for different inputs - ! - - - function gpufort_acc_present_l_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),1_8) - end function - - function gpufort_acc_no_create_l_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),1_8,async,module_var) - end function - - function gpufort_acc_copy_l_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),1_8,async) - end function - - subroutine gpufort_acc_update_host_l_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_l_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*1_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_l_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*1_8) - end function - - function gpufort_acc_no_create_l_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_l_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_l_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copyout_l_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*1_8,async,module_var) - end function - - function gpufort_acc_copy_l_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*1_8,async) - end function - - subroutine gpufort_acc_update_host_l_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_l_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - logical,target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_i4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),4_8) - end function - - function gpufort_acc_no_create_i4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_i4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i4_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_i4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_i4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_i4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_i8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),8_8) - end function - - function gpufort_acc_no_create_i8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_i8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_i8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_i8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_i8_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_i8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_i8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_i8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_i8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_i8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - integer(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_r4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),4_8) - end function - - function gpufort_acc_no_create_r4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*4_8) - end function - - function gpufort_acc_no_create_r4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r4_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copyout_r4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*4_8,async,module_var) - end function - - function gpufort_acc_copy_r4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*4_8,async) - end function - - subroutine gpufort_acc_update_host_r4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_r8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),8_8) - end function - - function gpufort_acc_no_create_r8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_r8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_r8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*8_8) - end function - - function gpufort_acc_no_create_r8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_r8_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_r8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copyout_r8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*8_8,async,module_var) - end function - - function gpufort_acc_copy_r8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*8_8,async) - end function - - subroutine gpufort_acc_update_host_r8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_r8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - real(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_c4_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),2*4_8) - end function - - function gpufort_acc_no_create_c4_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c4_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*4_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*4_8) - end function - - function gpufort_acc_no_create_c4_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c4_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copyout_c4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*4_8,async,module_var) - end function - - function gpufort_acc_copy_c4_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*4_8,async) - end function - - subroutine gpufort_acc_update_host_c4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c4_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(4),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - function gpufort_acc_present_c8_0(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),2*8_8) - end function - - function gpufort_acc_no_create_c8_0(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_0(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_0(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_0(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_1(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_1(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_1(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_1(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_1(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_2(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_2(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_2(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_2(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_2(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_3(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_3(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_3(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_3(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_3(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_4(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_4(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_4(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_4(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_4(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_5(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_5(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_5(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_5(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_5(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_6(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_6(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_6(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_6(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_6(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - function gpufort_acc_present_c8_7(hostptr,async,copy,copyin,create,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),size(hostptr)*2*8_8,async,copy,copyin,create,module_var) - end function - - function gpufort_acc_create_c8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_create_b(c_loc(hostptr),size(hostptr)*2*8_8) - end function - - function gpufort_acc_no_create_c8_7(hostptr,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_no_create_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_no_create_b(c_loc(hostptr)) - end function - - subroutine gpufort_acc_delete_c8_7(hostptr,finalize,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_delete_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: finalize, module_var - ! - call gpufort_acc_delete_b(c_loc(hostptr),finalize,module_var) - end subroutine - - function gpufort_acc_copyin_c8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyin_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyin_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copyout_c8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copyout_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copyout_b(c_loc(hostptr),size(hostptr)*2*8_8,async,module_var) - end function - - function gpufort_acc_copy_c8_7(hostptr,async,module_var) result(deviceptr) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_copy_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: module_var - ! - type(c_ptr) :: deviceptr - ! - deviceptr = gpufort_acc_copy_b(c_loc(hostptr),size(hostptr)*2*8_8,async) - end function - - subroutine gpufort_acc_update_host_c8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_host_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(inout) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_host_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - subroutine gpufort_acc_update_device_c8_7(hostptr,condition,if_present,async,module_var) - use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_update_device_b - implicit none - complex(8),target,dimension(:,:,:,:,:,:,:),intent(in) :: hostptr - logical,intent(in),optional :: condition, if_present, module_var - integer,intent(in),optional :: async - ! - call gpufort_acc_update_device_b(c_loc(hostptr),condition,if_present,async,module_var) - end subroutine - - - - -end module \ No newline at end of file diff --git a/runtime/gpufort_acc_runtime/codegen/templates/gpufort_acc_runtime.template.f b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.template.f90 similarity index 97% rename from runtime/gpufort_acc_runtime/codegen/templates/gpufort_acc_runtime.template.f rename to runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.template.f90 index e2b30cc4..94bce277 100644 --- a/runtime/gpufort_acc_runtime/codegen/templates/gpufort_acc_runtime.template.f +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.template.f90 @@ -9,6 +9,8 @@ ! If this becomes an issue, use faster data structures or bind the public interfaces to ! a faster C runtime +#include "gpufort_acc_runtime.def" + module gpufort_acc_runtime use gpufort_acc_runtime_base @@ -243,18 +245,18 @@ module gpufort_acc_runtime {% set rank = '' %} {% endif %} {% set suffix = tuple[0] + "_" + dims|string %} - function gpufort_acc_present_{{suffix}}(hostptr,async,copy,copyin,create,module_var) result(deviceptr) + function gpufort_acc_present_{{suffix}}(hostptr,__PRESENT_OPTIONALS_DUMMY_ARGS) result(deviceptr) use iso_c_binding use gpufort_acc_runtime_base, only: gpufort_acc_present_b implicit none {{tuple[2]}},target{{ rank }},intent(in) :: hostptr - integer,intent(in),optional :: async - logical,intent(in),optional :: copy, copyin, create - logical,intent(in),optional :: module_var + integer,intent(in),optional :: async + logical,intent(in),optional :: module_var + logical,intent(in),optional :: copy, copyin, copyout, create ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,async,copy,copyin,create,module_var) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,__PRESENT_OPTIONALS_DUMMY_ARGS) end function function gpufort_acc_create_{{suffix}}(hostptr,module_var) result(deviceptr) @@ -355,4 +357,4 @@ subroutine gpufort_acc_update_device_{{suffix}}(hostptr,condition,if_present,asy {% endfor %} {% endfor %} -end module \ No newline at end of file +end module diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 index 96377ca6..2274c1fe 100644 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 @@ -1,8 +1,6 @@ ! SPDX-License-Identifier: MIT ! Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. -! TODO will be slow for large pointer storages -! If this becomes an issue, use faster data structures or bind the public interfaces to -! a faster C runtime +#include "gpufort_acc_runtime.def" #define blocked_size(num_bytes) ((((num_bytes)+BLOCK_SIZE-1)/BLOCK_SIZE) * BLOCK_SIZE) @@ -921,7 +919,7 @@ subroutine gpufort_acc_exit_region(unstructured,implicit_region) !> decremented. !> !> \note We just return the device pointer here and do not modify the counters. - function gpufort_acc_present_b(hostptr,num_bytes,async,module_var,copy,copyin,copyout,create) result(deviceptr) + function gpufort_acc_present_b(hostptr,num_bytes,__PRESENT_OPTIONALS_DUMMY_ARGS) result(deviceptr) use iso_fortran_env use iso_c_binding use gpufort_acc_runtime_c_bindings @@ -944,12 +942,12 @@ function gpufort_acc_present_b(hostptr,num_bytes,async,module_var,copy,copyin,co if ( .not. c_associated(hostptr) ) then ERROR STOP "gpufort_acc_present_b: hostptr not c_associated" else - loc = record_list_%find_record(hostptr,success) + loc = record_list_%find_record(hostptr,success) ! TODO already detect a suitable candidate here on-the-fly if ( success ) then fits = is_subarray(record_list_%records(loc)%hostptr,record_list_%records(loc)%num_bytes,hostptr,num_bytes,offset_bytes) deviceptr = inc_cptr(record_list_%records(loc)%deviceptr,offset_bytes) else - if ( eval_opt_logical_(copy,.false.) ) then + if ( eval_opt_logical_(copy,.false.) ) then deviceptr = gpufort_acc_copy_b(hostptr,num_bytes,async,module_var) else if ( eval_opt_logical_(create,.false.) ) then deviceptr = gpufort_acc_create_b(hostptr,num_bytes,async,module_var) diff --git a/runtime/gpufort_acc_runtime/test/Makefile b/runtime/gpufort_acc_runtime/test/Makefile index 1f5c1245..1c5880c2 100644 --- a/runtime/gpufort_acc_runtime/test/Makefile +++ b/runtime/gpufort_acc_runtime/test/Makefile @@ -12,4 +12,4 @@ $(TEST): %: %.f90 $(FC) $< $(FCFLAGS) $(LD_FLAGS) -o $@ clean: - rm -f $(TEST) \ No newline at end of file + rm -f $(TEST) diff --git a/runtime/gpufort_acc_runtime/test/test.f90 b/runtime/gpufort_acc_runtime/test/test_c_ptr_association.f90 similarity index 100% rename from runtime/gpufort_acc_runtime/test/test.f90 rename to runtime/gpufort_acc_runtime/test/test_c_ptr_association.f90 diff --git a/runtime/gpufort_acc_runtime/test/test_optional_values.f90 b/runtime/gpufort_acc_runtime/test/test_optional_values.f90 new file mode 100644 index 00000000..44f5ba6c --- /dev/null +++ b/runtime/gpufort_acc_runtime/test/test_optional_values.f90 @@ -0,0 +1,29 @@ +program test_optvals + implicit none + + print *, caller() + print *, caller(optval=.false.) + print *, caller(optval=.true.) + +contains + + function caller(optval) result(retval) + implicit none + logical,optional,intent(in) :: optval + logical :: retval + retval = eval_opt_logical_(optval,.false.) + end function + + function eval_opt_logical_(optval,fallback) result(retval) + implicit none + logical,optional,intent(in) :: optval + logical,intent(in) :: fallback + logical :: retval + if ( present(optval) ) then + retval = optval + else + retval = fallback + endif + end function + +end program test_optvals From ad9381524016116e2eacdb983108893313ae992a Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 4 Nov 2021 12:18:28 -0400 Subject: [PATCH 25/67] REFACTOR/gpufort_acc_rt: Combine 4 opt args into enum arg --- .../scanner_tree_acc2hipgpufortrt.py.in | 22 ++--- .../src/gpufort_acc_runtime.template.f90 | 11 +-- .../src/gpufort_acc_runtime_base.f90 | 89 ++++++++++++------- 3 files changed, 75 insertions(+), 47 deletions(-) diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index 5e738f6d..d9437af7 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -53,10 +53,10 @@ def add_implicit_region(stcontainer): last_decl_list_node = stcontainer.last_entry_in_decl_list() indent = last_decl_list_node.first_line_indent() last_decl_list_node.add_to_epilog(HIP_GPUFORT_RT_ACC_ENTER_REGION.format(\ - indent=indent,region_kind="implicit_region=.TRUE.")) + indent=indent,region_kind="implicit_region=.true.")) for stendorreturn in stcontainer.return_or_end_statements(): stendorreturn.add_to_prolog(HIP_GPUFORT_RT_ACC_EXIT_REGION.format(\ - indent=indent,region_kind="implicit_region=.TRUE.")) + indent=indent,region_kind="implicit_region=.true.")) class Acc2HipGpufortRT(AccBackendBase): # clauses @@ -172,7 +172,7 @@ class Acc2HipGpufortRT(AccBackendBase): ## Enter region commands must come first emit_enter_region = stnode.is_enter_data_directive() if emit_enter_region: - region_kind="region_kind=.TRUE." + region_kind="unstructured=.true." else: region_kind="" emit_enter_region = emit_enter_region or stnode.is_data_directive() @@ -197,7 +197,7 @@ class Acc2HipGpufortRT(AccBackendBase): ## Exit region commands must come last emit_exit_region = stnode.is_exit_data_directive() if emit_exit_region: - region_kind="region_kind=.TRUE." + region_kind="unstructured=.true." else: region_kind="" emit_exit_region = emit_exit_region or (stnode.is_end_directive() and stnode.find_substring("kernels") and not stnode.find_substring("loop")) @@ -247,7 +247,7 @@ class AccLoopKernel2HipGpufortRT(Acc2HipGpufortRT): deviceptr = dev_var_name(var_expr) if not deviceptr in temp_vars: temp_vars.append(deviceptr) - result += template.format(indent=indent,var=var_expr,asyncr="",alloc=",copy=.TRUE.",dev_var=deviceptr) + result += template.format(indent=indent,var=var_expr,asyncr="",alloc=",or=gpufort_acc_event_copy",dev_var=deviceptr) return result, len(result), temp_vars def transform(self,joined_lines,joined_statements,statements_fully_cover_lines,index=[]): @@ -314,7 +314,7 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): is_pointer = "pointer" in ivar["qualifiers"] if not is_allocatable: if not is_used_module_var: implicit_region = True - module_var = ",module_var=.TRUE." if is_used_module_var else "" + module_var = ",module_var=.true." if is_used_module_var else "" if is_pointer: cond = "{indent}if (associated({var})) " acc_present_template = (cond+HIP_GPUFORT_RT_ACC_PRESENT.replace("{indent}","")) @@ -325,7 +325,7 @@ class Acc2HipGpufortRTPostprocess(AccPostprocessBackendBase): map_kind=HIP_GPUFORT_RT_CLAUSES_OMP2ACC[ivar["declare_on_target"]] acc_present_calls += acc_present_template.format(\ indent=indent,var=host_var,asyncr="",\ - alloc=module_var+","+map_kind+"=.TRUE.",dev_var=dev_var) + alloc=module_var+",or=gpufort_acc_event_"+map_kind,dev_var=dev_var) temp_vars.append(dev_var) if len(acc_present_calls): stcontainer.append_vars_to_decl_list(temp_vars) @@ -354,13 +354,13 @@ def AllocateHipGpufortRT(stallocate,index): is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ "pointer" in ivar["qualifiers"] assert is_allocatable_or_pointer - module_var = ",module_var=.TRUE." if is_used_module_var else "" + module_var = ",module_var=.true." if is_used_module_var else "" if not is_used_module_var: implicit_region = True if ivar["declare_on_target"] in HIP_GPUFORT_RT_CLAUSES_OMP2ACC.keys(): map_kind=HIP_GPUFORT_RT_CLAUSES_OMP2ACC[ivar["declare_on_target"]] acc_present_calls.append(HIP_GPUFORT_RT_ACC_PRESENT.format(\ indent=indent,var=host_var,asyncr="",\ - alloc=module_var+","+map_kind+"=.TRUE.",dev_var=dev_var)) + alloc=module_var+",or=gpufort_acc_event_"+map_kind,dev_var=dev_var)) temp_vars.append(dev_var) if len(acc_present_calls): @@ -386,7 +386,7 @@ def DeallocateHipGpufortRT(stdeallocate,index): is_allocatable_or_pointer = "allocatable" in ivar["qualifiers"] or\ "pointer" in ivar["qualifiers"] assert is_allocatable_or_pointer - module_var = ",module_var=.TRUE." if is_used_module_var else "" + module_var = ",module_var=.true." if is_used_module_var else "" if ivar["declare_on_target"] in ["alloc","to","tofrom"]: acc_delete_calls.append(HIP_GPUFORT_RT_ACC_DELETE.format(\ indent=indent,var=host_var,asyncr="",finalize="",\ @@ -399,4 +399,4 @@ register_acc_backend("hip-gpufort-rt",\ Acc2HipGpufortRTPostprocess,\ AllocateHipGpufortRT,\ DeallocateHipGpufortRT,\ - "gpufort_acc_runtime") + "gpufort_acc_runtime") \ No newline at end of file diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.template.f90 b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.template.f90 index 94bce277..32556317 100644 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.template.f90 +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime.template.f90 @@ -245,18 +245,19 @@ module gpufort_acc_runtime {% set rank = '' %} {% endif %} {% set suffix = tuple[0] + "_" + dims|string %} - function gpufort_acc_present_{{suffix}}(hostptr,__PRESENT_OPTIONALS_DUMMY_ARGS) result(deviceptr) + function gpufort_acc_present_{{suffix}}(hostptr,module_var,or,async) result(deviceptr) use iso_c_binding - use gpufort_acc_runtime_base, only: gpufort_acc_present_b + use gpufort_acc_runtime_base, only: gpufort_acc_present_b, gpufort_acc_event_undefined implicit none {{tuple[2]}},target{{ rank }},intent(in) :: hostptr - integer,intent(in),optional :: async logical,intent(in),optional :: module_var - logical,intent(in),optional :: copy, copyin, copyout, create + integer(kind(gpufort_acc_event_undefined)),& + intent(in),optional :: or + integer,intent(in),optional :: async ! type(c_ptr) :: deviceptr ! - deviceptr = gpufort_acc_present_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,__PRESENT_OPTIONALS_DUMMY_ARGS) + deviceptr = gpufort_acc_present_b(c_loc(hostptr),{{size}}{{tuple[1]}}_8,module_var,or,async) end function function gpufort_acc_create_{{suffix}}(hostptr,module_var) result(deviceptr) diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 index 2274c1fe..11bea0d8 100644 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 @@ -19,8 +19,14 @@ module gpufort_acc_runtime_base public :: gpufort_acc_runtime_print_summary public :: gpufort_acc_runtime_record_exists, gpufort_acc_runtime_get_record_id + + public :: gpufort_acc_event_undefined,& + gpufort_acc_event_create,& + gpufort_acc_event_copyin,& + gpufort_acc_event_copyout,& + gpufort_acc_event_copy - PRIVATE ! Everything else is private + PRIVATE ! Everything below and not listed above as public is private ! ! members @@ -37,15 +43,15 @@ module gpufort_acc_runtime_base integer, save :: record_creation_counter_ = 0 logical, save :: initialized_ = .false. integer, save :: last_queue_index_ = 0 - + !> Creational events for a record - enum, bind(c) + enum, bind(c) enumerator :: gpufort_acc_event_undefined = 0 enumerator :: gpufort_acc_event_create = 1 enumerator :: gpufort_acc_event_copyin = 2 enumerator :: gpufort_acc_event_copyout = 3 enumerator :: gpufort_acc_event_copy = 4 - end enum + end enum !> Data structure that maps a host to a device pointer. type :: t_record @@ -107,9 +113,14 @@ module gpufort_acc_runtime_base type(t_record_list),save :: record_list_ type(t_queue),allocatable,save :: queues_(:) + !> evaluate optional values + interface eval_optval_ + module procedure :: eval_optval_1_, eval_optval_2_ + end interface + contains - function eval_opt_logical_(optval,fallback) result(retval) + function eval_optval_1_(optval,fallback) result(retval) implicit none logical,optional,intent(in) :: optval logical,intent(in) :: fallback @@ -121,7 +132,7 @@ function eval_opt_logical_(optval,fallback) result(retval) endif end function - function eval_opt_integer_(optval,fallback) result(retval) + function eval_optval_2_(optval,fallback) result(retval) implicit none integer,optional,intent(in) :: optval integer,intent(in) :: fallback @@ -133,6 +144,18 @@ function eval_opt_integer_(optval,fallback) result(retval) endif end function + !function eval_optval_3_(optval,fallback) result(retval) + ! implicit none + ! integer(kind(gpufort_acc_event_undefined)),optional,intent(in) :: optval + ! integer(kind(gpufort_acc_event_undefined)),intent(in) :: fallback + ! integer(kind(gpufort_acc_event_undefined)) :: retval + ! if ( present(optval) ) then + ! retval = optval + ! else + ! retval = fallback + ! endif + !end function + ! ! debugging/analysis ! @@ -507,7 +530,7 @@ function t_record_decrement_num_refs_(record,threshold) result(ret) ! record%num_refs = record%num_refs - 1 - ret = record%num_refs <= eval_opt_integer_(threshold,0) + ret = record%num_refs <= eval_optval_(threshold,0) end function ! @@ -672,7 +695,7 @@ function t_record_list_use_increment_record_(record_list,hostptr,num_bytes,creat ! call record_list%records(loc)%setup(hostptr,& num_bytes,creational_event,record_list%current_region,reuse_existing) - if ( eval_opt_logical_(module_var,.false.) ) record_list%records(loc)%region = 0 + if ( eval_optval_(module_var,.false.) ) record_list%records(loc)%region = 0 if ( creational_event .eq. gpufort_acc_event_copyin .or. & creational_event .eq. gpufort_acc_event_copy ) & call record_list%records(loc)%copy_to_device(async) @@ -919,7 +942,7 @@ subroutine gpufort_acc_exit_region(unstructured,implicit_region) !> decremented. !> !> \note We just return the device pointer here and do not modify the counters. - function gpufort_acc_present_b(hostptr,num_bytes,__PRESENT_OPTIONALS_DUMMY_ARGS) result(deviceptr) + function gpufort_acc_present_b(hostptr,num_bytes,module_var,or,async) result(deviceptr) use iso_fortran_env use iso_c_binding use gpufort_acc_runtime_c_bindings @@ -927,17 +950,20 @@ function gpufort_acc_present_b(hostptr,num_bytes,__PRESENT_OPTIONALS_DUMMY_ARGS) type(c_ptr),intent(in) :: hostptr integer(c_size_t),intent(in) :: num_bytes !logical,intent(in),optional :: exiting - integer,intent(in),optional :: async logical,intent(in),optional :: module_var - logical,intent(in),optional :: copy, copyin, copyout, create + integer(kind(gpufort_acc_event_undefined)),& + intent(in),optional :: or + integer,intent(in),optional :: async ! type(c_ptr) :: deviceptr ! integer(c_size_t) :: offset_bytes logical :: success, fits + integer(kind(gpufort_acc_event_undefined)) & + :: opt_or integer :: loc, num_lists_to_check ! - if ( .not. initialized_ .and. eval_opt_logical_(module_var,.false.) ) call gpufort_acc_init() + if ( .not. initialized_ .and. eval_optval_(module_var,.false.) ) call gpufort_acc_init() if ( .not. initialized_ ) ERROR STOP "gpufort_acc_present_b: runtime not initialized" if ( .not. c_associated(hostptr) ) then ERROR STOP "gpufort_acc_present_b: hostptr not c_associated" @@ -947,19 +973,21 @@ function gpufort_acc_present_b(hostptr,num_bytes,__PRESENT_OPTIONALS_DUMMY_ARGS) fits = is_subarray(record_list_%records(loc)%hostptr,record_list_%records(loc)%num_bytes,hostptr,num_bytes,offset_bytes) deviceptr = inc_cptr(record_list_%records(loc)%deviceptr,offset_bytes) else - if ( eval_opt_logical_(copy,.false.) ) then - deviceptr = gpufort_acc_copy_b(hostptr,num_bytes,async,module_var) - else if ( eval_opt_logical_(create,.false.) ) then - deviceptr = gpufort_acc_create_b(hostptr,num_bytes,async,module_var) - else if ( eval_opt_logical_(copyin,.false.) ) then - deviceptr = gpufort_acc_copyin_b(hostptr,num_bytes,async,module_var) - else if ( eval_opt_logical_(copyout,.false.) ) then - deviceptr = gpufort_acc_copyout_b(hostptr,num_bytes,async,module_var) - else - print *, "ERROR: did not find record for hostptr:" - CALL print_cptr(hostptr) - ERROR STOP "gpufort_acc_present_b: no record found for hostptr" - endif + opt_or = eval_optval_(or,gpufort_acc_event_undefined) + select case (opt_or) + case (gpufort_acc_event_copy) + deviceptr = gpufort_acc_copy_b(hostptr,num_bytes,async,module_var) + case (gpufort_acc_event_create) + deviceptr = gpufort_acc_create_b(hostptr,num_bytes,async,module_var) + case (gpufort_acc_event_copyin) + deviceptr = gpufort_acc_copyin_b(hostptr,num_bytes,async,module_var) + case (gpufort_acc_event_copyout) + deviceptr = gpufort_acc_copyout_b(hostptr,num_bytes,async,module_var) + case default + print *, "ERROR: did not find record for hostptr:" + CALL print_cptr(hostptr) + ERROR STOP "gpufort_acc_present_b: no record found for hostptr" + end select endif if ( LOG_LEVEL > 0 ) then write(output_unit,fmt="(a)",advance="no") "[gpufort-rt][1] gpufort_acc_present_b: retrieved deviceptr=" @@ -1005,10 +1033,9 @@ function gpufort_acc_create_b(hostptr,num_bytes,async,module_var) result(devicep logical,intent(in),optional :: module_var type(c_ptr) :: deviceptr ! - logical :: opt_module_var integer :: loc ! - if ( .not. initialized_ .and. eval_opt_logical_(module_var,.false.) ) call gpufort_acc_init() + if ( .not. initialized_ .and. eval_optval_(module_var,.false.) ) call gpufort_acc_init() if ( .not. initialized_ ) ERROR STOP "gpufort_acc_create_b: runtime not initalized" if ( .not. c_associated(hostptr) ) then ERROR STOP "gpufort_acc_create_b: hostptr not c_associated" @@ -1118,7 +1145,7 @@ function gpufort_acc_copyin_b(hostptr,num_bytes,async,module_var) result(devicep ! integer :: loc ! - if ( .not. initialized_ .and. eval_opt_logical_(module_var,.false.) ) call gpufort_acc_init() + if ( .not. initialized_ .and. eval_optval_(module_var,.false.) ) call gpufort_acc_init() if ( .not. initialized_ ) ERROR STOP "gpufort_acc_copyin_b: runtime not initialized" if ( .not. c_associated(hostptr) ) then #ifndef NULLPTR_MEANS_NOOP @@ -1160,7 +1187,7 @@ function gpufort_acc_copyout_b(hostptr,num_bytes,async,module_var) result(device ! integer :: loc ! - if ( .not. initialized_ .and. eval_opt_logical_(module_var,.false.) ) call gpufort_acc_init() + if ( .not. initialized_ .and. eval_optval_(module_var,.false.) ) call gpufort_acc_init() if ( .not. initialized_ ) ERROR STOP "gpufort_acc_copyout_b: runtime not initialized" if ( .not. c_associated(hostptr) ) then #ifndef NULLPTR_MEANS_NOOP @@ -1197,7 +1224,7 @@ function gpufort_acc_copy_b(hostptr,num_bytes,async,module_var) result(deviceptr ! integer :: loc ! - if ( .not. initialized_ .and. eval_opt_logical_(module_var,.false.) ) call gpufort_acc_init() + if ( .not. initialized_ .and. eval_optval_(module_var,.false.) ) call gpufort_acc_init() if ( .not. initialized_ ) ERROR STOP "gpufort_acc_copy_b: runtime not initialized" if ( .not. c_associated(hostptr) ) then #ifndef NULLPTR_MEANS_NOOP @@ -1329,4 +1356,4 @@ subroutine gpufort_acc_update_device_b(hostptr,condition,if_present,async,module endif end subroutine -end module +end module \ No newline at end of file From bea2ac0e8aab0c9004d2f971593dc1ab3faa412a Mon Sep 17 00:00:00 2001 From: sael9740 Date: Fri, 5 Nov 2021 10:39:05 -0400 Subject: [PATCH 26/67] gpufort_options: Change default of DUMP_LINEMAPS: False --- python/gpufort_options.py.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/gpufort_options.py.in b/python/gpufort_options.py.in index 66ce03f1..dc901768 100644 --- a/python/gpufort_options.py.in +++ b/python/gpufort_options.py.in @@ -41,6 +41,6 @@ PROFILING_ENABLE = False PROFILING_OUTPUT_NUM_FUNCTIONS = 50 # Number of functions to output when profiling GPUFORT -DUMP_LINEMAPS = True +DUMP_LINEMAPS = False # Write the lines-to-statements mappings to disk before & after # applying code transformations; suffix="-linemaps-(pre|post).json" From bec6a16c1dd711db4a19ccd78ad3426d2d2e9f90 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Tue, 9 Nov 2021 11:09:37 -0500 Subject: [PATCH 27/67] WiP on array descriptor structs: Add C++ datatypes and tests. * inner struct, which is passed to kernels, gpufort::GpuArray{rank}, stores pointers and array metadata required for indexing * outer struct, which stays on host, gpufort::MappedArray{rank} has attributes and methods for allocating and copying data from host to device. Further stores a HIP stream (default: nullptr). * structs are constructed from a hostptr and/or device ptr (both might be nullptr) plus array lower bounds and number of elements per dimension * structs overload operator() for accessing host (host compile) or device data (device compile) using the same syntax as in Fortran Next: * Generate Fortran and extern "C" interfaces for creating & modifying structs from Fortran side. --- python/fort2hip/fort2hip.py | 13 +- python/fort2hip/fort2hip_options.py.in | 6 +- python/fort2hip/model.py | 24 +- ...{Gpufort.template.h => gpufort.template.h} | 1 + .../templates/gpufort_arrays.template.h | 256 ++++++++++++++++++ ...mplate.h => gpufort_reductions.template.h} | 3 +- ...te.cpp => hip_implementation.template.cpp} | 0 ...late.f03 => interface_module.template.f03} | 0 ...f03 => interface_module_test.template.f03} | 0 .../scanner_tree_acc2hipgpufortrt.py.in | 2 +- test/gpufort_headers/Makefile | 13 + .../test_compile_headers.hip.cpp | 7 + .../test_gpufort_arrays.hip.cpp | 84 ++++++ 13 files changed, 398 insertions(+), 11 deletions(-) rename python/fort2hip/templates/{Gpufort.template.h => gpufort.template.h} (98%) create mode 100644 python/fort2hip/templates/gpufort_arrays.template.h rename python/fort2hip/templates/{GpufortReductions.template.h => gpufort_reductions.template.h} (96%) rename python/fort2hip/templates/{HipImplementation.template.cpp => hip_implementation.template.cpp} (100%) rename python/fort2hip/templates/{InterfaceModule.template.f03 => interface_module.template.f03} (100%) rename python/fort2hip/templates/{InterfaceModuleTest.template.f03 => interface_module_test.template.f03} (100%) create mode 100644 test/gpufort_headers/Makefile create mode 100644 test/gpufort_headers/test_compile_headers.hip.cpp create mode 100644 test/gpufort_headers/test_gpufort_arrays.hip.cpp diff --git a/python/fort2hip/fort2hip.py b/python/fort2hip/fort2hip.py index e3fba71e..0d7862d1 100644 --- a/python/fort2hip/fort2hip.py +++ b/python/fort2hip/fort2hip.py @@ -592,18 +592,27 @@ def _intrnl_create_includes_from_used_modules(index_record,index): def generate_gpufort_headers(output_dir): """Create the header files that all GPUFORT HIP kernels rely on.""" + global LOG_PREFIX + global GPUFORT_HEADERS_MAX_DIM + utils.logging.log_enter_function(LOG_PREFIX,"_intrnl_render_templates",\ {"output_dir": output_dir}) - gpufort_header_file_path = output_dir + "/gpufort.h" + gpufort_header_file_path = os.path.join(output_dir,"gpufort.h") model.GpufortHeaderModel().generate_file(gpufort_header_file_path) msg = "created gpufort main header: ".ljust(40) + gpufort_header_file_path utils.logging.log_info(LOG_PREFIX,"_intrnl_render_templates",msg) - gpufort_reductions_header_file_path = output_dir + "/gpufort_reductions.h" + gpufort_reductions_header_file_path = os.path.join(output_dir, "gpufort_reductions.h") model.GpufortReductionsHeaderModel().generate_file(gpufort_reductions_header_file_path) msg = "created gpufort reductions header file: ".ljust(40) + gpufort_reductions_header_file_path utils.logging.log_info(LOG_PREFIX,"_intrnl_render_templates",msg) + + gpufort_arrays_header_file_path = os.path.join(output_dir,"gpufort_arrays.h") + model.GpufortArraysHeaderModel().generate_file(gpufort_arrays_header_file_path,\ + context={"max_rank":GPUFORT_HEADERS_MAX_DIM}) + msg = "created gpufort arrays header file: ".ljust(40) + gpufort_arrays_header_file_path + utils.logging.log_info(LOG_PREFIX,"_intrnl_render_templates",msg) utils.logging.log_leave_function(LOG_PREFIX,"generate_gpufort_headers") diff --git a/python/fort2hip/fort2hip_options.py.in b/python/fort2hip/fort2hip_options.py.in index d1890c62..1689d7cd 100644 --- a/python/fort2hip/fort2hip_options.py.in +++ b/python/fort2hip/fort2hip_options.py.in @@ -40,4 +40,8 @@ PRETTIFY_EMITTED_FORTRAN_CODE = False PRETTIFY_EMITTED_C_CODE = False # Prettify the emitted HIP C++ code with clang-format. CLANG_FORMAT_STYLE="\"{BasedOnStyle: llvm, ColumnLimit: 140, BinPackArguments: false, BinPackParameters: false, AllowAllArgumentsOnNextLine: false, AllowAllParametersOfDeclarationOnNextLine: false}\"" - # Format style that is passed to clang-format \ No newline at end of file + # Format style that is passed to clang-format + +GPUFORT_HEADERS_MAX_DIM = 7 + # Generate rank-dependent classes and expresions up to + # this dimension. diff --git a/python/fort2hip/model.py b/python/fort2hip/model.py index b4fd2ad5..9ed0e6a6 100644 --- a/python/fort2hip/model.py +++ b/python/fort2hip/model.py @@ -27,25 +27,37 @@ def generate_file(self,output_file_path,context={}): class HipImplementationModel(BaseModel): def __init__(self): - BaseModel.__init__(self,"templates/HipImplementation.template.cpp") + BaseModel.__init__(self,"templates/hip_implementation.template.cpp") class InterfaceModuleModel(BaseModel): def __init__(self): - BaseModel.__init__(self,"templates/InterfaceModule.template.f03") + BaseModel.__init__(self,"templates/interface_module.template.f03") class InterfaceModuleTestModel(BaseModel): def __init__(self): - BaseModel.__init__(self,"templates/InterfaceModuleTest.template.f03") + BaseModel.__init__(self,"templates/interface_module_test.template.f03") class GpufortHeaderModel(BaseModel): def __init__(self): - BaseModel.__init__(self,"templates/Gpufort.template.h") + BaseModel.__init__(self,"templates/gpufort.template.h") class GpufortReductionsHeaderModel(BaseModel): def __init__(self): - BaseModel.__init__(self,"templates/GpufortReductions.template.h") + BaseModel.__init__(self,"templates/gpufort_reductions.template.h") + +class GpufortArraysHeaderModel(BaseModel): + def __init__(self): + BaseModel.__init__(self,"templates/gpufort_arrays.template.h") + +class GpufortArraysFortranInterfaceModel(BaseModel): + def __init__(self): + BaseModel.__init__(self,"templates/gpufort_arrays.template.f90") #model = GpufortHeaderModel() #model.generate_file("gpufort.h") #model = GpufortReductionsHeaderModel() -#model.generate_file("gpufort_reductions.h") \ No newline at end of file +#model.generate_file("gpufort_reductions.h") + +#model_c = GpufortArraysModel().generate_file("gpufort_arrays.h", +# context={"max_rank":7}) +#model_f = GpufortArraysFortranInterfaceModel().generate_file("gpufort_arrays.f90") diff --git a/python/fort2hip/templates/Gpufort.template.h b/python/fort2hip/templates/gpufort.template.h similarity index 98% rename from python/fort2hip/templates/Gpufort.template.h rename to python/fort2hip/templates/gpufort.template.h index 7b7574ca..c1d24676 100644 --- a/python/fort2hip/templates/Gpufort.template.h +++ b/python/fort2hip/templates/gpufort.template.h @@ -42,6 +42,7 @@ i{{rank}} {%- endfor %} {%- endmacro -%} {# template body #} +// This file was generated from a template via gpufort --gpufort-create-headers #ifndef _GPUFORT_H_ #define _GPUFORT_H_ #include "hip/hip_complex.h" diff --git a/python/fort2hip/templates/gpufort_arrays.template.h b/python/fort2hip/templates/gpufort_arrays.template.h new file mode 100644 index 00000000..7a0c0161 --- /dev/null +++ b/python/fort2hip/templates/gpufort_arrays.template.h @@ -0,0 +1,256 @@ +{# SPDX-License-Identifier: MIT #} +{# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} +{%- macro separated_list_single_line(prefix,sep,rank) -%} +{% for d in range(1,rank+1) -%} +{{prefix}}{{d}}{{ sep if not loop.last }}{%- endfor %} +{%- endmacro -%} +{%- macro separated_list(prefix,sep,rank) -%} +{% for d in range(1,rank+1) -%} +{{prefix}}{{d}}{{ sep+"\n" if not loop.last }} +{%- endfor %} +{%- endmacro -%} +{%- macro arglist(prefix,rank) -%} +{{ separated_list(prefix,",",rank) }} +{%- endmacro -%} +{%- macro bound_args(prefix,rank) -%} +{{ arglist(prefix+"n",rank) }}, +{{ arglist(prefix+"lb",rank) }} +{%- endmacro -%} +// This file was generated from a template via gpufort --gpufort-create-headers +#ifndef _GPUFORT_ARRAYS_H_ +#define _GPUFORT_ARRAYS_H_ +#include +#ifndef _GPUFORT_H_ +#include +#include +#define HIP_CHECK(condition) \ + { \ + hipError_t error = condition; \ + if(error != hipSuccess){ \ + std::cout << "HIP error: " << error << " line: " << __LINE__ << std::endl; \ + exit(error); \ + } \ + } +#endif +namespace gpufort { +{% for rank in range(1,max_rank+1) %} +{% set rank_ub = rank+1 %} + /** + * Intended to be passed as kernel launch parameter. + */ + template + struct GpuArray{{rank}} { + T* data_host = nullptr; + T* data_dev = nullptr; + size_t num_elements = 0; //> Number of represented by this array. + int index_offset = -1; //> Offset for index calculation; scalar product of negative lower bounds and strides. +{% for d in range(1,rank_ub) %} + size_t stride{{d}} = -1; //> Strides for linearizing {{rank}}-dimensional index. +{% endfor %} + + /** + * Wrap a host-device pointer pair and store the associated + * array meta data. + * + * \param[in] data_host host data pointer. + * \param[in] data_dev device data pointer. + * \param[in] n1,n2,... element counts per dimension of the multi-dim. array + * \param[in] lb1,lb2,... lower bounds, i.e. the index of the first element per dimension of the multi-dim. array + */ + __host__ __device__ void wrap( + T* data_host, + T* data_dev, +{{ bound_args("int ",rank) | indent(8,True) }} + ) { + this->data_host = data_host; + this->data_dev = data_dev; + // column-major access + this->num_elements = {{ separated_list_single_line("n","*",rank) }}; +{% for d in range(1,rank_ub) %} + this->stride{{d}} = 1{%- for e in range(1,d) -%}*n{{e}}{%- endfor %}; +{% endfor %} + this->index_offset = +{% for d in range(1,rank_ub) %} + -lb{{d}}*this->stride{{d}}{{";" if loop.last}} +{% endfor %} + } + + /** + * Linearize multi-dimensional index. + * + * \param[in] i1,i2,... multi-dimensional array index. + */ + __host__ __device__ __forceinline__ int linearized_index ( +{{ arglist("const int i",rank) | indent(6,"True") }} + ) { + return this->index_offset +{% for d in range(1,rank_ub) %} + + i{{d}}*this->stride{{d}} +{% endfor %} + ; + } + + /** + * \return Element at given index. + * \param[in] i1,i2,... multi-dimensional array index. + */ + __host__ __device__ __forceinline__ T& operator() ( +{{ arglist("const int i",rank) | indent(6,"True") }} + ) { + const int index = linearized_index( +{{ separated_list_single_line("i",",",rank) | indent(8,"True") }} + ); + #if __HIP_DEVICE_COMPILE__ + return this->data_dev[index]; + #else + return this->data_host[index]; + #endif + } + }; + + template + struct MappedArray{{rank}}{ + GpuArray{{rank}} data; + hipStream_t stream = nullptr; + bool pinned = false; //> If the host data is pinned. + bool copyout_at_destruction = false; //> If the device data should be copied back to the host when this struct is destroyed. + bool owns_host_data = false; //> If this is only a wrapper, i.e. no memory management is performed. + bool owns_device_data = false; //> If this is only a wrapper, i.e. no memory management is performed. + int ref_ctr = 0; //> Number of references. + + /** + * Initialize. + * \param[in] data_host host data pointer (may be nullptr; see the note). + * \param[in] pinned the host array is pinned or should be pinned. + * \param[in] copyout_at_destruction copy data out from the + * device to the host when this instance gets destroyed. + * \note Allocates a new host_data pointer if the + * passed pointer is a nullptr. If the pinned argument is true, + * the new hostpotr is allocated via hipHostMalloc. + * Otherwise, it is allocated via classic malloc. + */ + __host__ hipError_t init( + T* data_host, + T* data_dev, +{{ bound_args("int ",rank) | indent(8,True) }}, + bool pinned, + hipStream_t stream = nullptr, + bool copyout_at_destruction = false) { + hipError_t ierr = hipSuccess; + this->data.wrap( + data_host, + data_dev, +{{ bound_args("",rank) | indent(10,True) }} + ); + this->stream = stream; + this->pinned = pinned; + this->copyout_at_destruction = copyout_at_destruction; + this->owns_host_data = data_host == nullptr; + this->owns_device_data = data_dev == nullptr; + if ( this->owns_host_data && pinned ) { + ierr = hipHostMalloc((void**) &this->data.data_host,this->num_data_bytes(),0); + } else if ( this->owns_host_data ) { + this->data.data_host = (T*) malloc(this->num_data_bytes()); + } + if ( ierr == hipSuccess && this->owns_device_data ) { + ierr = hipMalloc((void**) &this->data.data_dev, this->num_data_bytes()); + } + return ierr; + } + + MappedArray{{rank}}() { + // do nothing + } + + ~MappedArray{{rank}}() { + HIP_CHECK(this->destroy()); + } + + /** + * Destroy associated host and device data + * if this is not a wrapper. Depending + * on the pinned attribue, hipHostFree + * is used instead of free to deallocate + * the host data. + */ + __host__ hipError_t destroy() { + hipError_t ierr = hipSuccess; + #ifndef __HIP_DEVICE_COMPILE__ + if ( this->owns_host_data && this->data.data_host != nullptr ) { + if ( this->pinned ) { + ierr = hipHostFree(this->data.data_host); + } else { + free(this->data.data_host); + } + } + if ( ierr == hipSuccess ) { + if ( this->owns_device_data && this->data.data_dev != nullptr ) { + ierr = hipFree(this->data.data_dev); + } + } + #endif + return ierr; + } + + __host__ size_t num_data_bytes() { + return this->data.num_elements * sizeof(T); + } + + /** + * Copy host data to the device. + * \return Array code returned by the underlying hipMemcpy operation. + */ + __host__ hipError_t copy_data_to_host() { + return hipMemcpyAsync( + (void*) this->data.data_host, + (void*) this->data.data_dev, + this->num_data_bytes(), + hipMemcpyDeviceToHost,this->stream); + } + + /** + * Copy device data to the host. + * \return Array code returned by the underlying hipMemcpy operation. + */ + __host__ hipError_t copy_data_to_device() { + return hipMemcpyAsync( + (void*) this->data.data_dev, + (void*) this->data.data_host, + this->num_data_bytes(), + hipMemcpyHostToDevice,this->stream); + } + + /** + * Copies the struct to the device but + * does not touch the data associated with + * data_dev & data_host (shallow copy). + * \param[inout] device_copy pointer to device copy pointer + */ + __host__ hipError_t create_device_copy(void** device_copy) { + const size_t size = sizeof(MappedArray{{rank}}); + hipError_t ierr = hipMalloc(device_copy,size); + if ( ierr == hipSuccess ) { + ierr = hipMemcpyH2DAsync( + (void*) *device_copy, + (void*) this, + size, this->stream); + } + return ierr; + } + + /** + * \return Element at given index. + * \param[in] i1,i2,... multi-dimensional array index. + */ + __host__ T& operator() ( +{{ arglist("const int i",rank) | indent(6,"True") }} + ) { + return this->data( +{{ separated_list_single_line("i",",",rank) | indent(8,"True") }} + ); + } + }; +{{ "" if not loop.last }} +{% endfor -%} +} +#endif // _GPUFORT_ARRAYS_H_ diff --git a/python/fort2hip/templates/GpufortReductions.template.h b/python/fort2hip/templates/gpufort_reductions.template.h similarity index 96% rename from python/fort2hip/templates/GpufortReductions.template.h rename to python/fort2hip/templates/gpufort_reductions.template.h index 9ef65552..791560f6 100644 --- a/python/fort2hip/templates/GpufortReductions.template.h +++ b/python/fort2hip/templates/gpufort_reductions.template.h @@ -1,5 +1,6 @@ {# SPDX-License-Identifier: MIT #} {# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} +// This file was generated from a template via gpufort --gpufort-create-headers #ifndef _GPUFORT_REDUCTIONS_H_ #define _GPUFORT_REDUCTIONS_H_ // requires that gpufort.h is included beforehand @@ -78,4 +79,4 @@ namespace { HIP_CHECK(hipFree(temp_storage)); } } -#endif // _GPUFORT_REDUCTIONS_H_ \ No newline at end of file +#endif // _GPUFORT_REDUCTIONS_H_ diff --git a/python/fort2hip/templates/HipImplementation.template.cpp b/python/fort2hip/templates/hip_implementation.template.cpp similarity index 100% rename from python/fort2hip/templates/HipImplementation.template.cpp rename to python/fort2hip/templates/hip_implementation.template.cpp diff --git a/python/fort2hip/templates/InterfaceModule.template.f03 b/python/fort2hip/templates/interface_module.template.f03 similarity index 100% rename from python/fort2hip/templates/InterfaceModule.template.f03 rename to python/fort2hip/templates/interface_module.template.f03 diff --git a/python/fort2hip/templates/InterfaceModuleTest.template.f03 b/python/fort2hip/templates/interface_module_test.template.f03 similarity index 100% rename from python/fort2hip/templates/InterfaceModuleTest.template.f03 rename to python/fort2hip/templates/interface_module_test.template.f03 diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index d9437af7..203420d0 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -399,4 +399,4 @@ register_acc_backend("hip-gpufort-rt",\ Acc2HipGpufortRTPostprocess,\ AllocateHipGpufortRT,\ DeallocateHipGpufortRT,\ - "gpufort_acc_runtime") \ No newline at end of file + "gpufort_acc_runtime") diff --git a/test/gpufort_headers/Makefile b/test/gpufort_headers/Makefile new file mode 100644 index 00000000..cf1f6977 --- /dev/null +++ b/test/gpufort_headers/Makefile @@ -0,0 +1,13 @@ +TEST_SRC = test_compile_headers.hip.cpp test_gpufort_arrays.hip.cpp +TEST_APP = $(TEST_SRC:.hip.cpp=.x) + +.PHONY: generate_headers clean + +$(TEST_APP): %.x: %.hip.cpp + hipcc $^ -o $@ + +generate_headers: + gpufort --create-gpufort-headers + +clean: + rm $(TEST_APP) -f gpufort.h gpufort_reductions.h gpufort_arrays.h diff --git a/test/gpufort_headers/test_compile_headers.hip.cpp b/test/gpufort_headers/test_compile_headers.hip.cpp new file mode 100644 index 00000000..6867e016 --- /dev/null +++ b/test/gpufort_headers/test_compile_headers.hip.cpp @@ -0,0 +1,7 @@ +#include "gpufort.h" +#include "gpufort_arrays.h" +#include "gpufort_reductions.h" + +int main(int argc,char** argv) { + return 0; +} diff --git a/test/gpufort_headers/test_gpufort_arrays.hip.cpp b/test/gpufort_headers/test_gpufort_arrays.hip.cpp new file mode 100644 index 00000000..b12cd809 --- /dev/null +++ b/test/gpufort_headers/test_gpufort_arrays.hip.cpp @@ -0,0 +1,84 @@ +#include "gpufort.h" +#include "gpufort_arrays.h" + +#include + +__global__ void fill_int_array_1( + gpufort::GpuArray1 arr +) { + int i = -1+threadIdx.x + blockDim.x*blockIdx.x; + if ( (i+1) < 10 ) { + arr(i) = i+1; + //printf("%d\n",arr(i)); + } +} + +__global__ void fill_int_array_2( + gpufort::GpuArray2 arr +) { + int i = -1+threadIdx.x + blockDim.x*blockIdx.x; + int j = -2+threadIdx.y + blockDim.y*blockIdx.y; + if ( (i+1) < 10 && (j+2) < 10 ) { + arr(i,j) = (i+1) + (j+2)*arr.stride2; + } +} + +__global__ void fill_int_array_3( + gpufort::GpuArray3 arr +) { + int i = -1+threadIdx.x + blockDim.x*blockIdx.x; + int j = -2+threadIdx.y + blockDim.y*blockIdx.y; + int k = -3+threadIdx.z + blockDim.z*blockIdx.z; + if ( (i+1) < 10 && (j+2) < 10 && (k+3) < 10 ) { + arr(i,j,k) = (i+1) + (j+2)*arr.stride2 + (k+3)*arr.stride3; + } +} + +int main(int argc,char** argv) { + gpufort::MappedArray1 int_array1; + gpufort::MappedArray2 int_array2; + gpufort::MappedArray3 int_array3; + + HIP_CHECK(int_array1.init(nullptr,nullptr, 10, -1, true)); // hostptr,devptr, count, lower bound, pinned + HIP_CHECK(int_array2.init(nullptr,nullptr, 10,10, -1,-2, true)); + HIP_CHECK(int_array3.init(nullptr,nullptr, 10,10,10, -1,-2,-3, true)); + + assert( 10==int_array1.data.num_elements); + assert( 100==int_array2.data.num_elements); + assert(1000==int_array3.data.num_elements); + + assert( 1==int_array1.data.index_offset); + assert( 21==int_array2.data.index_offset); + assert(321==int_array3.data.index_offset); + + assert(0==int_array1.data.linearized_index(-1)); + assert(0==int_array2.data.linearized_index(-1,-2)); + assert(0==int_array3.data.linearized_index(-1,-2,-3)); + + assert( 9==int_array1.data.linearized_index(-1+10-1)); // upper bound + assert( 99==int_array2.data.linearized_index(-1+10-1,-2+10-1)); + assert(999==int_array3.data.linearized_index(-1+10-1,-2+10-1,-3+10-1)); + + hipLaunchKernelGGL(fill_int_array_1,dim3(1),dim3(10,1,1),0,nullptr,int_array1.data); + hipLaunchKernelGGL(fill_int_array_2,dim3(1),dim3(10,10,1),0,nullptr,int_array2.data); + hipLaunchKernelGGL(fill_int_array_3,dim3(1),dim3(10,10,10),0,nullptr,int_array3.data); + + HIP_CHECK(int_array1.copy_data_to_host()); + HIP_CHECK(int_array2.copy_data_to_host()); + HIP_CHECK(int_array3.copy_data_to_host()); + + HIP_CHECK(hipDeviceSynchronize()); + + for (int n = 0; n < int_array1.data.num_elements; n++ ) { + //std::cout << int_array1.data.data_host[n] << std::endl; + assert(int_array1.data.data_host[n] == n); + } + for (int n = 0; n < int_array2.data.num_elements; n++ ) { + assert(int_array2.data.data_host[n] == n); + } + for (int n = 0; n < int_array3.data.num_elements; n++ ) { + assert(int_array3.data.data_host[n] == n); + } + + return 0; +} From 56a7d981652530a0d2d4c9ac803451748c3cced1 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Tue, 9 Nov 2021 15:29:02 -0500 Subject: [PATCH 28/67] WiP on array and derived type mapping: Add Fortran array wrapper (untested) --- python/fort2hip/fort2hip.py | 21 ++++-- python/fort2hip/fort2hip_options.py.in | 12 +++- python/fort2hip/model.py | 4 +- python/fort2hip/templates/gpufort.macros.h | 20 ++++++ .../templates/gpufort_arrays.macros.f03 | 62 ++++++++++++++++++ .../templates/gpufort_arrays.macros.h | 65 +++++++++++++++++++ .../templates/gpufort_arrays.template.f03 | 31 +++++++++ .../templates/gpufort_arrays.template.h | 44 +++++-------- .../fort2hip/templates/gpufort_macros.jinja2 | 21 ++++++ .../test_gpufort_arrays.hip.cpp | 6 +- 10 files changed, 248 insertions(+), 38 deletions(-) create mode 100644 python/fort2hip/templates/gpufort.macros.h create mode 100644 python/fort2hip/templates/gpufort_arrays.macros.f03 create mode 100644 python/fort2hip/templates/gpufort_arrays.macros.h create mode 100644 python/fort2hip/templates/gpufort_arrays.template.f03 create mode 100644 python/fort2hip/templates/gpufort_macros.jinja2 diff --git a/python/fort2hip/fort2hip.py b/python/fort2hip/fort2hip.py index 0d7862d1..6de25e59 100644 --- a/python/fort2hip/fort2hip.py +++ b/python/fort2hip/fort2hip.py @@ -595,24 +595,35 @@ def generate_gpufort_headers(output_dir): global LOG_PREFIX global GPUFORT_HEADERS_MAX_DIM - utils.logging.log_enter_function(LOG_PREFIX,"_intrnl_render_templates",\ + utils.logging.log_enter_function(LOG_PREFIX,"generate_gpufort_headers",\ {"output_dir": output_dir}) gpufort_header_file_path = os.path.join(output_dir,"gpufort.h") model.GpufortHeaderModel().generate_file(gpufort_header_file_path) msg = "created gpufort main header: ".ljust(40) + gpufort_header_file_path - utils.logging.log_info(LOG_PREFIX,"_intrnl_render_templates",msg) + utils.logging.log_info(LOG_PREFIX,"generate_gpufort_headers",msg) gpufort_reductions_header_file_path = os.path.join(output_dir, "gpufort_reductions.h") model.GpufortReductionsHeaderModel().generate_file(gpufort_reductions_header_file_path) msg = "created gpufort reductions header file: ".ljust(40) + gpufort_reductions_header_file_path - utils.logging.log_info(LOG_PREFIX,"_intrnl_render_templates",msg) + utils.logging.log_info(LOG_PREFIX,"generate_gpufort_headers",msg) + # gpufort arrays + gpufort_arrays_context={ + "max_rank":GPUFORT_HEADERS_MAX_DIM, + "datatypes":GPUFORT_HEADERS_DATATYPES + } gpufort_arrays_header_file_path = os.path.join(output_dir,"gpufort_arrays.h") model.GpufortArraysHeaderModel().generate_file(gpufort_arrays_header_file_path,\ - context={"max_rank":GPUFORT_HEADERS_MAX_DIM}) + context=gpufort_arrays_context) msg = "created gpufort arrays header file: ".ljust(40) + gpufort_arrays_header_file_path - utils.logging.log_info(LOG_PREFIX,"_intrnl_render_templates",msg) + utils.logging.log_info(LOG_PREFIX,"generate_gpufort_headers",msg) + + gpufort_arrays_fortran_interfaces_module_path = os.path.join(output_dir,"gpufort_arrays.f03") + model.GpufortArraysFortranInterfacesModel().generate_file(gpufort_arrays_fortran_interfaces_module_path,\ + context=gpufort_arrays_context) + msg = "created gpufort arrays Fortran interface module: ".ljust(40) + gpufort_arrays_fortran_interfaces_module_path + utils.logging.log_info(LOG_PREFIX,"generate_gpufort_headers",msg) utils.logging.log_leave_function(LOG_PREFIX,"generate_gpufort_headers") diff --git a/python/fort2hip/fort2hip_options.py.in b/python/fort2hip/fort2hip_options.py.in index 1689d7cd..246f6ef8 100644 --- a/python/fort2hip/fort2hip_options.py.in +++ b/python/fort2hip/fort2hip_options.py.in @@ -43,5 +43,15 @@ CLANG_FORMAT_STYLE="\"{BasedOnStyle: llvm, ColumnLimit: 140, BinPackArguments: f # Format style that is passed to clang-format GPUFORT_HEADERS_MAX_DIM = 7 - # Generate rank-dependent classes and expresions up to + # Generate rank-dependent classes and expressions up to # this dimension. +GPUFORT_HEADERS_DATATYPES = [ + {"c_type":"bool","f_type":"c_bool"}, + {"c_type":"short","f_type":"c_short"}, + {"c_type":"int","f_type":"c_int"}, + {"c_type":"long","f_type":"c_long"}, + {"c_type":"float","f_type":"c_float"}, + {"c_type":"double","f_type":"c_double"} + ] + # Generate rank-dependent classes and expressions for these + # datatypes. diff --git a/python/fort2hip/model.py b/python/fort2hip/model.py index 9ed0e6a6..60e242d7 100644 --- a/python/fort2hip/model.py +++ b/python/fort2hip/model.py @@ -49,9 +49,9 @@ class GpufortArraysHeaderModel(BaseModel): def __init__(self): BaseModel.__init__(self,"templates/gpufort_arrays.template.h") -class GpufortArraysFortranInterfaceModel(BaseModel): +class GpufortArraysFortranInterfacesModel(BaseModel): def __init__(self): - BaseModel.__init__(self,"templates/gpufort_arrays.template.f90") + BaseModel.__init__(self,"templates/gpufort_arrays.template.f03") #model = GpufortHeaderModel() #model.generate_file("gpufort.h") diff --git a/python/fort2hip/templates/gpufort.macros.h b/python/fort2hip/templates/gpufort.macros.h new file mode 100644 index 00000000..580a0fc6 --- /dev/null +++ b/python/fort2hip/templates/gpufort.macros.h @@ -0,0 +1,20 @@ +{%- macro separated_list_single_line(prefix,sep,rank) -%} +{% for d in range(1,rank+1) -%} +{{prefix}}{{d}}{{ sep if not loop.last }}{%- endfor %} +{%- endmacro -%} +{%- macro separated_list(prefix,sep,rank) -%} +{% for d in range(1,rank+1) -%} +{{prefix}}{{d}}{{ sep+"\n" if not loop.last }} +{%- endfor %} +{%- endmacro -%} +{%- macro arglist(prefix,rank) -%} +{{ separated_list(prefix,",",rank) }} +{%- endmacro -%} +{%- macro bound_args(prefix,rank) -%} +{{ arglist(prefix+"n",rank) }}, +{{ arglist(prefix+"lb",rank) }} +{%- endmacro -%} +{%- macro bound_args_single_line(prefix,rank) -%} +{{ separated_list_single_line(prefix+"n",",",rank) }}, +{{ separated_list_single_line(prefix+"lb",",",rank) }} +{%- endmacro -%} diff --git a/python/fort2hip/templates/gpufort_arrays.macros.f03 b/python/fort2hip/templates/gpufort_arrays.macros.f03 new file mode 100644 index 00000000..0971ecf2 --- /dev/null +++ b/python/fort2hip/templates/gpufort_arrays.macros.f03 @@ -0,0 +1,62 @@ +{# SPDX-License-Identifier: MIT #} +{# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} +{# Fortran side #} +{%- macro gpufort_arrays_fortran_interfaces(datatypes,max_rank) -%} +interface gpufort_mapped_array_init +{% for tuple in datatypes %} +{% for rank in range(1,max_rank+1) %} + function gpufort_mapped_array{{rank}}_{{datatype}}_init ( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array, + {{f_type}}, data_host, + {{f_type}} data_dev, +{{ gm.bound_args("const int ",rank) | indent(6,True) }}, + bool pinned, + hipStream_t stream, + bool copyout_at_destruction + ) { + return mapped_array->init( + data_host, data_dev, +{{ gm.bound_args_single_line("",rank) | indent(6,True) }}, + pinned, stream, copyout_at_destruction + ); + } +end interface + + function gpufort_mapped_array{{rank}}_{{datatype}}_destroy( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + ) { + return mapped_array->destroy(); + } + + function gpufort_mapped_array{{rank}}_{{datatype}}_copy_data_to_host ( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + ) { + return mapped_array->copy_data_to_host(); + } + + function gpufort_mapped_array{{rank}}_{{datatype}}_copy_data_to_device ( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + ) { + return mapped_array->copy_data_to_device(); + } + + __host__ void gpufort_mapped_array{{rank}}_{{datatype}}_inc_num_refs( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + ) { + mapped_array->num_refs += 1; + } + + function gpufort_mapped_array{{rank}}_{{datatype}}_dec_num_refs( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array, + bool destroy_if_zero_refs + ) { + mapped_array->num_refs -= 1; + if ( destroy_if_zero_refs && mapped_array->num_refs == 0 ) { + return mapped_array->destroy(); + } { + return hipSuccess; + } + } +{% endfor %} +{% endfor %} +{%- endmacro -%} diff --git a/python/fort2hip/templates/gpufort_arrays.macros.h b/python/fort2hip/templates/gpufort_arrays.macros.h new file mode 100644 index 00000000..af4b95fc --- /dev/null +++ b/python/fort2hip/templates/gpufort_arrays.macros.h @@ -0,0 +1,65 @@ +{# SPDX-License-Identifier: MIT #} +{# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} +{# requires that the bound_args and bound_args_single_line macros exist #} +{% import "templates/gpufort.macros.h" as gm %} +{%- macro gpufort_arrays_c_bindings(datatypes,max_rank) -%} +{# C side #} +extern "C" { +{% for tuple in datatypes %} +{% set datatype = tuple.c_type %} +{% for rank in range(1,max_rank+1) %} + __host__ hipError_t gpufort_mapped_array{{rank}}_{{datatype}}_init ( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array, + {{datatype}}* data_host, + {{datatype}}* data_dev, +{{ gm.bound_args("const int ",rank) | indent(6,True) }}, + bool pinned, + hipStream_t stream, + bool copyout_at_destruction + ) { + return mapped_array->init( + data_host, data_dev, +{{ gm.bound_args_single_line("",rank) | indent(6,True) }}, + pinned, stream, copyout_at_destruction + ); + } + + __host__ hipError_t gpufort_mapped_array{{rank}}_{{datatype}}_destroy( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + ) { + return mapped_array->destroy(); + } + + __host__ hipError_t gpufort_mapped_array{{rank}}_{{datatype}}_copy_data_to_host ( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + ) { + return mapped_array->copy_data_to_host(); + } + + __host__ hipError_t gpufort_mapped_array{{rank}}_{{datatype}}_copy_data_to_device ( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + ) { + return mapped_array->copy_data_to_device(); + } + + __host__ void gpufort_mapped_array{{rank}}_{{datatype}}_inc_num_refs( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + ) { + mapped_array->num_refs += 1; + } + + __host__ hipError_t gpufort_mapped_array{{rank}}_{{datatype}}_dec_num_refs( + gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array, + bool destroy_if_zero_refs + ) { + mapped_array->num_refs -= 1; + if ( destroy_if_zero_refs && mapped_array->num_refs == 0 ) { + return mapped_array->destroy(); + } { + return hipSuccess; + } + } +{% endfor %} +{% endfor %} +} +{%- endmacro -%} diff --git a/python/fort2hip/templates/gpufort_arrays.template.f03 b/python/fort2hip/templates/gpufort_arrays.template.f03 new file mode 100644 index 00000000..46e7efe7 --- /dev/null +++ b/python/fort2hip/templates/gpufort_arrays.template.f03 @@ -0,0 +1,31 @@ +{# SPDX-License-Identifier: MIT #} +{# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} +module gpufort_arrays + use iso_c_bindings + ! NOTE: the below types must have exactly the + ! same data layout as the corresponding + ! gpufort C/C++ structs. + +{% for rank in range(1,max_rank+1) %} +{% set rank_ub = rank+1 %} + ! {{rank}}-dimensional array + type, bind(c) :: gpufort_gpu_array_{{rank}} + type(c_ptr) :: data_host = c_null_ptr; + type(c_ptr) :: data_dev = c_null_ptr; + integer(c_size_t) :: num_elements = 0; !> Number of represented by this array. + integer(c_int) :: index_offset = -1; !> Offset for index calculation; scalar product of negative lower bounds and strides. +{% for d in range(1,rank_ub) %} + integer(c_int) :: stride{{d}} = -1; !> Stride for dimension {{d}} +{% endfor %} + end type + type, bind(c) :: gpufort_mapped_array_{{rank}} + type(gpufort_gpu_array_{{rank}}) :: data + type(c_ptr) :: stream = c_null_ptr; + logical(c_bool) :: pinned = false; !> If the host data is pinned. + logical(c_bool) :: copyout_at_destruction = false; !> If the device data should be copied back to the host when this struct is destroyed. + logical(c_bool) :: owns_host_data = false; !> If this is only a wrapper, i.e. no memory management is performed. + logical(c_bool) :: owns_device_data = false; !> If this is only a wrapper, i.e. no memory management is performed. + integer(c_int) :: num_refs = 0; !> Number of references. + end type{{"\n" if not loop.last}} +{% endfor %} +end module gpufort_arrays diff --git a/python/fort2hip/templates/gpufort_arrays.template.h b/python/fort2hip/templates/gpufort_arrays.template.h index 7a0c0161..1ddd408a 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.h +++ b/python/fort2hip/templates/gpufort_arrays.template.h @@ -1,21 +1,7 @@ {# SPDX-License-Identifier: MIT #} {# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} -{%- macro separated_list_single_line(prefix,sep,rank) -%} -{% for d in range(1,rank+1) -%} -{{prefix}}{{d}}{{ sep if not loop.last }}{%- endfor %} -{%- endmacro -%} -{%- macro separated_list(prefix,sep,rank) -%} -{% for d in range(1,rank+1) -%} -{{prefix}}{{d}}{{ sep+"\n" if not loop.last }} -{%- endfor %} -{%- endmacro -%} -{%- macro arglist(prefix,rank) -%} -{{ separated_list(prefix,",",rank) }} -{%- endmacro -%} -{%- macro bound_args(prefix,rank) -%} -{{ arglist(prefix+"n",rank) }}, -{{ arglist(prefix+"lb",rank) }} -{%- endmacro -%} +{% import "templates/gpufort.macros.h" as gm %} +{% import "templates/gpufort_arrays.macros.h" as gam %} // This file was generated from a template via gpufort --gpufort-create-headers #ifndef _GPUFORT_ARRAYS_H_ #define _GPUFORT_ARRAYS_H_ @@ -60,12 +46,12 @@ namespace gpufort { __host__ __device__ void wrap( T* data_host, T* data_dev, -{{ bound_args("int ",rank) | indent(8,True) }} +{{ gm.bound_args("const int ",rank) | indent(8,True) }} ) { this->data_host = data_host; this->data_dev = data_dev; // column-major access - this->num_elements = {{ separated_list_single_line("n","*",rank) }}; + this->num_elements = {{ gm.separated_list_single_line("n","*",rank) }}; {% for d in range(1,rank_ub) %} this->stride{{d}} = 1{%- for e in range(1,d) -%}*n{{e}}{%- endfor %}; {% endfor %} @@ -81,7 +67,7 @@ namespace gpufort { * \param[in] i1,i2,... multi-dimensional array index. */ __host__ __device__ __forceinline__ int linearized_index ( -{{ arglist("const int i",rank) | indent(6,"True") }} +{{ gm.arglist("const int i",rank) | indent(6,"True") }} ) { return this->index_offset {% for d in range(1,rank_ub) %} @@ -95,10 +81,10 @@ namespace gpufort { * \param[in] i1,i2,... multi-dimensional array index. */ __host__ __device__ __forceinline__ T& operator() ( -{{ arglist("const int i",rank) | indent(6,"True") }} +{{ gm.arglist("const int i",rank) | indent(6,"True") }} ) { const int index = linearized_index( -{{ separated_list_single_line("i",",",rank) | indent(8,"True") }} +{{ gm.separated_list_single_line("i",",",rank) | indent(8,"True") }} ); #if __HIP_DEVICE_COMPILE__ return this->data_dev[index]; @@ -116,7 +102,7 @@ namespace gpufort { bool copyout_at_destruction = false; //> If the device data should be copied back to the host when this struct is destroyed. bool owns_host_data = false; //> If this is only a wrapper, i.e. no memory management is performed. bool owns_device_data = false; //> If this is only a wrapper, i.e. no memory management is performed. - int ref_ctr = 0; //> Number of references. + int num_refs = 0; //> Number of references. /** * Initialize. @@ -132,7 +118,7 @@ namespace gpufort { __host__ hipError_t init( T* data_host, T* data_dev, -{{ bound_args("int ",rank) | indent(8,True) }}, +{{ gm.bound_args("const int ",rank) | indent(8,True) }}, bool pinned, hipStream_t stream = nullptr, bool copyout_at_destruction = false) { @@ -140,13 +126,14 @@ namespace gpufort { this->data.wrap( data_host, data_dev, -{{ bound_args("",rank) | indent(10,True) }} +{{ gm.bound_args("",rank) | indent(10,True) }} ); this->stream = stream; this->pinned = pinned; this->copyout_at_destruction = copyout_at_destruction; this->owns_host_data = data_host == nullptr; this->owns_device_data = data_dev == nullptr; + this->num_refs = 1; if ( this->owns_host_data && pinned ) { ierr = hipHostMalloc((void**) &this->data.data_host,this->num_data_bytes(),0); } else if ( this->owns_host_data ) { @@ -243,14 +230,17 @@ namespace gpufort { * \param[in] i1,i2,... multi-dimensional array index. */ __host__ T& operator() ( -{{ arglist("const int i",rank) | indent(6,"True") }} +{{ gm.arglist("const int i",rank) | indent(6,"True") }} ) { return this->data( -{{ separated_list_single_line("i",",",rank) | indent(8,"True") }} +{{ gm.separated_list_single_line("i",",",rank) | indent(8,"True") }} ); } }; {{ "" if not loop.last }} {% endfor -%} } -#endif // _GPUFORT_ARRAYS_H_ + +// C bindings +{{ gam.gpufort_arrays_c_bindings(datatypes,max_rank) }} +#endif // _GPUFORT_ARRAYS_H_ \ No newline at end of file diff --git a/python/fort2hip/templates/gpufort_macros.jinja2 b/python/fort2hip/templates/gpufort_macros.jinja2 new file mode 100644 index 00000000..c2bc01b0 --- /dev/null +++ b/python/fort2hip/templates/gpufort_macros.jinja2 @@ -0,0 +1,21 @@ + +{%- macro separated_list_single_line(prefix,sep,rank) -%} +{% for d in range(1,rank+1) -%} +{{prefix}}{{d}}{{ sep if not loop.last }}{%- endfor %} +{%- endmacro -%} +{%- macro separated_list(prefix,sep,rank) -%} +{% for d in range(1,rank+1) -%} +{{prefix}}{{d}}{{ sep+"\n" if not loop.last }} +{%- endfor %} +{%- endmacro -%} +{%- macro arglist(prefix,rank) -%} +{{ separated_list(prefix,",",rank) }} +{%- endmacro -%} +{%- macro bound_args(prefix,rank) -%} +{{ arglist(prefix+"n",rank) }}, +{{ arglist(prefix+"lb",rank) }} +{%- endmacro -%} +{%- macro bound_args_single_line(prefix,rank) -%} +{{ separated_list_single_line(prefix+"n",",",rank) }}, +{{ separated_list_single_line(prefix+"lb",",",rank) }} +{%- endmacro -%} diff --git a/test/gpufort_headers/test_gpufort_arrays.hip.cpp b/test/gpufort_headers/test_gpufort_arrays.hip.cpp index b12cd809..5a7a9abc 100644 --- a/test/gpufort_headers/test_gpufort_arrays.hip.cpp +++ b/test/gpufort_headers/test_gpufort_arrays.hip.cpp @@ -8,7 +8,7 @@ __global__ void fill_int_array_1( ) { int i = -1+threadIdx.x + blockDim.x*blockIdx.x; if ( (i+1) < 10 ) { - arr(i) = i+1; + arr(i) = arr.linearized_index(i); //printf("%d\n",arr(i)); } } @@ -19,7 +19,7 @@ __global__ void fill_int_array_2( int i = -1+threadIdx.x + blockDim.x*blockIdx.x; int j = -2+threadIdx.y + blockDim.y*blockIdx.y; if ( (i+1) < 10 && (j+2) < 10 ) { - arr(i,j) = (i+1) + (j+2)*arr.stride2; + arr(i,j) = arr.linearized_index(i,j); } } @@ -30,7 +30,7 @@ __global__ void fill_int_array_3( int j = -2+threadIdx.y + blockDim.y*blockIdx.y; int k = -3+threadIdx.z + blockDim.z*blockIdx.z; if ( (i+1) < 10 && (j+2) < 10 && (k+3) < 10 ) { - arr(i,j,k) = (i+1) + (j+2)*arr.stride2 + (k+3)*arr.stride3; + arr(i,j,k) = arr.linearized_index(i,j,k); } } From dcd5ae838d7cc69407b6f976b92533abd7225499 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 10 Nov 2021 12:35:59 -0500 Subject: [PATCH 29/67] Central Makefile + multiple linked changes * Add central Makefile for building GPUFORT static libraries. * Targets, created objects & object paths depend on environment variable HIP_PLATFORM * Creates/generates GPUFORT header, sources, module files and puts them into /include subfolder * Puts module files into /include// subfolder as they might be vendor dependent * Creates libgpufort_.a and libgpufort_acc_.a static objects and puts them into the /lib/ subfolder * gpufort.py: * Add option to generate linker flags: * --ldflags: Linker flaogs for libgpufort.a in /lib/ subfolder * --ldflags-gpufort-rt: Output of --ldflags plus linker flags for GPUFORT runtime * Add option to generate GPUFORT C++ source and Fortran interface module files (required for building libgpufort_.a): --create-gpufort-sources Minor: * Fix some compilation issues in new gpufort_arrays* files * Remove some files from the repository that will be autogenerated by the new Makefile --- Makefile | 37 ++ README.md | 16 + examples/openacc/rules.mk | 6 +- include/Makefile | 8 +- include/cudafor-fort2hip.hip.cpp | 0 include/cudafor.f90-fort2hip.hip.cpp | 1 - include/cudafor.gpufort_mod | 1 - include/gpufort.h | 445 ------------------ include/gpufort_reductions.h | 79 ---- python/fort2hip/fort2hip.py | 27 +- python/fort2hip/model.py | 4 + .../templates/gpufort_arrays.template.f03 | 10 +- .../templates/gpufort_arrays.template.h | 28 +- python/gpufort.py | 33 +- runtime/gpufort_acc_runtime/Makefile | 10 +- runtime/gpufort_acc_runtime/rules.mk | 3 + runtime/gpufort_acc_runtime/src/Makefile | 6 +- src/Makefile | 40 ++ 18 files changed, 184 insertions(+), 570 deletions(-) create mode 100644 Makefile delete mode 100644 include/cudafor-fort2hip.hip.cpp delete mode 100644 include/cudafor.f90-fort2hip.hip.cpp delete mode 100644 include/cudafor.gpufort_mod delete mode 100644 include/gpufort.h delete mode 100644 include/gpufort_reductions.h create mode 100644 src/Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..6da1aab4 --- /dev/null +++ b/Makefile @@ -0,0 +1,37 @@ +.PHONY: clean_all generate_gpufort_headers generate_gpufort_sources lib/$(LIBGPUFORT) lib/$(LIBGPUFORT_ACC) + +SUFFIX = $(if $(HIP_PLATFORM),$(HIP_PLATFORM),amd) +LIBGPUFORT = libgpufort_$(SUFFIX).a +LIBGPUFORT_ACC = libgpufort_acc_$(SUFFIX).a + +GPUFORT_DIR = $(shell gpufort --path) +GPUFORT_ACC_DIR = $(GPUFORT_DIR)/runtime/gpufort_acc_runtime + +all: | generate_gpufort_headers generate_gpufort_sources lib/$(LIBGPUFORT) lib/$(LIBGPUFORT_ACC) + +generate_gpufort_headers: + make -C $(GPUFORT_DIR)/include all + +generate_gpufort_sources: + make -C $(GPUFORT_DIR)/src all + +lib/$(LIBGPUFORT): generate_gpufort_headers generate_gpufort_sources + mkdir -p $(GPUFORT_DIR)/lib + mv $(GPUFORT_DIR)/src/$(LIBGPUFORT) $(GPUFORT_DIR)/lib + make -C $(GPUFORT_DIR)/src clean + +lib/$(LIBGPUFORT_ACC): + make -C $(GPUFORT_ACC_DIR)/ lib/$(LIBGPUFORT_ACC) + mv $(GPUFORT_ACC_DIR)/lib/$(LIBGPUFORT_ACC)\ + $(GPUFORT_DIR)/lib/ + mkdir -p $(GPUFORT_DIR)/include/$(SUFFIX) + mv $(GPUFORT_ACC_DIR)/include/*.mod\ + $(GPUFORT_DIR)/include/$(SUFFIX) + #-mv $(GPUFORT_ACC_DIR)/include/*.h\ + # $(GPUFORT_DIR)/include/$(SUFFIX) + make -C $(GPUFORT_ACC_DIR)/ clean + +clean_all: + make -C $(GPUFORT_DIR)/include clean_all + make -C $(GPUFORT_DIR)/src clean_all + rm -f lib/$(LIBGPUFORT) lib/$(LIBGPUFORT_ACC) diff --git a/README.md b/README.md index 13b4a055..f7aa7115 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,22 @@ by GPUFORT will in most cases require manual reviewing and fixing. Please take a look at the (slightly outdated) [user guide](https://rocmsoftwareplatform.github.io/gpufort/). +### Quick start for generating and compiling HIP code form Fortran + +Before you can run HIP code generated by GPUFORT, you need to +build the GPUFORT static libraries and/or +offloading runtime for AMD and/or NVIDIA devices. +Assuming HIPFORT is installed, you can compile them via: + +```bash +HIP_PLATFORM=amd FC=hipfc make all # use HIP_PLATFORM=nvidia for NVIDIA devices +``` + +If the compilation is successful, take a look at the +CUDA Fortran and OpenACC examples in the `examples/` subdirectory, +which all come with a Makefile for generating code and building +the examples. + ## Implementation details [This presentation](https://github.com/ROCmSoftwarePlatform/gpufort/blob/main/gpufort_slides.pdf) diff --git a/examples/openacc/rules.mk b/examples/openacc/rules.mk index 5b5ae252..9bd2b483 100644 --- a/examples/openacc/rules.mk +++ b/examples/openacc/rules.mk @@ -15,9 +15,5 @@ HIPFC ?= hipfc OMPFC ?= /opt/rocm/llvm/bin/flang OMPFC_CFLAGS ?= $(CFLAGS) -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa -march=gfx908 -GPUFORT_ACC_DIR ?= $(shell gpufort --path)/runtime/gpufort_acc_runtime -ACC_INC = -I/$(GPUFORT_ACC_DIR)/include -ACC_LIB = -L/$(GPUFORT_ACC_DIR)/lib -lgpufort_acc - -CFLAGS += $(ACC_INC) $(ACC_LIB) -lgfortran +CFLAGS += $(shell gpufort --ldflags-gpufort-rt) -lgfortran diff --git a/include/Makefile b/include/Makefile index 8724d2e5..f1f53311 100644 --- a/include/Makefile +++ b/include/Makefile @@ -1,4 +1,6 @@ -.PHONY: all headers modules +.PHONY: all headers modules clean_all + +SUFFIX = $(if $(HIP_PLATFORM),$(HIP_PLATFORM),amd) all: headers modules @@ -8,5 +10,5 @@ headers: modules: gpufort -K cudafor.f90 -make clean: - rm -rf *.gpufort_mod *-fort2hip.* *-gpufort.* *.h +clean_all: + for expr in "*.json" "*.mod" "*.gpufort_mod" "*-fort2hip.*" "*-gpufort.*" "*.h"; do find . -name "$$expr" -delete; done diff --git a/include/cudafor-fort2hip.hip.cpp b/include/cudafor-fort2hip.hip.cpp deleted file mode 100644 index e69de29b..00000000 diff --git a/include/cudafor.f90-fort2hip.hip.cpp b/include/cudafor.f90-fort2hip.hip.cpp deleted file mode 100644 index d23a1d4a..00000000 --- a/include/cudafor.f90-fort2hip.hip.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "cudafor-fort2hip.hip.cpp" \ No newline at end of file diff --git a/include/cudafor.gpufort_mod b/include/cudafor.gpufort_mod deleted file mode 100644 index 046500fe..00000000 --- a/include/cudafor.gpufort_mod +++ /dev/null @@ -1 +0,0 @@ -{"kind":"module","name":"cudafor","variables":[],"types":[{"name":"dim3","kind":"type","variables":[{"name":"x","f_type":"integer","kind":"c_int","bytes_per_element":"4","c_type":"int","f_interface_type":"integer","f_interface_qualifiers":["value"],"qualifiers":[],"declare_on_target":false,"rank":0,"value":null},{"name":"y","f_type":"integer","kind":"c_int","bytes_per_element":"4","c_type":"int","f_interface_type":"integer","f_interface_qualifiers":["value"],"qualifiers":[],"declare_on_target":false,"rank":0,"value":null},{"name":"z","f_type":"integer","kind":"c_int","bytes_per_element":"4","c_type":"int","f_interface_type":"integer","f_interface_qualifiers":["value"],"qualifiers":[],"declare_on_target":false,"rank":0,"value":null},{"name":"d","f_type":"integer","kind":"","bytes_per_element":"4","c_type":"int","f_interface_type":"integer","f_interface_qualifiers":["value"],"qualifiers":[],"declare_on_target":false,"rank":0,"value":null}],"types":[]}],"subprograms":[],"used_modules":[]} \ No newline at end of file diff --git a/include/gpufort.h b/include/gpufort.h deleted file mode 100644 index 60be7da6..00000000 --- a/include/gpufort.h +++ /dev/null @@ -1,445 +0,0 @@ -#ifndef _GPUFORT_H_ -#define _GPUFORT_H_ -#include "hip/hip_complex.h" -#include "hip/math_functions.h" -#include -#include -#include -#include -#include -#include -#include -#define HIP_CHECK(condition) \ - { \ - hipError_t error = condition; \ - if(error != hipSuccess){ \ - std::cout << "HIP error: " << error << " line: " << __LINE__ << std::endl; \ - exit(error); \ - } \ - } - -// global thread indices for various dimensions -#define __gidx(idx) (threadIdx.idx + blockIdx.idx * blockDim.idx) -#define __gidx1 __gidx(x) -#define __gidx2 (__gidx(x) + gridDim.x*blockDim.x*__gidx(y)) -#define __gidx3 (__gidx(x) + gridDim.x*blockDim.x*__gidx(y) + gridDim.x*blockDim.x*gridDim.y*blockDim.y*__gidx(z)) -#define __total_threads(grid,block) ( (grid).x*(grid).y*(grid).z * (block).x*(block).y*(block).z ) -#define divideAndRoundUp(x, y) ((x) / (y) + ((x) % (y) != 0)) - -#define GPUFORT_PRINT_ARGS(...) gpufort_show_args(std::cout, #__VA_ARGS__, __VA_ARGS__) -namespace { - template std::ostream& gpufort_show_args(std::ostream& out, const char* label, H1&& value) { - return out << label << "=" << std::forward

(value) << '\n'; - } - - template std::ostream& gpufort_show_args(std::ostream& out, const char* label, H1&& value, T&&... rest) { - const char* pcomma = strchr(label, ','); - return gpufort_show_args(out.write(label, pcomma - label) << "=" << std::forward

(value) << ',', - pcomma + 1, - std::forward(rest)...); - } -} -#define GPUFORT_PRINT_ARRAY1(prefix,print_values,print_norms,A,n1,lb1) gpufort_print_array1(std::cout, prefix, print_values, print_norms, #A, A, n1,lb1) -#define GPUFORT_PRINT_ARRAY2(prefix,print_values,print_norms,A,n1,n2,lb1,lb2) gpufort_print_array2(std::cout, prefix, print_values, print_norms, #A, A, n1,n2,lb1,lb2) -#define GPUFORT_PRINT_ARRAY3(prefix,print_values,print_norms,A,n1,n2,n3,lb1,lb2,lb3) gpufort_print_array3(std::cout, prefix, print_values, print_norms, #A, A, n1,n2,n3,lb1,lb2,lb3) -#define GPUFORT_PRINT_ARRAY4(prefix,print_values,print_norms,A,n1,n2,n3,n4,lb1,lb2,lb3,lb4) gpufort_print_array4(std::cout, prefix, print_values, print_norms, #A, A, n1,n2,n3,n4,lb1,lb2,lb3,lb4) -#define GPUFORT_PRINT_ARRAY5(prefix,print_values,print_norms,A,n1,n2,n3,n4,n5,lb1,lb2,lb3,lb4,lb5) gpufort_print_array5(std::cout, prefix, print_values, print_norms, #A, A, n1,n2,n3,n4,n5,lb1,lb2,lb3,lb4,lb5) -#define GPUFORT_PRINT_ARRAY6(prefix,print_values,print_norms,A,n1,n2,n3,n4,n5,n6,lb1,lb2,lb3,lb4,lb5,lb6) gpufort_print_array6(std::cout, prefix, print_values, print_norms, #A, A, n1,n2,n3,n4,n5,n6,lb1,lb2,lb3,lb4,lb5,lb6) -#define GPUFORT_PRINT_ARRAY7(prefix,print_values,print_norms,A,n1,n2,n3,n4,n5,n6,n7,lb1,lb2,lb3,lb4,lb5,lb6,lb7) gpufort_print_array7(std::cout, prefix, print_values, print_norms, #A, A, n1,n2,n3,n4,n5,n6,n7,lb1,lb2,lb3,lb4,lb5,lb6,lb7) -namespace { - template - void gpufort_print_array1(std::ostream& out, const char* prefix, const bool print_values, const bool print_norms, const char* label, T A[], int n1,int lb1) { - int n =n1; - std::vector A_h(n); - out << prefix << label << ":" << "\n"; - HIP_CHECK(hipMemcpy(A_h.data(), A, n*sizeof(T), hipMemcpyDeviceToHost)); - T min = +std::numeric_limits::max(); - T max = -std::numeric_limits::max(); - T sum = 0; - T l1 = 0; - T l2 = 0; - for ( int i1 = 0; i1 < n1; i1++ ) { - T value = A_h[i1]; - if ( print_norms ) { - min = std::min(value,min); - max = std::max(value,max); - sum += value; - l1 += std::abs(value); - l2 += value*value; - } - if ( print_values ) { - out << prefix << label << "(" << (lb1+i1) << ") = " << std::setprecision(6) << value << "\n"; - } - } // for loops - if ( print_norms ) { - out << prefix << label << ":" << "min=" << min << "\n"; - out << prefix << label << ":" << "max=" << max << "\n"; - out << prefix << label << ":" << "sum=" << sum << "\n"; - out << prefix << label << ":" << "l1=" << l1 << "\n"; - out << prefix << label << ":" << "l2=" << std::sqrt(l2) << "\n"; - } - } - template - void gpufort_print_array2(std::ostream& out, const char* prefix, const bool print_values, const bool print_norms, const char* label, T A[], int n1,int n2,int lb1,int lb2) { - int n =n1*n2; - std::vector A_h(n); - out << prefix << label << ":" << "\n"; - HIP_CHECK(hipMemcpy(A_h.data(), A, n*sizeof(T), hipMemcpyDeviceToHost)); - T min = +std::numeric_limits::max(); - T max = -std::numeric_limits::max(); - T sum = 0; - T l1 = 0; - T l2 = 0; - for ( int i2 = 0; i2 < n2; i2++ ) { - for ( int i1 = 0; i1 < n1; i1++ ) { - T value = A_h[n1*i2+i1]; - if ( print_norms ) { - min = std::min(value,min); - max = std::max(value,max); - sum += value; - l1 += std::abs(value); - l2 += value*value; - } - if ( print_values ) { - out << prefix << label << "(" << (lb1+i1) << "," << (lb2+i2) << ") = " << std::setprecision(6) << value << "\n"; - } - }} // for loops - if ( print_norms ) { - out << prefix << label << ":" << "min=" << min << "\n"; - out << prefix << label << ":" << "max=" << max << "\n"; - out << prefix << label << ":" << "sum=" << sum << "\n"; - out << prefix << label << ":" << "l1=" << l1 << "\n"; - out << prefix << label << ":" << "l2=" << std::sqrt(l2) << "\n"; - } - } - template - void gpufort_print_array3(std::ostream& out, const char* prefix, const bool print_values, const bool print_norms, const char* label, T A[], int n1,int n2,int n3,int lb1,int lb2,int lb3) { - int n =n1*n2*n3; - std::vector A_h(n); - out << prefix << label << ":" << "\n"; - HIP_CHECK(hipMemcpy(A_h.data(), A, n*sizeof(T), hipMemcpyDeviceToHost)); - T min = +std::numeric_limits::max(); - T max = -std::numeric_limits::max(); - T sum = 0; - T l1 = 0; - T l2 = 0; - for ( int i3 = 0; i3 < n3; i3++ ) { - for ( int i2 = 0; i2 < n2; i2++ ) { - for ( int i1 = 0; i1 < n1; i1++ ) { - T value = A_h[n1*n2*i3+n1*i2+i1]; - if ( print_norms ) { - min = std::min(value,min); - max = std::max(value,max); - sum += value; - l1 += std::abs(value); - l2 += value*value; - } - if ( print_values ) { - out << prefix << label << "(" << (lb1+i1) << "," << (lb2+i2) << "," << (lb3+i3) << ") = " << std::setprecision(6) << value << "\n"; - } - }}} // for loops - if ( print_norms ) { - out << prefix << label << ":" << "min=" << min << "\n"; - out << prefix << label << ":" << "max=" << max << "\n"; - out << prefix << label << ":" << "sum=" << sum << "\n"; - out << prefix << label << ":" << "l1=" << l1 << "\n"; - out << prefix << label << ":" << "l2=" << std::sqrt(l2) << "\n"; - } - } - template - void gpufort_print_array4(std::ostream& out, const char* prefix, const bool print_values, const bool print_norms, const char* label, T A[], int n1,int n2,int n3,int n4,int lb1,int lb2,int lb3,int lb4) { - int n =n1*n2*n3*n4; - std::vector A_h(n); - out << prefix << label << ":" << "\n"; - HIP_CHECK(hipMemcpy(A_h.data(), A, n*sizeof(T), hipMemcpyDeviceToHost)); - T min = +std::numeric_limits::max(); - T max = -std::numeric_limits::max(); - T sum = 0; - T l1 = 0; - T l2 = 0; - for ( int i4 = 0; i4 < n4; i4++ ) { - for ( int i3 = 0; i3 < n3; i3++ ) { - for ( int i2 = 0; i2 < n2; i2++ ) { - for ( int i1 = 0; i1 < n1; i1++ ) { - T value = A_h[n1*n2*n3*i4+n1*n2*i3+n1*i2+i1]; - if ( print_norms ) { - min = std::min(value,min); - max = std::max(value,max); - sum += value; - l1 += std::abs(value); - l2 += value*value; - } - if ( print_values ) { - out << prefix << label << "(" << (lb1+i1) << "," << (lb2+i2) << "," << (lb3+i3) << "," << (lb4+i4) << ") = " << std::setprecision(6) << value << "\n"; - } - }}}} // for loops - if ( print_norms ) { - out << prefix << label << ":" << "min=" << min << "\n"; - out << prefix << label << ":" << "max=" << max << "\n"; - out << prefix << label << ":" << "sum=" << sum << "\n"; - out << prefix << label << ":" << "l1=" << l1 << "\n"; - out << prefix << label << ":" << "l2=" << std::sqrt(l2) << "\n"; - } - } - template - void gpufort_print_array5(std::ostream& out, const char* prefix, const bool print_values, const bool print_norms, const char* label, T A[], int n1,int n2,int n3,int n4,int n5,int lb1,int lb2,int lb3,int lb4,int lb5) { - int n =n1*n2*n3*n4*n5; - std::vector A_h(n); - out << prefix << label << ":" << "\n"; - HIP_CHECK(hipMemcpy(A_h.data(), A, n*sizeof(T), hipMemcpyDeviceToHost)); - T min = +std::numeric_limits::max(); - T max = -std::numeric_limits::max(); - T sum = 0; - T l1 = 0; - T l2 = 0; - for ( int i5 = 0; i5 < n5; i5++ ) { - for ( int i4 = 0; i4 < n4; i4++ ) { - for ( int i3 = 0; i3 < n3; i3++ ) { - for ( int i2 = 0; i2 < n2; i2++ ) { - for ( int i1 = 0; i1 < n1; i1++ ) { - T value = A_h[n1*n2*n3*n4*i5+n1*n2*n3*i4+n1*n2*i3+n1*i2+i1]; - if ( print_norms ) { - min = std::min(value,min); - max = std::max(value,max); - sum += value; - l1 += std::abs(value); - l2 += value*value; - } - if ( print_values ) { - out << prefix << label << "(" << (lb1+i1) << "," << (lb2+i2) << "," << (lb3+i3) << "," << (lb4+i4) << "," << (lb5+i5) << ") = " << std::setprecision(6) << value << "\n"; - } - }}}}} // for loops - if ( print_norms ) { - out << prefix << label << ":" << "min=" << min << "\n"; - out << prefix << label << ":" << "max=" << max << "\n"; - out << prefix << label << ":" << "sum=" << sum << "\n"; - out << prefix << label << ":" << "l1=" << l1 << "\n"; - out << prefix << label << ":" << "l2=" << std::sqrt(l2) << "\n"; - } - } - template - void gpufort_print_array6(std::ostream& out, const char* prefix, const bool print_values, const bool print_norms, const char* label, T A[], int n1,int n2,int n3,int n4,int n5,int n6,int lb1,int lb2,int lb3,int lb4,int lb5,int lb6) { - int n =n1*n2*n3*n4*n5*n6; - std::vector A_h(n); - out << prefix << label << ":" << "\n"; - HIP_CHECK(hipMemcpy(A_h.data(), A, n*sizeof(T), hipMemcpyDeviceToHost)); - T min = +std::numeric_limits::max(); - T max = -std::numeric_limits::max(); - T sum = 0; - T l1 = 0; - T l2 = 0; - for ( int i6 = 0; i6 < n6; i6++ ) { - for ( int i5 = 0; i5 < n5; i5++ ) { - for ( int i4 = 0; i4 < n4; i4++ ) { - for ( int i3 = 0; i3 < n3; i3++ ) { - for ( int i2 = 0; i2 < n2; i2++ ) { - for ( int i1 = 0; i1 < n1; i1++ ) { - T value = A_h[n1*n2*n3*n4*n5*i6+n1*n2*n3*n4*i5+n1*n2*n3*i4+n1*n2*i3+n1*i2+i1]; - if ( print_norms ) { - min = std::min(value,min); - max = std::max(value,max); - sum += value; - l1 += std::abs(value); - l2 += value*value; - } - if ( print_values ) { - out << prefix << label << "(" << (lb1+i1) << "," << (lb2+i2) << "," << (lb3+i3) << "," << (lb4+i4) << "," << (lb5+i5) << "," << (lb6+i6) << ") = " << std::setprecision(6) << value << "\n"; - } - }}}}}} // for loops - if ( print_norms ) { - out << prefix << label << ":" << "min=" << min << "\n"; - out << prefix << label << ":" << "max=" << max << "\n"; - out << prefix << label << ":" << "sum=" << sum << "\n"; - out << prefix << label << ":" << "l1=" << l1 << "\n"; - out << prefix << label << ":" << "l2=" << std::sqrt(l2) << "\n"; - } - } - template - void gpufort_print_array7(std::ostream& out, const char* prefix, const bool print_values, const bool print_norms, const char* label, T A[], int n1,int n2,int n3,int n4,int n5,int n6,int n7,int lb1,int lb2,int lb3,int lb4,int lb5,int lb6,int lb7) { - int n =n1*n2*n3*n4*n5*n6*n7; - std::vector A_h(n); - out << prefix << label << ":" << "\n"; - HIP_CHECK(hipMemcpy(A_h.data(), A, n*sizeof(T), hipMemcpyDeviceToHost)); - T min = +std::numeric_limits::max(); - T max = -std::numeric_limits::max(); - T sum = 0; - T l1 = 0; - T l2 = 0; - for ( int i7 = 0; i7 < n7; i7++ ) { - for ( int i6 = 0; i6 < n6; i6++ ) { - for ( int i5 = 0; i5 < n5; i5++ ) { - for ( int i4 = 0; i4 < n4; i4++ ) { - for ( int i3 = 0; i3 < n3; i3++ ) { - for ( int i2 = 0; i2 < n2; i2++ ) { - for ( int i1 = 0; i1 < n1; i1++ ) { - T value = A_h[n1*n2*n3*n4*n5*n6*i7+n1*n2*n3*n4*n5*i6+n1*n2*n3*n4*i5+n1*n2*n3*i4+n1*n2*i3+n1*i2+i1]; - if ( print_norms ) { - min = std::min(value,min); - max = std::max(value,max); - sum += value; - l1 += std::abs(value); - l2 += value*value; - } - if ( print_values ) { - out << prefix << label << "(" << (lb1+i1) << "," << (lb2+i2) << "," << (lb3+i3) << "," << (lb4+i4) << "," << (lb5+i5) << "," << (lb6+i6) << "," << (lb7+i7) << ") = " << std::setprecision(6) << value << "\n"; - } - }}}}}}} // for loops - if ( print_norms ) { - out << prefix << label << ":" << "min=" << min << "\n"; - out << prefix << label << ":" << "max=" << max << "\n"; - out << prefix << label << ":" << "sum=" << sum << "\n"; - out << prefix << label << ":" << "l1=" << l1 << "\n"; - out << prefix << label << ":" << "l2=" << std::sqrt(l2) << "\n"; - } - } - // loop condition - template __device__ __forceinline__ bool loop_cond(I idx,E end,S stride) { - return (stride>0) ? ( idx <= end ) : ( -idx <= -end ); - } - - // type conversions - // make float - __device__ __forceinline__ float make_float(const short int a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const unsigned short int a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const unsigned int a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const int a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const long int a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const unsigned long int a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const long long int a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const unsigned long long int a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const signed char a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const unsigned char a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const float a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const double a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const long double a) { - return static_cast(a); - } - __device__ __forceinline__ float make_float(const hipFloatComplex a) { - return static_cast(a.x); - } - __device__ __forceinline__ float make_float(const hipDoubleComplex a) { - return static_cast(a.x); - } // make double - __device__ __forceinline__ double make_double(const short int a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const unsigned short int a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const unsigned int a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const int a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const long int a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const unsigned long int a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const long long int a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const unsigned long long int a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const signed char a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const unsigned char a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const float a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const double a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const long double a) { - return static_cast(a); - } - __device__ __forceinline__ double make_double(const hipFloatComplex a) { - return static_cast(a.x); - } - __device__ __forceinline__ double make_double(const hipDoubleComplex a) { - return static_cast(a.x); - } - // math functions - __device__ __forceinline__ hipFloatComplex conj(const hipFloatComplex& c) { - return hipConjf(c); - } - __device__ __forceinline__ hipDoubleComplex conj(const hipDoubleComplex& z) { - return hipConj(z); - } - __device__ __forceinline__ int nint(const float a) { - return (a>0.f) ? static_cast(a+0.5f) : static_cast(a-0.5f); - } - __device__ __forceinline__ int nint(const double a) { - return (a>0.) ? static_cast(a+0.5) : static_cast(a-0.5); - } - __device__ __forceinline__ float dim(const float a, const float b) { - const float diff = a-b; - return (diff>0.f) ? diff : 0.f; - } - __device__ __forceinline__ double dim(const double a, const double b) { - const double diff = a-b; - return (diff>0.) ? diff : 0.; - } -} - -#define sign(a,b) copysign(a,b) - -#define min2(a,b) min(a,b) -#define min3(aa,ab,ba) min(min(aa,ab),ba) -#define min4(aa,ab,ba,bb) min(min(aa,ab),min(ba,bb)) -#define min5(aaa,aab,aba,ba,bb) min(min(min(aaa,aab),aba),min(ba,bb)) -#define min6(aaa,aab,aba,baa,bab,bba) min(min(min(aaa,aab),aba),min(min(baa,bab),bba)) -#define min7(aaa,aab,aba,abb,baa,bab,bba) min(min(min(aaa,aab),min(aba,abb)),min(min(baa,bab),bba)) -#define min8(aaa,aab,aba,abb,baa,bab,bba,bbb) min(min(min(aaa,aab),min(aba,abb)),min(min(baa,bab),min(bba,bbb))) -#define min9(aaaa,aaab,aaba,aba,abb,baa,bab,bba,bbb) min(min(min(min(aaaa,aaab),aaba),min(aba,abb)),min(min(baa,bab),min(bba,bbb))) -#define min10(aaaa,aaab,aaba,aba,abb,baaa,baab,baba,bba,bbb) min(min(min(min(aaaa,aaab),aaba),min(aba,abb)),min(min(min(baaa,baab),baba),min(bba,bbb))) -#define min11(aaaa,aaab,aaba,abaa,abab,abba,baaa,baab,baba,bba,bbb) min(min(min(min(aaaa,aaab),aaba),min(min(abaa,abab),abba)),min(min(min(baaa,baab),baba),min(bba,bbb))) -#define min12(aaaa,aaab,aaba,abaa,abab,abba,baaa,baab,baba,bbaa,bbab,bbba) min(min(min(min(aaaa,aaab),aaba),min(min(abaa,abab),abba)),min(min(min(baaa,baab),baba),min(min(bbaa,bbab),bbba))) -#define min13(aaaa,aaab,aaba,aabb,abaa,abab,abba,baaa,baab,baba,bbaa,bbab,bbba) min(min(min(min(aaaa,aaab),min(aaba,aabb)),min(min(abaa,abab),abba)),min(min(min(baaa,baab),baba),min(min(bbaa,bbab),bbba))) -#define min14(aaaa,aaab,aaba,aabb,abaa,abab,abba,baaa,baab,baba,babb,bbaa,bbab,bbba) min(min(min(min(aaaa,aaab),min(aaba,aabb)),min(min(abaa,abab),abba)),min(min(min(baaa,baab),min(baba,babb)),min(min(bbaa,bbab),bbba))) -#define min15(aaaa,aaab,aaba,aabb,abaa,abab,abba,abbb,baaa,baab,baba,babb,bbaa,bbab,bbba) min(min(min(min(aaaa,aaab),min(aaba,aabb)),min(min(abaa,abab),min(abba,abbb))),min(min(min(baaa,baab),min(baba,babb)),min(min(bbaa,bbab),bbba))) -#define max2(a,b) max(a,b) -#define max3(aa,ab,ba) max(max(aa,ab),ba) -#define max4(aa,ab,ba,bb) max(max(aa,ab),max(ba,bb)) -#define max5(aaa,aab,aba,ba,bb) max(max(max(aaa,aab),aba),max(ba,bb)) -#define max6(aaa,aab,aba,baa,bab,bba) max(max(max(aaa,aab),aba),max(max(baa,bab),bba)) -#define max7(aaa,aab,aba,abb,baa,bab,bba) max(max(max(aaa,aab),max(aba,abb)),max(max(baa,bab),bba)) -#define max8(aaa,aab,aba,abb,baa,bab,bba,bbb) max(max(max(aaa,aab),max(aba,abb)),max(max(baa,bab),max(bba,bbb))) -#define max9(aaaa,aaab,aaba,aba,abb,baa,bab,bba,bbb) max(max(max(max(aaaa,aaab),aaba),max(aba,abb)),max(max(baa,bab),max(bba,bbb))) -#define max10(aaaa,aaab,aaba,aba,abb,baaa,baab,baba,bba,bbb) max(max(max(max(aaaa,aaab),aaba),max(aba,abb)),max(max(max(baaa,baab),baba),max(bba,bbb))) -#define max11(aaaa,aaab,aaba,abaa,abab,abba,baaa,baab,baba,bba,bbb) max(max(max(max(aaaa,aaab),aaba),max(max(abaa,abab),abba)),max(max(max(baaa,baab),baba),max(bba,bbb))) -#define max12(aaaa,aaab,aaba,abaa,abab,abba,baaa,baab,baba,bbaa,bbab,bbba) max(max(max(max(aaaa,aaab),aaba),max(max(abaa,abab),abba)),max(max(max(baaa,baab),baba),max(max(bbaa,bbab),bbba))) -#define max13(aaaa,aaab,aaba,aabb,abaa,abab,abba,baaa,baab,baba,bbaa,bbab,bbba) max(max(max(max(aaaa,aaab),max(aaba,aabb)),max(max(abaa,abab),abba)),max(max(max(baaa,baab),baba),max(max(bbaa,bbab),bbba))) -#define max14(aaaa,aaab,aaba,aabb,abaa,abab,abba,baaa,baab,baba,babb,bbaa,bbab,bbba) max(max(max(max(aaaa,aaab),max(aaba,aabb)),max(max(abaa,abab),abba)),max(max(max(baaa,baab),max(baba,babb)),max(max(bbaa,bbab),bbba))) -#define max15(aaaa,aaab,aaba,aabb,abaa,abab,abba,abbb,baaa,baab,baba,babb,bbaa,bbab,bbba) max(max(max(max(aaaa,aaab),max(aaba,aabb)),max(max(abaa,abab),max(abba,abbb))),max(max(max(baaa,baab),max(baba,babb)),max(max(bbaa,bbab),bbba))) -#endif // _GPUFORT_H_ diff --git a/include/gpufort_reductions.h b/include/gpufort_reductions.h deleted file mode 100644 index 7ea12c71..00000000 --- a/include/gpufort_reductions.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef _GPUFORT_REDUCTIONS_H_ -#define _GPUFORT_REDUCTIONS_H_ -// requires that gpufort.h is included beforehand -#include "hip/hip_runtime_api.h" -#include "hip/hip_runtime.h" -#include "hipcub/hipcub.hpp" -#include -// reductions -namespace { - struct reduce_op_mult { - template - static __host__ __device__ __forceinline__ T ival() { return (T)1; } - template - static __host__ __device__ __forceinline__ void init(T &a) { a = ival(); } - template - __device__ __forceinline__ T operator()(const T &a, const T &b) const { - return a * b; - } - }; - - struct reduce_op_add { - template - static __host__ __device__ __forceinline__ T ival() { return (T)0; } - template - static __host__ __device__ __forceinline__ void init(T &a) { a = ival(); } - template - __device__ __forceinline__ T operator()(const T &a, const T &b) const { - return a + b; - } - }; - - struct reduce_op_max { - template - static __host__ __device__ __forceinline__ T ival() { - return -std::numeric_limits::max(); // has negative sign - } - template - static __host__ __device__ __forceinline__ void init(T &a) { a = ival(); } - template - __device__ __forceinline__ T operator()(const T &a, const T &b) const { - return std::max(a, b); - } - }; - - struct reduce_op_min { - template - static __host__ __device__ __forceinline__ T ival() { - return std::numeric_limits::max(); - } - template - static __host__ __device__ __forceinline__ void init(T &a) { a = ival(); } - template - __device__ __forceinline__ T operator()(const T &a, const T &b) const { - return std::min(a, b); - } - }; - - template - void reduce(const T *const d_in, const int &NX, const T *h_out) { - T *d_out = nullptr; - HIP_CHECK(hipMalloc((void **)&d_out, sizeof(T))); - // Determine temporary device storage requirements - void *temp_storage = nullptr; - size_t temp_storage_bytes = 0; - ReduceOpT reduceOp; - hipcub::DeviceReduce::Reduce(temp_storage, temp_storage_bytes, d_in, d_out, NX, - ReduceOpT(), ReduceOpT::template ival()); - // Allocate temporary storage - HIP_CHECK(hipMalloc(&temp_storage, temp_storage_bytes)); - // Run reduction - hipcub::DeviceReduce::Reduce(temp_storage, temp_storage_bytes, d_in, d_out, NX, - ReduceOpT(), ReduceOpT::template ival()); - HIP_CHECK(hipMemcpy((void *)h_out, d_out, sizeof(T), hipMemcpyDeviceToHost)); - // Clean up - HIP_CHECK(hipFree(d_out)); - HIP_CHECK(hipFree(temp_storage)); - } -} -#endif // _GPUFORT_REDUCTIONS_H_ \ No newline at end of file diff --git a/python/fort2hip/fort2hip.py b/python/fort2hip/fort2hip.py index 6de25e59..6741ca69 100644 --- a/python/fort2hip/fort2hip.py +++ b/python/fort2hip/fort2hip.py @@ -619,14 +619,35 @@ def generate_gpufort_headers(output_dir): msg = "created gpufort arrays header file: ".ljust(40) + gpufort_arrays_header_file_path utils.logging.log_info(LOG_PREFIX,"generate_gpufort_headers",msg) + utils.logging.log_info(LOG_PREFIX,"generate_gpufort_headers",msg) + +def generate_gpufort_sources(output_dir): + """Create the source files that all GPUFORT HIP kernels rely on.""" + global LOG_PREFIX + global GPUFORT_HEADERS_MAX_DIM + + utils.logging.log_enter_function(LOG_PREFIX,"generate_gpufort_sources",\ + {"output_dir": output_dir}) + + # gpufort arrays + gpufort_arrays_context={ + "max_rank":GPUFORT_HEADERS_MAX_DIM, + "datatypes":GPUFORT_HEADERS_DATATYPES + } + gpufort_arrays_source_file_path = os.path.join(output_dir,"gpufort_arrays.hip.cpp") + model.GpufortArraysSourceModel().generate_file(gpufort_arrays_source_file_path,\ + context=gpufort_arrays_context) + msg = "created gpufort arrays C++ source file: ".ljust(40) + gpufort_arrays_source_file_path + utils.logging.log_info(LOG_PREFIX,"generate_gpufort_sources",msg) + gpufort_arrays_fortran_interfaces_module_path = os.path.join(output_dir,"gpufort_arrays.f03") model.GpufortArraysFortranInterfacesModel().generate_file(gpufort_arrays_fortran_interfaces_module_path,\ context=gpufort_arrays_context) msg = "created gpufort arrays Fortran interface module: ".ljust(40) + gpufort_arrays_fortran_interfaces_module_path - utils.logging.log_info(LOG_PREFIX,"generate_gpufort_headers",msg) - - utils.logging.log_leave_function(LOG_PREFIX,"generate_gpufort_headers") + utils.logging.log_info(LOG_PREFIX,"generate_gpufort_sources",msg) + utils.logging.log_leave_function(LOG_PREFIX,"generate_gpufort_sources") + utils.logging.log_leave_function(LOG_PREFIX,"generate_gpufort_sources") def generate_hip_files(stree,index,kernels_to_convert_to_hip,translation_source_path,generate_code): """ diff --git a/python/fort2hip/model.py b/python/fort2hip/model.py index 60e242d7..0181c9c1 100644 --- a/python/fort2hip/model.py +++ b/python/fort2hip/model.py @@ -49,6 +49,10 @@ class GpufortArraysHeaderModel(BaseModel): def __init__(self): BaseModel.__init__(self,"templates/gpufort_arrays.template.h") +class GpufortArraysSourceModel(BaseModel): + def __init__(self): + BaseModel.__init__(self,"templates/gpufort_arrays.template.hip.cpp") + class GpufortArraysFortranInterfacesModel(BaseModel): def __init__(self): BaseModel.__init__(self,"templates/gpufort_arrays.template.f03") diff --git a/python/fort2hip/templates/gpufort_arrays.template.f03 b/python/fort2hip/templates/gpufort_arrays.template.f03 index 46e7efe7..f5f9347a 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.f03 +++ b/python/fort2hip/templates/gpufort_arrays.template.f03 @@ -1,7 +1,7 @@ {# SPDX-License-Identifier: MIT #} {# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} module gpufort_arrays - use iso_c_bindings + use iso_c_binding ! NOTE: the below types must have exactly the ! same data layout as the corresponding ! gpufort C/C++ structs. @@ -21,10 +21,10 @@ module gpufort_arrays type, bind(c) :: gpufort_mapped_array_{{rank}} type(gpufort_gpu_array_{{rank}}) :: data type(c_ptr) :: stream = c_null_ptr; - logical(c_bool) :: pinned = false; !> If the host data is pinned. - logical(c_bool) :: copyout_at_destruction = false; !> If the device data should be copied back to the host when this struct is destroyed. - logical(c_bool) :: owns_host_data = false; !> If this is only a wrapper, i.e. no memory management is performed. - logical(c_bool) :: owns_device_data = false; !> If this is only a wrapper, i.e. no memory management is performed. + logical(c_bool) :: pinned = .false.; !> If the host data is pinned. + logical(c_bool) :: copyout_at_destruction = .false.; !> If the device data should be copied back to the host when this struct is destroyed. + logical(c_bool) :: owns_host_data = .false.; !> If this is only a wrapper, i.e. no memory management is performed. + logical(c_bool) :: owns_device_data = .false.; !> If this is only a wrapper, i.e. no memory management is performed. integer(c_int) :: num_refs = 0; !> Number of references. end type{{"\n" if not loop.last}} {% endfor %} diff --git a/python/fort2hip/templates/gpufort_arrays.template.h b/python/fort2hip/templates/gpufort_arrays.template.h index 1ddd408a..9fc70a91 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.h +++ b/python/fort2hip/templates/gpufort_arrays.template.h @@ -4,12 +4,12 @@ {% import "templates/gpufort_arrays.macros.h" as gam %} // This file was generated from a template via gpufort --gpufort-create-headers #ifndef _GPUFORT_ARRAYS_H_ -#define _GPUFORT_ARRAYS_H_ -#include -#ifndef _GPUFORT_H_ -#include -#include -#define HIP_CHECK(condition) \ +# define _GPUFORT_ARRAYS_H_ +# include +# ifndef _GPUFORT_H_ +# include +# include +# define HIP_CHECK(condition) \ { \ hipError_t error = condition; \ if(error != hipSuccess){ \ @@ -192,7 +192,7 @@ namespace gpufort { (void*) this->data.data_host, (void*) this->data.data_dev, this->num_data_bytes(), - hipMemcpyDeviceToHost,this->stream); + hipMemcpyDeviceToHost, this->stream); } /** @@ -203,8 +203,8 @@ namespace gpufort { return hipMemcpyAsync( (void*) this->data.data_dev, (void*) this->data.data_host, - this->num_data_bytes(), - hipMemcpyHostToDevice,this->stream); + this->num_data_bytes(), + hipMemcpyHostToDevice, this->stream); } /** @@ -217,10 +217,11 @@ namespace gpufort { const size_t size = sizeof(MappedArray{{rank}}); hipError_t ierr = hipMalloc(device_copy,size); if ( ierr == hipSuccess ) { - ierr = hipMemcpyH2DAsync( + ierr = hipMemcpyAsync( (void*) *device_copy, (void*) this, - size, this->stream); + size, + hipMemcpyHostToDevice, this->stream); } return ierr; } @@ -240,7 +241,4 @@ namespace gpufort { {{ "" if not loop.last }} {% endfor -%} } - -// C bindings -{{ gam.gpufort_arrays_c_bindings(datatypes,max_rank) }} -#endif // _GPUFORT_ARRAYS_H_ \ No newline at end of file +#endif // _GPUFORT_ARRAYS_H_ diff --git a/python/gpufort.py b/python/gpufort.py index 13c7e90c..55f3d7f6 100644 --- a/python/gpufort.py +++ b/python/gpufort.py @@ -174,8 +174,10 @@ def parse_cl_args(): parser.add_argument("-d","--search-dirs", dest="search_dirs", help="Module search dir. Alternative -I can be used (multiple times).", nargs="*", required=False, default=[], type=str) parser.add_argument("-w","--wrap-in-ifdef",dest="wrap_in_ifdef",action="store_true",help="Wrap converted lines into ifdef in host code.") parser.add_argument("-E","--dest-dialect",dest="destination_dialect",default=None,type=str,help="One of: {}".format(", ".join(scanner.SUPPORTED_DESTINATION_DIALECTS))) - parser.add_argument("--gfortran_config",dest="print_gfortran_config",action="store_true",help="Print include and compile flags.") - parser.add_argument("--cpp_config",dest="print_cpp_config",action="store_true",help="Print include and compile flags.") + parser.add_argument("--gfortran_config",dest="print_gfortran_config",action="store_true",help="Print include and compile flags; output is influenced by HIP_PLATFORM environment variable.") + parser.add_argument("--cpp_config",dest="print_cpp_config",action="store_true",help="Print include and compile flags; output is influenced by HIP_PLATFORM environment variable.") + parser.add_argument("--ldflags",dest="print_ldflags",action="store_true",help="Print linker flags; output is influenced by HIP_PLATFORM environment variable.") + parser.add_argument("--ldflags-gpufort-rt",dest="print_ldflags_gpufort_rt",action="store_true",help="Print GPUFORT OpenACC runtime linker flags; output is influenced by HIP_PLATFORM environment variable.") parser.add_argument("--path",dest="print_path",action="store_true",help="Print path to the GPUFORT root directory.") # config options: shadow arguments that are actually taken care of by raw argument parsing group_config = parser.add_argument_group('Config file') @@ -205,12 +207,15 @@ def parse_cl_args(): group_developer.add_argument("--prof",dest="profiling_enable",required=False,action="store_true",help="Profile gpufort.") group_developer.add_argument("--prof-num-functions",dest="profiling_num_functions",required=False,type=int,default=50,help="The number of python functions to include into the summary [default=50].") group_developer.add_argument("--create-gpufort-headers",dest="create_gpufort_headers",action="store_true",help="Generate the GPUFORT header files.") + group_developer.add_argument("--create-gpufort-sources",dest="create_gpufort_sources",action="store_true",help="Generate the GPUFORT source files.") parser.set_defaults(print_config_defaults=False, dump_linemaps=False,wrap_in_ifdef=False,cublasV2=False, only_emit_kernels_and_launchers=False,only_emit_kernels=False,only_modify_translation_source=False,\ emit_cpu_implementation=False,emit_debug_code=False,\ - create_gpufort_headers=False,print_gfortran_config=False,print_cpp_config=False,\ + create_gpufort_headers=False,create_gpufort_sources=False,\ + print_gfortran_config=False,print_cpp_config=False,\ + print_ldflags=False,print_ldflags_gpufort_rt=False, only_create_gpufort_module_files=False,skip_create_gpufort_module_files=False,verbose=False,\ log_traceback=False,profiling_enable=False) args, unknown_args = parser.parse_known_args() @@ -219,19 +224,37 @@ def parse_cl_args(): if args.print_path: print(__GPUFORT_ROOT_DIR,file=sys.stdout) sys.exit() + hip_platform=os.environ.get("HIP_PLATFORM","amd") if args.print_cpp_config: cpp_config = "-D"+linemapper.LINE_GROUPING_IFDEF_MACRO - cpp_config += " -I"+__GPUFORT_ROOT_DIR+"/include" + cpp_config += " -I"+os.path.join(__GPUFORT_ROOT_DIR,"include") + cpp_config += " -I"+os.path.join(__GPUFORT_ROOT_DIR,"include",hip_platform) print(cpp_config,file=sys.stdout) sys.exit() if args.print_gfortran_config: fortran_config = " -cpp -std=f2008 -ffree-line-length-none" fortran_config += " -D"+linemapper.LINE_GROUPING_IFDEF_MACRO - fortran_config += " -I"+__GPUFORT_ROOT_DIR+"/include" + fortran_config += " -I"+os.path.join(__GPUFORT_ROOT_DIR,"include") + fortran_config += " -I"+os.path.join(__GPUFORT_ROOT_DIR,"include",hip_platform) print(fortran_config,file=sys.stdout) sys.exit() + if args.print_ldflags: + ldflags = " -L"+os.path.join(__GPUFORT_ROOT_DIR,"lib") + " -lgpufort_"+hip_platform + print(ldflags,file=sys.stdout) + sys.exit() + if args.print_ldflags_gpufort_rt: + ldflags = " -L"+os.path.join(__GPUFORT_ROOT_DIR,"lib") + " -lgpufort_acc_"+hip_platform + ldflags += " -lgpufort_"+hip_platform + print(ldflags,file=sys.stdout) + sys.exit() + call_exit = False if args.create_gpufort_headers: fort2hip.generate_gpufort_headers(os.getcwd()) + call_exit = True + if args.create_gpufort_sources: + fort2hip.generate_gpufort_sources(os.getcwd()) + call_exit = True + if call_exit: sys.exit() if args.print_config_defaults: gpufort_python_dir=os.path.dirname(os.path.realpath(__file__)) diff --git a/runtime/gpufort_acc_runtime/Makefile b/runtime/gpufort_acc_runtime/Makefile index 0b72a31a..60d76cf6 100644 --- a/runtime/gpufort_acc_runtime/Makefile +++ b/runtime/gpufort_acc_runtime/Makefile @@ -1,6 +1,8 @@ include rules.mk -.PHONY: build codegen all clean +.PHONY: build codegen lib/$(LIBGPUFORT_ACC) clean + +lib/$(LIBGPUFORT_ACC): | codegen build codegen: python3 codegen.py src/gpufort_acc_runtime.template.f90 -d 7 @@ -8,13 +10,11 @@ codegen: build: mkdir -p lib/ mkdir -p include/ - make -C src/ libgpufort_acc.a + make -C src/ $(LIBGPUFORT_ACC) mv src/*.mod include/ - mv src/libgpufort_acc.a lib/ + mv src/$(LIBGPUFORT_ACC) lib/ make -C src/ clean -all: | codegen build - clean: make -C src/ clean rm -rf include/ lib/ diff --git a/runtime/gpufort_acc_runtime/rules.mk b/runtime/gpufort_acc_runtime/rules.mk index ff10002f..64e77932 100644 --- a/runtime/gpufort_acc_runtime/rules.mk +++ b/runtime/gpufort_acc_runtime/rules.mk @@ -8,6 +8,9 @@ else FCFLAGS += -I/$(HIPFORT_PATH)/include/amdgcn endif +SUFFIX ?= $(if $(HIP_PLATFORM),$(HIP_PLATFORM),amd) +LIBGPUFORT_ACC = libgpufort_acc_$(SUFFIX).a + FCFLAGS += -DNULLPTR_MEANS_NOOP -DDELETE_NORECORD_MEANS_NOOP #FCFLAGS += -DBLOCKING_COPIES #FCFLAGS += -DEXIT_REGION_SYNCHRONIZE_STREAMS diff --git a/runtime/gpufort_acc_runtime/src/Makefile b/runtime/gpufort_acc_runtime/src/Makefile index 67fddda1..8143d10d 100644 --- a/runtime/gpufort_acc_runtime/src/Makefile +++ b/runtime/gpufort_acc_runtime/src/Makefile @@ -3,9 +3,9 @@ include ../rules.mk .PHONY: clean CXX_OBJ = gpufort_acc_runtime_c_impl.o -F_OBJ = gpufort_acc_runtime_c_bindings.o gpufort_acc_runtime_base.o gpufort_acc_runtime.o +F_OBJ = gpufort_acc_runtime_c_bindings.o gpufort_acc_runtime_base.o gpufort_acc_runtime.o -libgpufort_acc.a: $(CXX_OBJ) $(F_OBJ) +$(LIBGPUFORT_ACC): $(CXX_OBJ) $(F_OBJ) ar -crs $@ $^ $(CXX_OBJ): %.o: %.cpp @@ -15,4 +15,4 @@ $(F_OBJ): %.o: %.f90 $(FC) -c $< $(FCFLAGS) clean: - rm -f *.o *.mod *.a \ No newline at end of file + rm -f *.o *.mod *.a diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 00000000..86f34258 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,40 @@ +# compiler options +FC ?= gfortran +HIPCC ?= hipcc + +GPUFORT_INC = -I$(shell gpufort --path)/include + +FC_CFLAGS ?= -std=f2008 -ffree-line-length-none -cpp +HIPCC_CFLAGS ?= -fPIC +SUFFIX ?= $(if $(HIP_PLATFORM),$(HIP_PLATFORM),amd) +LIBGPUFORT = libgpufort_$(SUFFIX).a + +# files +HIP_SRC = $(shell find . -name "*.hip.cpp") +FORT_SRC = $(shell find . -name "*.f03") + +HIP_OBJ = $(HIP_SRC:%.hip.cpp=%.hip.o) +FORT_OBJ = $(FORT_SRC:%.f03=%.o) + +# targets +.PHONY: all clean clean_all generate_gpufort_sources $(LIBGPUFORT) + +all: generate_gpufort_sources $(LIBGPUFORT) + +generate_gpufort_sources: + gpufort --create-gpufort-sources + +$(HIP_OBJ): %.hip.o: %.hip.cpp + $(HIPCC) $(GPUFORT_INC) $(HIPCC_CFLAGS) -c $^ -o $@ + +$(FORT_OBJ): %.o: %.f03 + $(FC) $(FC_CFLAGS) -c $^ -o $@ + +$(LIBGPUFORT): $(FORT_OBJ) $(HIP_OBJ) + ar -crs $@ $^ + +clean: + rm -f $(FORT_OBJ) $(HIP_OBJ) *.mod $(LIBGPUFORT) + +clean_all: clean + rm -f $(FORT_SRC) $(HIP_SRC) From 0e02b21c7b724ac68ebd4642c68b28eeeb7b954d Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 10 Nov 2021 12:59:40 -0500 Subject: [PATCH 30/67] gpufort_options: change config default value of DUMP_LINEMAPS --- python/gpufort_options.py.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/gpufort_options.py.in b/python/gpufort_options.py.in index 66ce03f1..dc901768 100644 --- a/python/gpufort_options.py.in +++ b/python/gpufort_options.py.in @@ -41,6 +41,6 @@ PROFILING_ENABLE = False PROFILING_OUTPUT_NUM_FUNCTIONS = 50 # Number of functions to output when profiling GPUFORT -DUMP_LINEMAPS = True +DUMP_LINEMAPS = False # Write the lines-to-statements mappings to disk before & after # applying code transformations; suffix="-linemaps-(pre|post).json" From 773b83017d6ba9209b7774fcac88db1edf89024d Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 10 Nov 2021 14:15:13 -0500 Subject: [PATCH 31/67] Makefile: mv mod files into platform subfolder --- Makefile | 1 + test/{gpufort_headers => gpufort_arrays}/Makefile | 0 .../test_compile_headers.hip.cpp | 0 .../test_gpufort_arrays.hip.cpp | 0 4 files changed, 1 insertion(+) rename test/{gpufort_headers => gpufort_arrays}/Makefile (100%) rename test/{gpufort_headers => gpufort_arrays}/test_compile_headers.hip.cpp (100%) rename test/{gpufort_headers => gpufort_arrays}/test_gpufort_arrays.hip.cpp (100%) diff --git a/Makefile b/Makefile index 6da1aab4..82152784 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,7 @@ generate_gpufort_sources: lib/$(LIBGPUFORT): generate_gpufort_headers generate_gpufort_sources mkdir -p $(GPUFORT_DIR)/lib mv $(GPUFORT_DIR)/src/$(LIBGPUFORT) $(GPUFORT_DIR)/lib + mv $(GPUFORT_DIR)/src/*.mod $(GPUFORT_DIR)/include/$(SUFFIX) make -C $(GPUFORT_DIR)/src clean lib/$(LIBGPUFORT_ACC): diff --git a/test/gpufort_headers/Makefile b/test/gpufort_arrays/Makefile similarity index 100% rename from test/gpufort_headers/Makefile rename to test/gpufort_arrays/Makefile diff --git a/test/gpufort_headers/test_compile_headers.hip.cpp b/test/gpufort_arrays/test_compile_headers.hip.cpp similarity index 100% rename from test/gpufort_headers/test_compile_headers.hip.cpp rename to test/gpufort_arrays/test_compile_headers.hip.cpp diff --git a/test/gpufort_headers/test_gpufort_arrays.hip.cpp b/test/gpufort_arrays/test_gpufort_arrays.hip.cpp similarity index 100% rename from test/gpufort_headers/test_gpufort_arrays.hip.cpp rename to test/gpufort_arrays/test_gpufort_arrays.hip.cpp From a5760c8408f1d642e1411c6f7476ba114b364ce1 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 10 Nov 2021 17:25:00 -0500 Subject: [PATCH 32/67] WiP on gpufort array type interfacing (unstable) --- python/fort2hip/fort2hip_options.py.in | 1 + .../templates/gpufort_arrays.macros.f03 | 295 +++++++++++++++--- .../templates/gpufort_arrays.macros.h | 31 +- .../templates/gpufort_arrays.template.f03 | 9 + .../templates/gpufort_arrays.template.h | 15 +- .../fort2hip/templates/gpufort_macros.jinja2 | 21 -- test/gpufort_arrays/Makefile | 28 +- 7 files changed, 296 insertions(+), 104 deletions(-) delete mode 100644 python/fort2hip/templates/gpufort_macros.jinja2 diff --git a/python/fort2hip/fort2hip_options.py.in b/python/fort2hip/fort2hip_options.py.in index 246f6ef8..062c9af6 100644 --- a/python/fort2hip/fort2hip_options.py.in +++ b/python/fort2hip/fort2hip_options.py.in @@ -47,6 +47,7 @@ GPUFORT_HEADERS_MAX_DIM = 7 # this dimension. GPUFORT_HEADERS_DATATYPES = [ {"c_type":"bool","f_type":"c_bool"}, + {"c_type":"char","f_type":"c_char"}, {"c_type":"short","f_type":"c_short"}, {"c_type":"int","f_type":"c_int"}, {"c_type":"long","f_type":"c_long"}, diff --git a/python/fort2hip/templates/gpufort_arrays.macros.f03 b/python/fort2hip/templates/gpufort_arrays.macros.f03 index 0971ecf2..5f094d4c 100644 --- a/python/fort2hip/templates/gpufort_arrays.macros.f03 +++ b/python/fort2hip/templates/gpufort_arrays.macros.f03 @@ -1,62 +1,253 @@ {# SPDX-License-Identifier: MIT #} {# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} {# Fortran side #} +{% import "templates/gpufort.macros.h" as gm %} {%- macro gpufort_arrays_fortran_interfaces(datatypes,max_rank) -%} -interface gpufort_mapped_array_init +{% set main_prefix = "gpufort_mapped_array" %} +{% set max_rank_ub = max_rank+1 %} {% for tuple in datatypes %} -{% for rank in range(1,max_rank+1) %} - function gpufort_mapped_array{{rank}}_{{datatype}}_init ( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array, - {{f_type}}, data_host, - {{f_type}} data_dev, -{{ gm.bound_args("const int ",rank) | indent(6,True) }}, - bool pinned, - hipStream_t stream, - bool copyout_at_destruction - ) { - return mapped_array->init( - data_host, data_dev, -{{ gm.bound_args_single_line("",rank) | indent(6,True) }}, - pinned, stream, copyout_at_destruction - ); - } +{% set c_type = tuple.c_type %} +{% set f_type = tuple.f_type %} +interface {{main_prefix}}_{{f_type}}_init_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string %} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} + function {{f_prefix}}_init_b (& + mapped_array,data_host,data_dev,& +{{ gm.separated_list_single_line("n",",",rank) | indent(6,True) }},& +{{ gm.separated_list_single_line("lb",",",rank) | indent(6,True) }},& + pinned, stream, copyout_at_destruction) & + bind(c,name="{{c_prefix}}_init") & + result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array + type(c_ptr),intent(in),value :: data_host, data_dev, stream + integer(c_int),intent(in),value :: & +{{ gm.separated_list_single_line("n",",",rank) | indent(6,True) }},& +{{ gm.separated_list_single_line("lb",",",rank) | indent(6,True) }} + logical(c_bool),intent(in),value :: pinned, copyout_at_destruction + integer(kind(hipSuccess)) :: ierr + end function +{% endfor %} +end interface + +interface {{main_prefix}}_{{f_type}}_destroy_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string %} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} + function {{f_prefix}}_destroy(mapped_array) & + bind(c,name="{{c_prefix}}_destroy") result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array + integer(kind(hipSuccess)) :: ierr + end function +{% endfor %} +end interface + +interface {{main_prefix}}_{{f_type}}_copy_data_to_host_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string %} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} + function {{f_prefix}}_copy_data_to_host(mapped_array) & + bind(c,name="{{c_prefix}}_copy_data_to_host") result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array_ + integer(kind(hipSuccess)) :: ierr + end function +{% endfor %} +end interface + +interface {{main_prefix}}_{{f_type}}_copy_data_to_device_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string %} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} + function {{f_prefix}}_copy_data_to_device(mapped_array) & + bind(c,name="{{c_prefix}}_copy_data_to_device") result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array + integer(kind(hipSuccess)) :: ierr + end function +{% endfor %} +end interface + +interface {{main_prefix}}_{{f_type}}_inc_num_refs_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string %} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} + function {{f_prefix}}_inc_num_refs(mapped_array) & + bind(c,name="{{c_prefix}}_inc_num_refs") result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array + integer(kind(hipSuccess)) :: ierr + end function +{% endfor %} +end interface + +interface {{main_prefix}}_{{f_type}}_dec_num_refs_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string -%} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type -%} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type -%} + function {{f_prefix}}_dec_num_refs(mapped_array,destroy_if_zero_refs) & + bind(c,name="{{c_prefix}}_dec_num_refs") result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array + logical(c_bool),intent(in),value :: destroy_if_zero_refs + integer(kind(hipSuccess)) :: ierr + end function +{% endfor %} +end interface +{% endfor %} +{%- endmacro -%} +{# type and rank generic interfaces #} +{%- macro gpufort_arrays_fortran_interfaces_generic(datatypes,max_rank) -%} +{% set main_prefix = "gpufort_mapped_array" %} +{% set max_rank_ub = max_rank+1 %} +{% for suffix in ["_init","_destroy","_copy_data_to_host","_copy_data_to_device","_inc_num_refs","_dec_num_refs"] %} +interface {{main_prefix}}{{suffix}} + module procedure :: & +{% for tuple in datatypes %} +{% set c_type = tuple.c_type %} +{% set f_type = tuple.f_type %} +{% for rank in range(1,max_rank_ub) %} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type -%} +{% set routine = f_prefix + suffix %} +{{ routine | indent(4,True) }}{{",&\n" if not loop.last }} +{%- endfor -%}{{",&\n" if not loop.last else "\n" }} +{%- endfor -%} end interface +{% endfor %} +{%- endmacro -%} +{# Routines calling the C bindings #} +{%- macro gpufort_arrays_fortran_interfaces(datatypes,max_rank) -%} +{% set main_prefix = "gpufort_mapped_array" %} +{% set max_rank_ub = max_rank+1 %} +{% for tuple in datatypes %} +{% set c_type = tuple.c_type %} +{% set f_type = tuple.f_type %} +interface {{main_prefix}}_{{f_type}}_init_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string %} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} + function {{f_prefix}}_init_b (& + mapped_array,data_host,data_dev,& +{{ gm.separated_list_single_line("n",",",rank) | indent(6,True) }},& +{{ gm.separated_list_single_line("lb",",",rank) | indent(6,True) }},& + pinned, stream, copyout_at_destruction) & + bind(c,name="{{c_prefix}}_init") & + result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array + type(c_ptr),intent(in),value :: data_host, data_dev, stream + integer(c_int),intent(in),value :: & +{{ gm.separated_list_single_line("n",",",rank) | indent(6,True) }},& +{{ gm.separated_list_single_line("lb",",",rank) | indent(6,True) }} + logical(c_bool),intent(in),value :: pinned, copyout_at_destruction + integer(kind(hipSuccess)) :: ierr + end function +{% endfor %} +end interface +{% endfor %} - function gpufort_mapped_array{{rank}}_{{datatype}}_destroy( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array - ) { - return mapped_array->destroy(); - } - - function gpufort_mapped_array{{rank}}_{{datatype}}_copy_data_to_host ( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array - ) { - return mapped_array->copy_data_to_host(); - } - - function gpufort_mapped_array{{rank}}_{{datatype}}_copy_data_to_device ( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array - ) { - return mapped_array->copy_data_to_device(); - } - - __host__ void gpufort_mapped_array{{rank}}_{{datatype}}_inc_num_refs( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array - ) { - mapped_array->num_refs += 1; - } - - function gpufort_mapped_array{{rank}}_{{datatype}}_dec_num_refs( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array, - bool destroy_if_zero_refs - ) { - mapped_array->num_refs -= 1; - if ( destroy_if_zero_refs && mapped_array->num_refs == 0 ) { - return mapped_array->destroy(); - } { - return hipSuccess; - } - } +interface {{main_prefix}}_{{f_type}}_destroy_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string %} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} + function {{f_prefix}}_destroy(mapped_array) & + bind(c,name="{{c_prefix}}_destroy") result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array + integer(kind(hipSuccess)) :: ierr + end function +{% endfor %} +end interface + +interface {{main_prefix}}_{{f_type}}_copy_data_to_host_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string %} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} + function {{f_prefix}}_copy_data_to_host(mapped_array) & + bind(c,name="{{c_prefix}}_copy_data_to_host") result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array_ + integer(kind(hipSuccess)) :: ierr + end function +{% endfor %} +end interface + +interface {{main_prefix}}_{{f_type}}_copy_data_to_device_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string %} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} + function {{f_prefix}}_copy_data_to_device(mapped_array) & + bind(c,name="{{c_prefix}}_copy_data_to_device") result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array + integer(kind(hipSuccess)) :: ierr + end function +{% endfor %} +end interface + +interface {{main_prefix}}_{{f_type}}_inc_num_refs_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string %} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} + function {{f_prefix}}_inc_num_refs(mapped_array) & + bind(c,name="{{c_prefix}}_inc_num_refs") result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array + integer(kind(hipSuccess)) :: ierr + end function +{% endfor %} +end interface + +interface {{main_prefix}}_{{f_type}}_dec_num_refs_ +{% for rank in range(1,max_rank_ub) %} +{% set f_array = main_prefix+"_"+rank|string -%} +{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type -%} +{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type -%} + function {{f_prefix}}_dec_num_refs(mapped_array,destroy_if_zero_refs) & + bind(c,name="{{c_prefix}}_dec_num_refs") result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + type({{f_array}}),intent(inout) :: mapped_array + logical(c_bool),intent(in),value :: destroy_if_zero_refs + integer(kind(hipSuccess)) :: ierr + end function {% endfor %} +end interface {% endfor %} {%- endmacro -%} diff --git a/python/fort2hip/templates/gpufort_arrays.macros.h b/python/fort2hip/templates/gpufort_arrays.macros.h index af4b95fc..e977fd7a 100644 --- a/python/fort2hip/templates/gpufort_arrays.macros.h +++ b/python/fort2hip/templates/gpufort_arrays.macros.h @@ -6,12 +6,13 @@ {# C side #} extern "C" { {% for tuple in datatypes %} -{% set datatype = tuple.c_type %} +{% set c_type = tuple.c_type %} {% for rank in range(1,max_rank+1) %} - __host__ hipError_t gpufort_mapped_array{{rank}}_{{datatype}}_init ( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array, - {{datatype}}* data_host, - {{datatype}}* data_dev, +{% set c_prefix = "gpufort_mapped_array_"+rank|string+"_"+c_type %} + __host__ hipError_t {{c_prefix}}_init ( + gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, + {{c_type}}* data_host, + {{c_type}}* data_dev, {{ gm.bound_args("const int ",rank) | indent(6,True) }}, bool pinned, hipStream_t stream, @@ -24,32 +25,32 @@ extern "C" { ); } - __host__ hipError_t gpufort_mapped_array{{rank}}_{{datatype}}_destroy( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + __host__ hipError_t {{c_prefix}}_destroy( + gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array ) { return mapped_array->destroy(); } - __host__ hipError_t gpufort_mapped_array{{rank}}_{{datatype}}_copy_data_to_host ( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + __host__ hipError_t {{c_prefix}}_copy_data_to_host ( + gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array ) { return mapped_array->copy_data_to_host(); } - __host__ hipError_t gpufort_mapped_array{{rank}}_{{datatype}}_copy_data_to_device ( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + __host__ hipError_t {{c_prefix}}_copy_data_to_device ( + gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array ) { return mapped_array->copy_data_to_device(); } - __host__ void gpufort_mapped_array{{rank}}_{{datatype}}_inc_num_refs( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array + __host__ void {{c_prefix}}_inc_num_refs( + gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array ) { mapped_array->num_refs += 1; } - __host__ hipError_t gpufort_mapped_array{{rank}}_{{datatype}}_dec_num_refs( - gpufort::MappedArray{{rank}}<{{datatype}}>* mapped_array, + __host__ hipError_t {{c_prefix}}_dec_num_refs( + gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, bool destroy_if_zero_refs ) { mapped_array->num_refs -= 1; diff --git a/python/fort2hip/templates/gpufort_arrays.template.f03 b/python/fort2hip/templates/gpufort_arrays.template.f03 index f5f9347a..2b7ecf1c 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.f03 +++ b/python/fort2hip/templates/gpufort_arrays.template.f03 @@ -1,5 +1,6 @@ {# SPDX-License-Identifier: MIT #} {# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} +{% import "templates/gpufort_arrays.macros.f03" as gam %} module gpufort_arrays use iso_c_binding ! NOTE: the below types must have exactly the @@ -26,6 +27,14 @@ module gpufort_arrays logical(c_bool) :: owns_host_data = .false.; !> If this is only a wrapper, i.e. no memory management is performed. logical(c_bool) :: owns_device_data = .false.; !> If this is only a wrapper, i.e. no memory management is performed. integer(c_int) :: num_refs = 0; !> Number of references. + integer(c_size_t) :: bytes_per_element = 0; !> Number of references. end type{{"\n" if not loop.last}} {% endfor %} + + ! interfaces +{{ gam.gpufort_arrays_fortran_interfaces(datatypes,max_rank) | indent(2,True) }} + +{{ gam.gpufort_arrays_fortran_interfaces_generic(datatypes,max_rank) | indent(2,True) }} + + ! subroutines end module gpufort_arrays diff --git a/python/fort2hip/templates/gpufort_arrays.template.h b/python/fort2hip/templates/gpufort_arrays.template.h index 9fc70a91..59bf1721 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.h +++ b/python/fort2hip/templates/gpufort_arrays.template.h @@ -98,11 +98,12 @@ namespace gpufort { struct MappedArray{{rank}}{ GpuArray{{rank}} data; hipStream_t stream = nullptr; - bool pinned = false; //> If the host data is pinned. - bool copyout_at_destruction = false; //> If the device data should be copied back to the host when this struct is destroyed. - bool owns_host_data = false; //> If this is only a wrapper, i.e. no memory management is performed. - bool owns_device_data = false; //> If this is only a wrapper, i.e. no memory management is performed. - int num_refs = 0; //> Number of references. + bool pinned = false; //> If the host data is pinned. + bool copyout_at_destruction = false; //> If the device data should be copied back to the host when this struct is destroyed. + bool owns_host_data = false; //> If this is only a wrapper, i.e. no memory management is performed. + bool owns_device_data = false; //> If this is only a wrapper, i.e. no memory management is performed. + int num_refs = 0; //> Number of references. + size_t bytes_per_element = sizeof(T); //> Bytes per element; stored to make num_data_bytes routine independent of T /** * Initialize. @@ -180,7 +181,7 @@ namespace gpufort { } __host__ size_t num_data_bytes() { - return this->data.num_elements * sizeof(T); + return this->data.num_elements * this->bytes_per_element; } /** @@ -214,7 +215,7 @@ namespace gpufort { * \param[inout] device_copy pointer to device copy pointer */ __host__ hipError_t create_device_copy(void** device_copy) { - const size_t size = sizeof(MappedArray{{rank}}); + const size_t size = sizeof(MappedArray{{rank}}); // sizeof(T*) = sizeof(char*) hipError_t ierr = hipMalloc(device_copy,size); if ( ierr == hipSuccess ) { ierr = hipMemcpyAsync( diff --git a/python/fort2hip/templates/gpufort_macros.jinja2 b/python/fort2hip/templates/gpufort_macros.jinja2 deleted file mode 100644 index c2bc01b0..00000000 --- a/python/fort2hip/templates/gpufort_macros.jinja2 +++ /dev/null @@ -1,21 +0,0 @@ - -{%- macro separated_list_single_line(prefix,sep,rank) -%} -{% for d in range(1,rank+1) -%} -{{prefix}}{{d}}{{ sep if not loop.last }}{%- endfor %} -{%- endmacro -%} -{%- macro separated_list(prefix,sep,rank) -%} -{% for d in range(1,rank+1) -%} -{{prefix}}{{d}}{{ sep+"\n" if not loop.last }} -{%- endfor %} -{%- endmacro -%} -{%- macro arglist(prefix,rank) -%} -{{ separated_list(prefix,",",rank) }} -{%- endmacro -%} -{%- macro bound_args(prefix,rank) -%} -{{ arglist(prefix+"n",rank) }}, -{{ arglist(prefix+"lb",rank) }} -{%- endmacro -%} -{%- macro bound_args_single_line(prefix,rank) -%} -{{ separated_list_single_line(prefix+"n",",",rank) }}, -{{ separated_list_single_line(prefix+"lb",",",rank) }} -{%- endmacro -%} diff --git a/test/gpufort_arrays/Makefile b/test/gpufort_arrays/Makefile index cf1f6977..f646f742 100644 --- a/test/gpufort_arrays/Makefile +++ b/test/gpufort_arrays/Makefile @@ -1,13 +1,23 @@ -TEST_SRC = test_compile_headers.hip.cpp test_gpufort_arrays.hip.cpp -TEST_APP = $(TEST_SRC:.hip.cpp=.x) +HIP_TEST_SRC = test_compile_headers.hip.cpp test_gpufort_arrays.hip.cpp +HIP_TEST_APP = $(HIP_TEST_SRC:.hip.cpp=.x) -.PHONY: generate_headers clean +FORT_TEST_SRC = test_gpufort_arrays_interop.f03 +FORT_TEST_APP = $(FORT_TEST_SRC:.f03=.x) +FORT_TEST_DEPS = test_gpufort_arrays_interop.hip.o -$(TEST_APP): %.x: %.hip.cpp - hipcc $^ -o $@ - -generate_headers: - gpufort --create-gpufort-headers +HIPCC_CFLAGS ?= $(shell gpufort --cpp_config) +FC_CFLAGS ?= $(shell gpufort --gfortran_config) + +.PHONY: clean $(HIP_TEST_APP) + +$(HIP_TEST_APP): %.x: %.hip.cpp + hipcc $(HIPCC_CFLAGS) $^ -o $@ + +%.hip.o: %.hip.cpp + hipcc -c $(HIPCC_CFLAGS) $^ -o $@ + +$(FORT_TEST_APP): %.x: %.f03 $(FORT_TEST_DEPS) + hipfc $(FC_CFLAGS) -c $^ -o $@ clean: - rm $(TEST_APP) -f gpufort.h gpufort_reductions.h gpufort_arrays.h + rm -f $(HIP_TEST_APP) From 4ca345597ccdd242af65f933010e49e5d9ea7b25 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 11 Nov 2021 14:42:18 -0500 Subject: [PATCH 33/67] WiP on array types: Add interoperability example. --- Makefile | 13 +- python/fort2hip/fort2hip_options.py.in | 15 +- .../templates/gpufort_arrays.macros.f03 | 347 +++++++----------- .../templates/gpufort_arrays.macros.h | 38 +- .../templates/gpufort_arrays.template.f03 | 19 +- .../templates/gpufort_arrays.template.h | 139 ++++--- .../templates/gpufort_arrays.template.hip.cpp | 8 + runtime/gpufort_acc_runtime/rules.mk | 2 +- src/Makefile | 10 +- test/gpufort_arrays/Makefile | 17 +- .../test_gpufort_arrays.hip.cpp | 78 ++-- .../test_gpufort_arrays_interop.f03 | 155 ++++++++ .../test_gpufort_arrays_kernels.hip.cpp | 48 +++ 13 files changed, 540 insertions(+), 349 deletions(-) create mode 100644 python/fort2hip/templates/gpufort_arrays.template.hip.cpp create mode 100644 test/gpufort_arrays/test_gpufort_arrays_interop.f03 create mode 100644 test/gpufort_arrays/test_gpufort_arrays_kernels.hip.cpp diff --git a/Makefile b/Makefile index 82152784..8b0fc5a1 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: clean_all generate_gpufort_headers generate_gpufort_sources lib/$(LIBGPUFORT) lib/$(LIBGPUFORT_ACC) +.PHONY: clean_all gpufort_headers gpufort_sources lib/$(LIBGPUFORT) lib/$(LIBGPUFORT_ACC) SUFFIX = $(if $(HIP_PLATFORM),$(HIP_PLATFORM),amd) LIBGPUFORT = libgpufort_$(SUFFIX).a @@ -7,15 +7,16 @@ LIBGPUFORT_ACC = libgpufort_acc_$(SUFFIX).a GPUFORT_DIR = $(shell gpufort --path) GPUFORT_ACC_DIR = $(GPUFORT_DIR)/runtime/gpufort_acc_runtime -all: | generate_gpufort_headers generate_gpufort_sources lib/$(LIBGPUFORT) lib/$(LIBGPUFORT_ACC) +all: | gpufort_headers gpufort_sources lib/$(LIBGPUFORT) lib/$(LIBGPUFORT_ACC) -generate_gpufort_headers: +gpufort_headers: make -C $(GPUFORT_DIR)/include all -generate_gpufort_sources: - make -C $(GPUFORT_DIR)/src all +gpufort_sources: + make -C $(GPUFORT_DIR)/src gpufort_sources -lib/$(LIBGPUFORT): generate_gpufort_headers generate_gpufort_sources +lib/$(LIBGPUFORT): gpufort_headers + make -C $(GPUFORT_DIR)/src all mkdir -p $(GPUFORT_DIR)/lib mv $(GPUFORT_DIR)/src/$(LIBGPUFORT) $(GPUFORT_DIR)/lib mv $(GPUFORT_DIR)/src/*.mod $(GPUFORT_DIR)/include/$(SUFFIX) diff --git a/python/fort2hip/fort2hip_options.py.in b/python/fort2hip/fort2hip_options.py.in index 062c9af6..ecb32d2e 100644 --- a/python/fort2hip/fort2hip_options.py.in +++ b/python/fort2hip/fort2hip_options.py.in @@ -46,13 +46,14 @@ GPUFORT_HEADERS_MAX_DIM = 7 # Generate rank-dependent classes and expressions up to # this dimension. GPUFORT_HEADERS_DATATYPES = [ - {"c_type":"bool","f_type":"c_bool"}, - {"c_type":"char","f_type":"c_char"}, - {"c_type":"short","f_type":"c_short"}, - {"c_type":"int","f_type":"c_int"}, - {"c_type":"long","f_type":"c_long"}, - {"c_type":"float","f_type":"c_float"}, - {"c_type":"double","f_type":"c_double"} + {"c_type":"bool" ,"f_kind":"c_bool" ,"bytes":"c_bool" ,"f_type":"logical(c_bool)" }, + {"c_type":"short" ,"f_kind":"c_short" ,"bytes":"c_short" ,"f_type":"integer(c_short)"}, + {"c_type":"int" ,"f_kind":"c_int" ,"bytes":"c_int" ,"f_type":"integer(c_int)" }, + {"c_type":"long" ,"f_kind":"c_long" ,"bytes":"c_long" ,"f_type":"integer(c_long)" }, + {"c_type":"float" ,"f_kind":"c_float" ,"bytes":"c_float" ,"f_type":"real(c_float)" }, + {"c_type":"double" ,"f_kind":"c_double" ,"bytes":"c_double" ,"f_type":"real(c_double)"}, + {"c_type":"hipFloatComplex" ,"f_kind":"c_float_complex" ,"bytes":"2*c_float_complex" ,"f_type":"complex(c_float_complex)"}, + {"c_type":"hipDoubleComplex","f_kind":"c_double_complex","bytes":"2*c_double_complex","f_type":"complex(c_double_complex)"} ] # Generate rank-dependent classes and expressions for these # datatypes. diff --git a/python/fort2hip/templates/gpufort_arrays.macros.f03 b/python/fort2hip/templates/gpufort_arrays.macros.f03 index 5f094d4c..b218722c 100644 --- a/python/fort2hip/templates/gpufort_arrays.macros.f03 +++ b/python/fort2hip/templates/gpufort_arrays.macros.f03 @@ -2,252 +2,177 @@ {# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} {# Fortran side #} {% import "templates/gpufort.macros.h" as gm %} -{%- macro gpufort_arrays_fortran_interfaces(datatypes,max_rank) -%} -{% set main_prefix = "gpufort_mapped_array" %} +{%- macro gpufort_arrays_fortran_routines(datatypes,max_rank) -%} +{% set prefix = "gpufort_mapped_array" %} {% set max_rank_ub = max_rank+1 %} -{% for tuple in datatypes %} -{% set c_type = tuple.c_type %} -{% set f_type = tuple.f_type %} -interface {{main_prefix}}_{{f_type}}_init_ {% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string %} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} - function {{f_prefix}}_init_b (& - mapped_array,data_host,data_dev,& -{{ gm.separated_list_single_line("n",",",rank) | indent(6,True) }},& -{{ gm.separated_list_single_line("lb",",",rank) | indent(6,True) }},& - pinned, stream, copyout_at_destruction) & - bind(c,name="{{c_prefix}}_init") & - result(ierr) +{% set f_array = prefix+"_"+rank|string %} +{% set routine = "init" %} +{% set binding = f_array+"_"+routine %} +{% set size_dims = ",dimension("+rank|string+")" %} + function {{binding}}_host(& + mapped_array,& + bytes_per_element,& + sizes,lbounds,& + pinned, copyout_at_destruction) result(ierr) use iso_c_binding use hipfort_enums - import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array - type(c_ptr),intent(in),value :: data_host, data_dev, stream - integer(c_int),intent(in),value :: & -{{ gm.separated_list_single_line("n",",",rank) | indent(6,True) }},& -{{ gm.separated_list_single_line("lb",",",rank) | indent(6,True) }} - logical(c_bool),intent(in),value :: pinned, copyout_at_destruction - integer(kind(hipSuccess)) :: ierr - end function -{% endfor %} -end interface - -interface {{main_prefix}}_{{f_type}}_destroy_ -{% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string %} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} - function {{f_prefix}}_destroy(mapped_array) & - bind(c,name="{{c_prefix}}_destroy") result(ierr) - use iso_c_binding - use hipfort_enums - import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array - integer(kind(hipSuccess)) :: ierr - end function -{% endfor %} -end interface - -interface {{main_prefix}}_{{f_type}}_copy_data_to_host_ -{% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string %} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} - function {{f_prefix}}_copy_data_to_host(mapped_array) & - bind(c,name="{{c_prefix}}_copy_data_to_host") result(ierr) - use iso_c_binding - use hipfort_enums - import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array_ - integer(kind(hipSuccess)) :: ierr - end function -{% endfor %} -end interface - -interface {{main_prefix}}_{{f_type}}_copy_data_to_device_ -{% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string %} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} - function {{f_prefix}}_copy_data_to_device(mapped_array) & - bind(c,name="{{c_prefix}}_copy_data_to_device") result(ierr) - use iso_c_binding - use hipfort_enums - import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array - integer(kind(hipSuccess)) :: ierr + implicit none + type({{f_array}}),intent(inout) :: mapped_array + integer(c_int),intent(in),value :: bytes_per_element + integer(c_int){{size_dims}},intent(in) :: sizes + integer(c_int){{size_dims}},intent(in),optional :: lbounds + logical(c_bool),intent(in),optional :: pinned, copyout_at_destruction + integer(kind(hipSuccess)) :: ierr + ! + integer(c_int),dimension({{rank}}) :: opt_lbounds + logical(c_bool) :: opt_pinned, opt_copyout_at_destruction + ! + opt_lbounds = 1 + opt_copyout_at_destruction = .false. + if ( present(lbounds) ) opt_lbounds = lbounds + if ( present(copyout_at_destruction) ) opt_copyout_at_destruction = copyout_at_destruction + ierr = {{binding}}(& + mapped_array,& + bytes_per_element,& + c_null_ptr,c_null_ptr, & + sizes, opt_lbounds,& + opt_pinned, opt_copyout_at_destruction) end function -{% endfor %} -end interface - -interface {{main_prefix}}_{{f_type}}_inc_num_refs_ -{% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string %} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} - function {{f_prefix}}_inc_num_refs(mapped_array) & - bind(c,name="{{c_prefix}}_inc_num_refs") result(ierr) - use iso_c_binding - use hipfort_enums - import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array - integer(kind(hipSuccess)) :: ierr +{% for tuple in datatypes %} + function {{binding}}_{{tuple.f_kind}}(& + mapped_array,& + data_host,lbounds,& + data_dev,& + pinned,copyout_at_destruction) result(ierr) + use iso_c_binding + use hipfort_enums + implicit none + type({{f_array}}),intent(inout) :: mapped_array + {{tuple.f_type}},intent(in),target,dimension(:{% for i in range(1,rank) %},:{% endfor %}) :: data_host + integer(c_int){{size_dims}},intent(in),optional :: lbounds + type(c_ptr),intent(in),optional :: data_dev + logical(c_bool),intent(in),optional :: pinned, copyout_at_destruction + integer(kind(hipSuccess)) :: ierr + ! + integer(c_int),dimension({{rank}}) :: opt_lbounds + type(c_ptr) :: opt_data_dev + logical(c_bool) :: opt_pinned, opt_copyout_at_destruction + ! + opt_lbounds = 1 + opt_data_dev = c_null_ptr + opt_copyout_at_destruction = .false. + if ( present(lbounds) ) opt_lbounds = lbounds + if ( present(data_dev) ) opt_data_dev = data_dev + if ( present(copyout_at_destruction) ) opt_copyout_at_destruction = copyout_at_destruction + ierr = {{binding}}(& + mapped_array,& + int({{tuple.bytes}}, c_int),& + c_loc(data_host),opt_data_dev,& + shape(data_host), opt_lbounds,& + opt_pinned, opt_copyout_at_destruction) end function + {% endfor %} -end interface - -interface {{main_prefix}}_{{f_type}}_dec_num_refs_ -{% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string -%} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type -%} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type -%} - function {{f_prefix}}_dec_num_refs(mapped_array,destroy_if_zero_refs) & - bind(c,name="{{c_prefix}}_dec_num_refs") result(ierr) - use iso_c_binding - use hipfort_enums - import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array - logical(c_bool),intent(in),value :: destroy_if_zero_refs - integer(kind(hipSuccess)) :: ierr - end function -{% endfor %} -end interface -{% endfor %} -{%- endmacro -%} -{# type and rank generic interfaces #} -{%- macro gpufort_arrays_fortran_interfaces_generic(datatypes,max_rank) -%} -{% set main_prefix = "gpufort_mapped_array" %} -{% set max_rank_ub = max_rank+1 %} -{% for suffix in ["_init","_destroy","_copy_data_to_host","_copy_data_to_device","_inc_num_refs","_dec_num_refs"] %} -interface {{main_prefix}}{{suffix}} - module procedure :: & -{% for tuple in datatypes %} -{% set c_type = tuple.c_type %} -{% set f_type = tuple.f_type %} -{% for rank in range(1,max_rank_ub) %} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type -%} -{% set routine = f_prefix + suffix %} -{{ routine | indent(4,True) }}{{",&\n" if not loop.last }} -{%- endfor -%}{{",&\n" if not loop.last else "\n" }} -{%- endfor -%} -end interface {% endfor %} {%- endmacro -%} -{# Routines calling the C bindings #} {%- macro gpufort_arrays_fortran_interfaces(datatypes,max_rank) -%} -{% set main_prefix = "gpufort_mapped_array" %} {% set max_rank_ub = max_rank+1 %} -{% for tuple in datatypes %} -{% set c_type = tuple.c_type %} -{% set f_type = tuple.f_type %} -interface {{main_prefix}}_{{f_type}}_init_ +{% set prefix = "gpufort_mapped_array" %} +{% set routine = "init" %} +{% set iface = prefix+"_"+routine %} +interface {{iface}} {% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string %} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} - function {{f_prefix}}_init_b (& - mapped_array,data_host,data_dev,& -{{ gm.separated_list_single_line("n",",",rank) | indent(6,True) }},& -{{ gm.separated_list_single_line("lb",",",rank) | indent(6,True) }},& - pinned, stream, copyout_at_destruction) & - bind(c,name="{{c_prefix}}_init") & +{% set size_dims = ",dimension("+rank|string+")" %} +{% set f_array = prefix+"_"+rank|string %} +{% set binding = f_array+"_"+routine %} + function {{binding}} (& + mapped_array,& + bytes_per_element,& + data_host,data_dev,& + sizes, lbounds,& + pinned, copyout_at_destruction) & + bind(c,name="{{binding}}") & result(ierr) use iso_c_binding use hipfort_enums import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array - type(c_ptr),intent(in),value :: data_host, data_dev, stream - integer(c_int),intent(in),value :: & -{{ gm.separated_list_single_line("n",",",rank) | indent(6,True) }},& -{{ gm.separated_list_single_line("lb",",",rank) | indent(6,True) }} - logical(c_bool),intent(in),value :: pinned, copyout_at_destruction - integer(kind(hipSuccess)) :: ierr + implicit none + type({{f_array}}),intent(inout) :: mapped_array + integer(c_int),intent(in),value :: bytes_per_element + type(c_ptr),intent(in),value :: data_host, data_dev + integer(c_int){{size_dims}},intent(in) :: sizes, lbounds + logical(c_bool),intent(in),value :: pinned, copyout_at_destruction + integer(kind(hipSuccess)) :: ierr end function {% endfor %} -end interface -{% endfor %} - -interface {{main_prefix}}_{{f_type}}_destroy_ + module procedure :: & {% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string %} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} - function {{f_prefix}}_destroy(mapped_array) & - bind(c,name="{{c_prefix}}_destroy") result(ierr) - use iso_c_binding - use hipfort_enums - import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array - integer(kind(hipSuccess)) :: ierr - end function +{% set f_array = prefix+"_"+rank|string %} +{% set binding = f_array+"_"+routine %} + {{binding}}_host,& +{% for tuple in datatypes %} + {{binding}}_{{tuple.f_kind}}{{",&\n" if not loop.last}}{% endfor %}{{",&" if not loop.last}} {% endfor %} end interface -interface {{main_prefix}}_{{f_type}}_copy_data_to_host_ +{% for routine in ["destroy","copy_data_to_host","copy_data_to_device"] %} +{% set iface = prefix+"_"+routine %} +interface {{iface}} {% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string %} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} - function {{f_prefix}}_copy_data_to_host(mapped_array) & - bind(c,name="{{c_prefix}}_copy_data_to_host") result(ierr) - use iso_c_binding - use hipfort_enums - import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array_ - integer(kind(hipSuccess)) :: ierr +{% set f_array = prefix+"_"+rank|string %} +{% set binding = f_array+"_"+routine %} + function {{binding}} (mapped_array,stream) & + bind(c,name="{{binding}}") & + result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + implicit none + type({{f_array}}),intent(inout) :: mapped_array + type(c_ptr),value,intent(in) :: stream + integer(kind(hipSuccess)) :: ierr end function {% endfor %} end interface - -interface {{main_prefix}}_{{f_type}}_copy_data_to_device_ -{% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string %} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} - function {{f_prefix}}_copy_data_to_device(mapped_array) & - bind(c,name="{{c_prefix}}_copy_data_to_device") result(ierr) - use iso_c_binding - use hipfort_enums - import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array - integer(kind(hipSuccess)) :: ierr - end function {% endfor %} -end interface -interface {{main_prefix}}_{{f_type}}_inc_num_refs_ +{% set routine = "inc_num_refs" %} +{% set iface = prefix+"_"+routine %} +interface {{iface}} {% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string %} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type %} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type %} - function {{f_prefix}}_inc_num_refs(mapped_array) & - bind(c,name="{{c_prefix}}_inc_num_refs") result(ierr) - use iso_c_binding - use hipfort_enums - import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array - integer(kind(hipSuccess)) :: ierr +{% set f_array = prefix+"_"+rank|string %} +{% set binding = f_array+"_"+routine %} + function {{binding}} (mapped_array) & + bind(c,name="{{binding}}") & + result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + implicit none + type({{f_array}}),intent(inout) :: mapped_array + integer(kind(hipSuccess)) :: ierr end function {% endfor %} end interface -interface {{main_prefix}}_{{f_type}}_dec_num_refs_ +{% set routine = "dec_num_refs" %} +{% set iface = prefix+"_"+routine %} +interface {{iface}} {% for rank in range(1,max_rank_ub) %} -{% set f_array = main_prefix+"_"+rank|string -%} -{% set f_prefix = main_prefix+"_"+rank|string+"_"+f_type -%} -{% set c_prefix = main_prefix+"_"+rank|string+"_"+c_type -%} - function {{f_prefix}}_dec_num_refs(mapped_array,destroy_if_zero_refs) & - bind(c,name="{{c_prefix}}_dec_num_refs") result(ierr) - use iso_c_binding - use hipfort_enums - import {{f_array}} - type({{f_array}}),intent(inout) :: mapped_array - logical(c_bool),intent(in),value :: destroy_if_zero_refs - integer(kind(hipSuccess)) :: ierr +{% set f_array = prefix+"_"+rank|string %} +{% set binding = f_array+"_"+routine %} + function {{binding}} (mapped_array,destroy_if_zero_refs) & + bind(c,name="{{binding}}") & + result(ierr) + use iso_c_binding + use hipfort_enums + import {{f_array}} + implicit none + type({{f_array}}),intent(inout) :: mapped_array + logical(c_bool),intent(in),value :: destroy_if_zero_refs + integer(kind(hipSuccess)) :: ierr end function {% endfor %} end interface -{% endfor %} {%- endmacro -%} diff --git a/python/fort2hip/templates/gpufort_arrays.macros.h b/python/fort2hip/templates/gpufort_arrays.macros.h index e977fd7a..31a50454 100644 --- a/python/fort2hip/templates/gpufort_arrays.macros.h +++ b/python/fort2hip/templates/gpufort_arrays.macros.h @@ -5,42 +5,46 @@ {%- macro gpufort_arrays_c_bindings(datatypes,max_rank) -%} {# C side #} extern "C" { -{% for tuple in datatypes %} -{% set c_type = tuple.c_type %} {% for rank in range(1,max_rank+1) %} -{% set c_prefix = "gpufort_mapped_array_"+rank|string+"_"+c_type %} +{% set c_type = "char" %} +{% set c_prefix = "gpufort_mapped_array_"+rank|string %} __host__ hipError_t {{c_prefix}}_init ( gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, + int bytes_per_element, {{c_type}}* data_host, {{c_type}}* data_dev, -{{ gm.bound_args("const int ",rank) | indent(6,True) }}, + int* sizes, + int* lower_bounds, bool pinned, - hipStream_t stream, bool copyout_at_destruction ) { return mapped_array->init( + bytes_per_element, data_host, data_dev, -{{ gm.bound_args_single_line("",rank) | indent(6,True) }}, - pinned, stream, copyout_at_destruction + sizes, lower_bounds, + pinned, copyout_at_destruction ); } __host__ hipError_t {{c_prefix}}_destroy( - gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array + gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, + hipStream_t stream = nullptr ) { - return mapped_array->destroy(); + return mapped_array->destroy(stream); } __host__ hipError_t {{c_prefix}}_copy_data_to_host ( - gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array + gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, + hipStream_t stream = nullptr ) { - return mapped_array->copy_data_to_host(); + return mapped_array->copy_data_to_host(stream); } __host__ hipError_t {{c_prefix}}_copy_data_to_device ( - gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array + gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, + hipStream_t stream = nullptr ) { - return mapped_array->copy_data_to_device(); + return mapped_array->copy_data_to_device(stream); } __host__ void {{c_prefix}}_inc_num_refs( @@ -51,16 +55,16 @@ extern "C" { __host__ hipError_t {{c_prefix}}_dec_num_refs( gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, - bool destroy_if_zero_refs + bool destroy_if_zero_refs, + hipStream_t stream = nullptr ) { mapped_array->num_refs -= 1; if ( destroy_if_zero_refs && mapped_array->num_refs == 0 ) { - return mapped_array->destroy(); + return mapped_array->destroy(stream); } { return hipSuccess; } } {% endfor %} -{% endfor %} -} +} // extern "C" {%- endmacro -%} diff --git a/python/fort2hip/templates/gpufort_arrays.template.f03 b/python/fort2hip/templates/gpufort_arrays.template.f03 index 2b7ecf1c..6be6d3d7 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.f03 +++ b/python/fort2hip/templates/gpufort_arrays.template.f03 @@ -16,25 +16,24 @@ module gpufort_arrays integer(c_size_t) :: num_elements = 0; !> Number of represented by this array. integer(c_int) :: index_offset = -1; !> Offset for index calculation; scalar product of negative lower bounds and strides. {% for d in range(1,rank_ub) %} - integer(c_int) :: stride{{d}} = -1; !> Stride for dimension {{d}} + integer(c_int) :: stride{{d}} = -1; !> Stride for dimension {{d}} {% endfor %} end type type, bind(c) :: gpufort_mapped_array_{{rank}} type(gpufort_gpu_array_{{rank}}) :: data - type(c_ptr) :: stream = c_null_ptr; - logical(c_bool) :: pinned = .false.; !> If the host data is pinned. - logical(c_bool) :: copyout_at_destruction = .false.; !> If the device data should be copied back to the host when this struct is destroyed. - logical(c_bool) :: owns_host_data = .false.; !> If this is only a wrapper, i.e. no memory management is performed. - logical(c_bool) :: owns_device_data = .false.; !> If this is only a wrapper, i.e. no memory management is performed. - integer(c_int) :: num_refs = 0; !> Number of references. - integer(c_size_t) :: bytes_per_element = 0; !> Number of references. + logical(c_bool) :: pinned = .false.; !> If the host data is pinned. + logical(c_bool) :: copyout_at_destruction = .false.; !> If the device data should be copied back to the host when this struct is destroyed. + logical(c_bool) :: owns_host_data = .false.; !> If this is only a wrapper, i.e. no memory management is performed. + logical(c_bool) :: owns_device_data = .false.; !> If this is only a wrapper, i.e. no memory management is performed. + integer(c_int) :: num_refs = 0; !> Number of references. + integer(c_int) :: bytes_per_element = -1; !> Bytes per data element. end type{{"\n" if not loop.last}} {% endfor %} ! interfaces {{ gam.gpufort_arrays_fortran_interfaces(datatypes,max_rank) | indent(2,True) }} -{{ gam.gpufort_arrays_fortran_interfaces_generic(datatypes,max_rank) | indent(2,True) }} - ! subroutines +contains +{{ gam.gpufort_arrays_fortran_routines(datatypes,max_rank) | indent(2,True) }} end module gpufort_arrays diff --git a/python/fort2hip/templates/gpufort_arrays.template.h b/python/fort2hip/templates/gpufort_arrays.template.h index 59bf1721..a5dc022f 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.h +++ b/python/fort2hip/templates/gpufort_arrays.template.h @@ -23,15 +23,17 @@ namespace gpufort { {% set rank_ub = rank+1 %} /** * Intended to be passed as kernel launch parameter. + * \note Operator `T& operator()` requires parametrization with type T. + * \note Size of this struct independent of template type T. */ template struct GpuArray{{rank}} { - T* data_host = nullptr; - T* data_dev = nullptr; + T* data_host = nullptr; + T* data_dev = nullptr; size_t num_elements = 0; //> Number of represented by this array. int index_offset = -1; //> Offset for index calculation; scalar product of negative lower bounds and strides. {% for d in range(1,rank_ub) %} - size_t stride{{d}} = -1; //> Strides for linearizing {{rank}}-dimensional index. + int stride{{d}} = -1; //> Strides for linearizing {{rank}}-dimensional index. {% endfor %} /** @@ -86,7 +88,7 @@ namespace gpufort { const int index = linearized_index( {{ gm.separated_list_single_line("i",",",rank) | indent(8,"True") }} ); - #if __HIP_DEVICE_COMPILE__ + #ifdef __HIP_DEVICE_COMPILE__ return this->data_dev[index]; #else return this->data_host[index]; @@ -97,14 +99,21 @@ namespace gpufort { template struct MappedArray{{rank}}{ GpuArray{{rank}} data; - hipStream_t stream = nullptr; bool pinned = false; //> If the host data is pinned. bool copyout_at_destruction = false; //> If the device data should be copied back to the host when this struct is destroyed. bool owns_host_data = false; //> If this is only a wrapper, i.e. no memory management is performed. bool owns_device_data = false; //> If this is only a wrapper, i.e. no memory management is performed. int num_refs = 0; //> Number of references. - size_t bytes_per_element = sizeof(T); //> Bytes per element; stored to make num_data_bytes routine independent of T - + int bytes_per_element = -1; //> Bytes per element; stored to make num_data_bytes routine independent of T + + MappedArray{{rank}}() { + // do nothing + } + + ~MappedArray{{rank}}() { + // do nothing + } + /** * Initialize. * \param[in] data_host host data pointer (may be nullptr; see the note). @@ -117,24 +126,24 @@ namespace gpufort { * Otherwise, it is allocated via classic malloc. */ __host__ hipError_t init( + int bytes_per_element, T* data_host, T* data_dev, -{{ gm.bound_args("const int ",rank) | indent(8,True) }}, +{{ gm.bound_args_single_line("int ",rank) | indent(8,True) }}, bool pinned, - hipStream_t stream = nullptr, bool copyout_at_destruction = false) { hipError_t ierr = hipSuccess; this->data.wrap( data_host, data_dev, -{{ gm.bound_args("",rank) | indent(10,True) }} +{{ gm.bound_args_single_line("",rank) | indent(10,True) }} ); - this->stream = stream; + this->bytes_per_element = bytes_per_element; this->pinned = pinned; this->copyout_at_destruction = copyout_at_destruction; this->owns_host_data = data_host == nullptr; this->owns_device_data = data_dev == nullptr; - this->num_refs = 1; + this->num_refs = 1; if ( this->owns_host_data && pinned ) { ierr = hipHostMalloc((void**) &this->data.data_host,this->num_data_bytes(),0); } else if ( this->owns_host_data ) { @@ -145,13 +154,23 @@ namespace gpufort { } return ierr; } - - MappedArray{{rank}}() { - // do nothing - } - ~MappedArray{{rank}}() { - HIP_CHECK(this->destroy()); + __host__ hipError_t init( + int bytes_per_element, + T* data_host, + T* data_dev, + int* sizes, + int* lower_bounds, + bool pinned, + bool copyout_at_destruction = false) { + return this->init( + bytes_per_element, + data_host, + data_dev, + sizes[0],{% for d in range(1,rank) %}sizes[{{d}}],{% endfor %}{{""}} + lower_bounds[0],{% for d in range(1,rank) %}lower_bounds[{{d}}],{% endfor %}{{""}} + pinned, + copyout_at_destruction); } /** @@ -161,22 +180,25 @@ namespace gpufort { * is used instead of free to deallocate * the host data. */ - __host__ hipError_t destroy() { + __host__ hipError_t destroy(hipStream_t stream) { hipError_t ierr = hipSuccess; - #ifndef __HIP_DEVICE_COMPILE__ - if ( this->owns_host_data && this->data.data_host != nullptr ) { - if ( this->pinned ) { - ierr = hipHostFree(this->data.data_host); - } else { - free(this->data.data_host); + if ( this->bytes_per_element > 0 ) { + if ( this->owns_host_data && this->data.data_host != nullptr ) { + if ( this->pinned ) { + ierr = hipHostFree(this->data.data_host); + } else { + free(this->data.data_host); + } } - } - if ( ierr == hipSuccess ) { - if ( this->owns_device_data && this->data.data_dev != nullptr ) { - ierr = hipFree(this->data.data_dev); + if ( ierr == hipSuccess ) { + if ( this->owns_device_data && this->data.data_dev != nullptr ) { + if ( this->copyout_at_destruction ) { + this->copy_data_to_host(stream); + } + ierr = hipFree(this->data.data_dev); + } } } - #endif return ierr; } @@ -188,24 +210,42 @@ namespace gpufort { * Copy host data to the device. * \return Array code returned by the underlying hipMemcpy operation. */ - __host__ hipError_t copy_data_to_host() { + __host__ hipError_t copy_data_to_host(hipStream_t stream = nullptr) { return hipMemcpyAsync( (void*) this->data.data_host, (void*) this->data.data_dev, this->num_data_bytes(), - hipMemcpyDeviceToHost, this->stream); + hipMemcpyDeviceToHost, stream); } /** * Copy device data to the host. * \return Array code returned by the underlying hipMemcpy operation. */ - __host__ hipError_t copy_data_to_device() { + __host__ hipError_t copy_data_to_device(hipStream_t stream = nullptr) { return hipMemcpyAsync( (void*) this->data.data_dev, (void*) this->data.data_host, this->num_data_bytes(), - hipMemcpyHostToDevice, this->stream); + hipMemcpyHostToDevice, stream); + } + + /** + * Copies the struct to the device into an pre-allocated + * device memory block but does not touch the data associated with + * data_dev & data_host (shallow copy). + * \param[in] device_struct device memory address to copy to + */ + __host__ hipError_t copy_self_to_device( + gpufort::MappedArray{{rank}}* device_struct, + hipStream_t stream = nullptr + ) { + const size_t size = sizeof(MappedArray{{rank}}); // sizeof(T*) = sizeof(char*) + return hipMemcpyAsync( + (void*) device_struct, + (void*) this, + size, + hipMemcpyHostToDevice, stream); } /** @@ -214,24 +254,37 @@ namespace gpufort { * data_dev & data_host (shallow copy). * \param[inout] device_copy pointer to device copy pointer */ - __host__ hipError_t create_device_copy(void** device_copy) { + __host__ hipError_t create_device_copy( + gpufort::MappedArray{{rank}}** device_copy, + hipStream_t stream = nullptr + ) { const size_t size = sizeof(MappedArray{{rank}}); // sizeof(T*) = sizeof(char*) - hipError_t ierr = hipMalloc(device_copy,size); + hipError_t ierr = hipMalloc((void**)device_copy,size); if ( ierr == hipSuccess ) { - ierr = hipMemcpyAsync( - (void*) *device_copy, - (void*) this, - size, - hipMemcpyHostToDevice, this->stream); + return this->copy_self_to_device(*device_copy,stream); + } else { + return ierr; } - return ierr; + } + + /** + * Linearize multi-dimensional index. + * + * \param[in] i1,i2,... multi-dimensional array index. + */ + __host__ __device__ __forceinline__ int linearized_index ( +{{ gm.arglist("const int i",rank) | indent(6,"True") }} + ) { + return this->data.linearized_index( +{{ gm.separated_list_single_line("i",",",rank) | indent(8,"True") }} + ); } /** * \return Element at given index. * \param[in] i1,i2,... multi-dimensional array index. */ - __host__ T& operator() ( + __host__ __device__ __forceinline__ T& operator() ( {{ gm.arglist("const int i",rank) | indent(6,"True") }} ) { return this->data( diff --git a/python/fort2hip/templates/gpufort_arrays.template.hip.cpp b/python/fort2hip/templates/gpufort_arrays.template.hip.cpp new file mode 100644 index 00000000..8d37ecfc --- /dev/null +++ b/python/fort2hip/templates/gpufort_arrays.template.hip.cpp @@ -0,0 +1,8 @@ +{# SPDX-License-Identifier: MIT #} +{# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} +{% import "templates/gpufort_arrays.macros.h" as gam %} +// This file was generated from a template via gpufort --gpufort-create-headers +// C bindings +#include "gpufort_arrays.h" + +{{ gam.gpufort_arrays_c_bindings(datatypes,max_rank) }} diff --git a/runtime/gpufort_acc_runtime/rules.mk b/runtime/gpufort_acc_runtime/rules.mk index 64e77932..70d075c3 100644 --- a/runtime/gpufort_acc_runtime/rules.mk +++ b/runtime/gpufort_acc_runtime/rules.mk @@ -1,4 +1,4 @@ -FC ?= gfortran +FC ?= hipfc HIPFORT_PATH ?= /opt/rocm/hipfort FCFLAGS ?= -std=f2008 -ffree-line-length-none -cpp diff --git a/src/Makefile b/src/Makefile index 86f34258..6c4df71c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,10 +1,10 @@ # compiler options -FC ?= gfortran +FC ?= hipfc HIPCC ?= hipcc GPUFORT_INC = -I$(shell gpufort --path)/include -FC_CFLAGS ?= -std=f2008 -ffree-line-length-none -cpp +FC_CFLAGS ?= -std=f2008 -ffree-line-length-none -cpp -fmax-errors=5 HIPCC_CFLAGS ?= -fPIC SUFFIX ?= $(if $(HIP_PLATFORM),$(HIP_PLATFORM),amd) LIBGPUFORT = libgpufort_$(SUFFIX).a @@ -17,11 +17,11 @@ HIP_OBJ = $(HIP_SRC:%.hip.cpp=%.hip.o) FORT_OBJ = $(FORT_SRC:%.f03=%.o) # targets -.PHONY: all clean clean_all generate_gpufort_sources $(LIBGPUFORT) +.PHONY: all clean clean_all gpufort_sources $(LIBGPUFORT) -all: generate_gpufort_sources $(LIBGPUFORT) +all: gpufort_sources $(LIBGPUFORT) -generate_gpufort_sources: +gpufort_sources: gpufort --create-gpufort-sources $(HIP_OBJ): %.hip.o: %.hip.cpp diff --git a/test/gpufort_arrays/Makefile b/test/gpufort_arrays/Makefile index f646f742..33d7fab3 100644 --- a/test/gpufort_arrays/Makefile +++ b/test/gpufort_arrays/Makefile @@ -3,21 +3,26 @@ HIP_TEST_APP = $(HIP_TEST_SRC:.hip.cpp=.x) FORT_TEST_SRC = test_gpufort_arrays_interop.f03 FORT_TEST_APP = $(FORT_TEST_SRC:.f03=.x) -FORT_TEST_DEPS = test_gpufort_arrays_interop.hip.o +FORT_TEST_DEPS = test_gpufort_arrays_kernels.hip.o HIPCC_CFLAGS ?= $(shell gpufort --cpp_config) FC_CFLAGS ?= $(shell gpufort --gfortran_config) -.PHONY: clean $(HIP_TEST_APP) +LDFLAGS ?= $(shell gpufort --ldflags) + +.PHONY: clean $(HIP_TEST_APP) $(FORT_TEST_APP) generate_headers $(HIP_TEST_APP): %.x: %.hip.cpp hipcc $(HIPCC_CFLAGS) $^ -o $@ +$(FORT_TEST_APP): %.x: %.f03 $(FORT_TEST_DEPS) + hipfc $(FC_CFLAGS) $^ -o $@ $(LDFLAGS) + +generate_headers: + make -C ../../ gpufort_headers + %.hip.o: %.hip.cpp hipcc -c $(HIPCC_CFLAGS) $^ -o $@ -$(FORT_TEST_APP): %.x: %.f03 $(FORT_TEST_DEPS) - hipfc $(FC_CFLAGS) -c $^ -o $@ - clean: - rm -f $(HIP_TEST_APP) + rm -f $(HIP_TEST_APP) $(FORT_TEST_APP) *.o *.mod diff --git a/test/gpufort_arrays/test_gpufort_arrays.hip.cpp b/test/gpufort_arrays/test_gpufort_arrays.hip.cpp index 5a7a9abc..ebfb5099 100644 --- a/test/gpufort_arrays/test_gpufort_arrays.hip.cpp +++ b/test/gpufort_arrays/test_gpufort_arrays.hip.cpp @@ -3,45 +3,16 @@ #include -__global__ void fill_int_array_1( - gpufort::GpuArray1 arr -) { - int i = -1+threadIdx.x + blockDim.x*blockIdx.x; - if ( (i+1) < 10 ) { - arr(i) = arr.linearized_index(i); - //printf("%d\n",arr(i)); - } -} - -__global__ void fill_int_array_2( - gpufort::GpuArray2 arr -) { - int i = -1+threadIdx.x + blockDim.x*blockIdx.x; - int j = -2+threadIdx.y + blockDim.y*blockIdx.y; - if ( (i+1) < 10 && (j+2) < 10 ) { - arr(i,j) = arr.linearized_index(i,j); - } -} +#include "test_gpufort_arrays_kernels.hip.cpp" -__global__ void fill_int_array_3( - gpufort::GpuArray3 arr -) { - int i = -1+threadIdx.x + blockDim.x*blockIdx.x; - int j = -2+threadIdx.y + blockDim.y*blockIdx.y; - int k = -3+threadIdx.z + blockDim.z*blockIdx.z; - if ( (i+1) < 10 && (j+2) < 10 && (k+3) < 10 ) { - arr(i,j,k) = arr.linearized_index(i,j,k); - } -} - -int main(int argc,char** argv) { +void test1() { gpufort::MappedArray1 int_array1; gpufort::MappedArray2 int_array2; gpufort::MappedArray3 int_array3; - HIP_CHECK(int_array1.init(nullptr,nullptr, 10, -1, true)); // hostptr,devptr, count, lower bound, pinned - HIP_CHECK(int_array2.init(nullptr,nullptr, 10,10, -1,-2, true)); - HIP_CHECK(int_array3.init(nullptr,nullptr, 10,10,10, -1,-2,-3, true)); + HIP_CHECK(int_array1.init(sizeof(int),nullptr,nullptr, 10, -1, true)); // hostptr,devptr, count, lower bound, pinned + HIP_CHECK(int_array2.init(sizeof(int),nullptr,nullptr, 10,10, -1,-2, true)); + HIP_CHECK(int_array3.init(sizeof(int),nullptr,nullptr, 10,10,10, -1,-2,-3, true)); assert( 10==int_array1.data.num_elements); assert( 100==int_array2.data.num_elements); @@ -51,17 +22,17 @@ int main(int argc,char** argv) { assert( 21==int_array2.data.index_offset); assert(321==int_array3.data.index_offset); - assert(0==int_array1.data.linearized_index(-1)); - assert(0==int_array2.data.linearized_index(-1,-2)); - assert(0==int_array3.data.linearized_index(-1,-2,-3)); + assert(0==int_array1.linearized_index(-1)); + assert(0==int_array2.linearized_index(-1,-2)); + assert(0==int_array3.linearized_index(-1,-2,-3)); - assert( 9==int_array1.data.linearized_index(-1+10-1)); // upper bound - assert( 99==int_array2.data.linearized_index(-1+10-1,-2+10-1)); - assert(999==int_array3.data.linearized_index(-1+10-1,-2+10-1,-3+10-1)); + assert( 9==int_array1.linearized_index(-1+10-1)); // upper bound + assert( 99==int_array2.linearized_index(-1+10-1,-2+10-1)); + assert(999==int_array3.linearized_index(-1+10-1,-2+10-1,-3+10-1)); - hipLaunchKernelGGL(fill_int_array_1,dim3(1),dim3(10,1,1),0,nullptr,int_array1.data); - hipLaunchKernelGGL(fill_int_array_2,dim3(1),dim3(10,10,1),0,nullptr,int_array2.data); - hipLaunchKernelGGL(fill_int_array_3,dim3(1),dim3(10,10,10),0,nullptr,int_array3.data); + launch_fill_int_array_1(int_array1); + launch_fill_int_array_2(int_array2); + launch_fill_int_array_3(int_array3); HIP_CHECK(int_array1.copy_data_to_host()); HIP_CHECK(int_array2.copy_data_to_host()); @@ -79,6 +50,27 @@ int main(int argc,char** argv) { for (int n = 0; n < int_array3.data.num_elements; n++ ) { assert(int_array3.data.data_host[n] == n); } +} + +void test2() { + gpufort::MappedArray3 bool_array; + gpufort::MappedArray3 short_array; + gpufort::MappedArray3 char_array; + gpufort::MappedArray3 int_array; + gpufort::MappedArray3 long_array; + gpufort::MappedArray3 float_array; + gpufort::MappedArray3 double_array; + assert(sizeof(bool_array)==sizeof(short_array)); + assert(sizeof(char_array)==sizeof(short_array)); + assert(sizeof(char_array)==sizeof(int_array)); + assert(sizeof(long_array)==sizeof(int_array)); + assert(sizeof(long_array)==sizeof(float_array)); + assert(sizeof(double_array)==sizeof(float_array)); +} + +int main(int argc,char** argv) { + test1(); + test2(); return 0; } diff --git a/test/gpufort_arrays/test_gpufort_arrays_interop.f03 b/test/gpufort_arrays/test_gpufort_arrays_interop.f03 new file mode 100644 index 00000000..d8d63e73 --- /dev/null +++ b/test/gpufort_arrays/test_gpufort_arrays_interop.f03 @@ -0,0 +1,155 @@ +program test_gpufort_arrays_interop + use gpufort_arrays + use hipfort_check + use hipfort + implicit none + ! + interface + subroutine launch_fill_int_array_1(arr) & + bind(c,name="launch_fill_int_array_1") + use gpufort_arrays + type(gpufort_mapped_array_1),intent(inout) :: arr + end subroutine + subroutine launch_fill_int_array_2(arr) & + bind(c,name="launch_fill_int_array_2") + use gpufort_arrays + type(gpufort_mapped_array_2),intent(inout) :: arr + end subroutine + subroutine launch_fill_int_array_3(arr) & + bind(c,name="launch_fill_int_array_3") + use gpufort_arrays + type(gpufort_mapped_array_3),intent(inout) :: arr + end subroutine + end interface + ! + type(gpufort_mapped_array_1) :: marr1 + type(gpufort_mapped_array_2) :: marr2 + type(gpufort_mapped_array_3) :: marr3 + type(gpufort_mapped_array_4) :: marr4 + type(gpufort_mapped_array_5) :: marr5 + ! + real(c_float),target :: host_array_3(-1:8,-2:7,-3:6) + real(c_double_complex),target :: host_array_4(-1:8,-2:7,-3:6,-4:5) + integer(c_int),dimension(5) :: sizes5,lbounds5 + integer(c_int),pointer,dimension(:,:,:,:,:) :: tmp5, host_array_5 + ! + type(gpufort_mapped_array_1) :: int_marr1 + type(gpufort_mapped_array_2) :: int_marr2 + type(gpufort_mapped_array_3) :: int_marr3 + ! + integer(c_int),target :: int_array_1(-1:8) + integer(c_int),target :: int_array_2(-1:8,-2:7) + integer(c_int),target :: int_array_3(-1:8,-2:7,-3:6) + ! + integer :: i,j,k,n + + ! + ! PART 1: Creating mapped arrays + ! + + ! direct access; set from existing pointer + ! mapped_array,& + ! bytes_per_element,& + ! data_host,data_dev,& + ! sizes, lbounds,& + ! pinned, copyout_at_destruction) & + call hipCheck(gpufort_mapped_array_init(marr3,& + c_float,c_loc(host_array_3),c_null_ptr,& + shape(host_array_3),lbound(host_array_3),& + .false._c_bool,.false._c_bool)) + + call assert(marr3%data%stride1==1) + call assert(marr3%data%stride2==10) + call assert(marr3%data%stride3==100) + call assert(marr3%data%index_offset==321) + call assert(marr3%data%num_elements==1000) + + ! overloaded access; set from existing pointer + call hipCheck(gpufort_mapped_array_init(marr4,& + host_array_4, lbounds=lbound(host_array_4))) + + call assert(marr4%data%stride1==1) + call assert(marr4%data%stride2==10) + call assert(marr4%data%stride3==100) + call assert(marr4%data%stride4==1000) + call assert(marr4%data%index_offset==4321) + call assert(marr4%data%num_elements==10000) + + ! allocate device AND (pinned) host array + sizes5 = 4 + lbounds5 = -1 + call hipCheck(gpufort_mapped_array_init(marr5,& + c_int,sizes5,lbounds=lbounds5,pinned=.true._c_bool)) + call c_f_pointer(marr5%data%data_host,tmp5,shape=sizes5) + host_array_5(-1:,-1:,-1:,-1:,-1:) => tmp5 + + call assert(marr5%data%stride1==1) + call assert(marr5%data%stride2==4) + call assert(marr5%data%stride3==16) + call assert(marr5%data%stride4==64) + call assert(marr5%data%stride5==256) + call assert(marr5%data%index_offset==1+4+16+64+256) + call assert(marr5%data%num_elements==1024) + + ! destroy + call hipCheck(gpufort_mapped_array_destroy(marr3,c_null_ptr)) + call hipCheck(gpufort_mapped_array_destroy(marr4,c_null_ptr)) + call hipCheck(gpufort_mapped_array_destroy(marr5,c_null_ptr)) + + ! + ! PART 2: Interfacing + ! + call hipCheck(gpufort_mapped_array_init(int_marr1,& + int_array_1, lbounds=lbound(int_array_1))) + call hipCheck(gpufort_mapped_array_init(int_marr2,& + int_array_2, lbounds=lbound(int_array_2))) + call hipCheck(gpufort_mapped_array_init(int_marr3,& + int_array_3, lbounds=lbound(int_array_3))) + + ! call C code + call launch_fill_int_array_1(int_marr1) + call launch_fill_int_array_2(int_marr2) + call launch_fill_int_array_3(int_marr3) + + ! copy data to host + call hipCheck(gpufort_mapped_array_copy_data_to_host(int_marr1,c_null_ptr)) + call hipCheck(gpufort_mapped_array_copy_data_to_host(int_marr2,c_null_ptr)) + call hipCheck(gpufort_mapped_array_copy_data_to_host(int_marr3,c_null_ptr)) + + ! check + call hipCheck(hipDeviceSynchronize()) + + n=0 + do i = -1,8 + call assert(int_array_1(i) == n) + n = n +1 + end do + n=0 + do j = -2,7 + do i = -1,8 + call assert(int_array_2(i,j) == n) + n = n +1 + end do + end do + n=0 + do k = -3,6 + do j = -2,7 + do i = -1,8 + call assert(int_array_3(i,j,k) == n) + n = n +1 + end do + end do + end do + + ! destroy + call hipCheck(gpufort_mapped_array_destroy(int_marr1,c_null_ptr)) + call hipCheck(gpufort_mapped_array_destroy(int_marr2,c_null_ptr)) + call hipCheck(gpufort_mapped_array_destroy(int_marr3,c_null_ptr)) +contains + + subroutine assert(condition) + logical,intent(in) :: condition + ! + if ( .not. condition ) ERROR STOP "assertion failed" + end subroutine +end program diff --git a/test/gpufort_arrays/test_gpufort_arrays_kernels.hip.cpp b/test/gpufort_arrays/test_gpufort_arrays_kernels.hip.cpp new file mode 100644 index 00000000..68e9f42d --- /dev/null +++ b/test/gpufort_arrays/test_gpufort_arrays_kernels.hip.cpp @@ -0,0 +1,48 @@ +#include "hip/hip_runtime.h" +#include "hip/hip_runtime_api.h" + +#include "gpufort_arrays.h" + +__global__ void fill_int_array_1( + gpufort::MappedArray1 arr +) { + int i = -1+threadIdx.x + blockDim.x*blockIdx.x; + if ( (i+1) < 10 ) { + arr(i) = arr.linearized_index(i); + //printf("%d\n",arr(i)); + } +} + +__global__ void fill_int_array_2( + gpufort::MappedArray2 arr +) { + int i = -1+threadIdx.x + blockDim.x*blockIdx.x; + int j = -2+threadIdx.y + blockDim.y*blockIdx.y; + if ( (i+1) < 10 && (j+2) < 10 ) { + arr(i,j) = arr.linearized_index(i,j); + } +} + +__global__ void fill_int_array_3( + gpufort::MappedArray3 arr +) { + int i = -1+threadIdx.x + blockDim.x*blockIdx.x; + int j = -2+threadIdx.y + blockDim.y*blockIdx.y; + int k = -3+threadIdx.z + blockDim.z*blockIdx.z; + if ( (i+1) < 10 && (j+2) < 10 && (k+3) < 10 ) { + arr(i,j,k) = arr.linearized_index(i,j,k); + } +} + +extern "C" { + void launch_fill_int_array_1(gpufort::MappedArray1 arr) { + hipLaunchKernelGGL(fill_int_array_1,dim3(1),dim3(10,1,1),0,nullptr,arr); + } + void launch_fill_int_array_2(gpufort::MappedArray2 arr) { + hipLaunchKernelGGL(fill_int_array_2,dim3(1),dim3(10,10,1),0,nullptr,arr); + } + void launch_fill_int_array_3(gpufort::MappedArray3 arr) { + hipLaunchKernelGGL(fill_int_array_3,dim3(1),dim3(10,10,10),0,nullptr,arr); + } +} + From 06567c847eda88cc0967990c157ca6e80365c049 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 11 Nov 2021 16:43:46 -0500 Subject: [PATCH 34/67] gpufort/include: Manually create cudafor hip.cpp files --- include/Makefile | 2 +- include/cudafor-fort2hip.hip.cpp | 0 include/cudafor.f90 | 1 - include/cudafor.f90-fort2hip.hip.cpp | 1 + 4 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 include/cudafor-fort2hip.hip.cpp create mode 100644 include/cudafor.f90-fort2hip.hip.cpp diff --git a/include/Makefile b/include/Makefile index f1f53311..9a2e3e67 100644 --- a/include/Makefile +++ b/include/Makefile @@ -8,7 +8,7 @@ headers: gpufort --create-gpufort-headers modules: - gpufort -K cudafor.f90 + gpufort -c cudafor.f90 clean_all: for expr in "*.json" "*.mod" "*.gpufort_mod" "*-fort2hip.*" "*-gpufort.*" "*.h"; do find . -name "$$expr" -delete; done diff --git a/include/cudafor-fort2hip.hip.cpp b/include/cudafor-fort2hip.hip.cpp new file mode 100644 index 00000000..e69de29b diff --git a/include/cudafor.f90 b/include/cudafor.f90 index 50dc24da..5532a120 100644 --- a/include/cudafor.f90 +++ b/include/cudafor.f90 @@ -1,6 +1,5 @@ module cudafor type,bind(c) :: dim3 integer(c_int) :: x,y,z - integer :: d end type dim3 end module cudafor diff --git a/include/cudafor.f90-fort2hip.hip.cpp b/include/cudafor.f90-fort2hip.hip.cpp new file mode 100644 index 00000000..d23a1d4a --- /dev/null +++ b/include/cudafor.f90-fort2hip.hip.cpp @@ -0,0 +1 @@ +#include "cudafor-fort2hip.hip.cpp" \ No newline at end of file From 3eb2b703159e22ffa6a3a1ec0649679710bd4672 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Fri, 12 Nov 2021 09:00:22 -0500 Subject: [PATCH 35/67] gpufort arrays: Rename + hostptr&devptr Fortran pointer creation * gpufort arrays have been renamed: Fortran: gpufort_mapped_array_ => gpufort_array gpufort_gpu_array_ => gpufort_array_descr HIP C++: gpufort::MappedArray => gpufort::array gpufort::ArrayDescr => gpufort::array_descr * (Fortran) +gpufort_array_hostptr subroutine: Create Fortran pointer (address, array lower+upper bounds) pointing to host data * (Fortran) +gpufort_array_deviceptr subroutine: Create Fortran pointer (address, array lower+upper bounds) pointing to device data --- include/cudafor-fort2hip.hip.cpp | 0 include/cudafor.f90-fort2hip.hip.cpp | 1 - .../templates/gpufort_arrays.macros.f03 | 225 +++++++++---- .../templates/gpufort_arrays.macros.h | 34 +- .../templates/gpufort_arrays.template.f03 | 10 +- .../templates/gpufort_arrays.template.h | 24 +- .../scanner_tree_acc2hipgpufortrt.py.in | 2 +- python/translator/translator_directives.py.in | 2 +- .../test_gpufort_arrays.hip.cpp | 28 +- .../test_gpufort_arrays_interop.f03 | 315 ++++++++++-------- .../test_gpufort_arrays_kernels.hip.cpp | 13 +- 11 files changed, 379 insertions(+), 275 deletions(-) delete mode 100644 include/cudafor-fort2hip.hip.cpp delete mode 100644 include/cudafor.f90-fort2hip.hip.cpp diff --git a/include/cudafor-fort2hip.hip.cpp b/include/cudafor-fort2hip.hip.cpp deleted file mode 100644 index e69de29b..00000000 diff --git a/include/cudafor.f90-fort2hip.hip.cpp b/include/cudafor.f90-fort2hip.hip.cpp deleted file mode 100644 index d23a1d4a..00000000 --- a/include/cudafor.f90-fort2hip.hip.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "cudafor-fort2hip.hip.cpp" \ No newline at end of file diff --git a/python/fort2hip/templates/gpufort_arrays.macros.f03 b/python/fort2hip/templates/gpufort_arrays.macros.f03 index b218722c..10810285 100644 --- a/python/fort2hip/templates/gpufort_arrays.macros.f03 +++ b/python/fort2hip/templates/gpufort_arrays.macros.f03 @@ -2,89 +2,170 @@ {# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} {# Fortran side #} {% import "templates/gpufort.macros.h" as gm %} -{%- macro gpufort_arrays_fortran_routines(datatypes,max_rank) -%} -{% set prefix = "gpufort_mapped_array" %} +{# #} +{# #} +{# #} +{%- macro gpufort_arrays_fortran_data_access_interfaces(datatypes,max_rank) -%} +{% set prefix = "gpufort_array" %} {% set max_rank_ub = max_rank+1 %} +{% for loc in ["host","dev"] %} +{% set routine = (loc+"ptr") | replace("dev","device") %} +{% set iface = prefix+"_"+routine %} +!> +!> Writes {{ loc | replace("dev","device") }} address of the array data +!> and this arrays bounds to \p data_{{loc}}. +!> +interface {{iface}} + module procedure :: & {% for rank in range(1,max_rank_ub) %} -{% set f_array = prefix+"_"+rank|string %} +{% set f_array = prefix+rank|string %} +{% set binding = f_array+"_"+routine %} +{% set size_dims = ",dimension("+rank|string+")" %} +{% for tuple in datatypes %} + {{binding}}_{{tuple.f_kind}}{{",&\n" if not loop.last}}{% endfor %}{{",&" if not loop.last}} +{% endfor %} +end interface +{% endfor %} +{%- endmacro -%} +{# #} +{# #} +{# #} +{%- macro gpufort_arrays_fortran_data_access_routines(datatypes,max_rank) -%} +{% set prefix = "gpufort_array" %} +{% set max_rank_ub = max_rank+1 %} +{% for loc in ["host","dev"] %} +{% for rank in range(1,max_rank_ub) %} +{% set f_array = prefix+rank|string %} +{% set routine = (loc+"ptr") | replace("dev","device") %} +{% set binding = f_array+"_"+routine %} +{% set size_dims = ",dimension("+rank|string+")" %} +{% for tuple in datatypes %} +subroutine {{binding}}_{{tuple.f_kind}}(& + mapped_array,& + data_{{loc}}) + use iso_c_binding + use hipfort_enums + implicit none + type({{f_array}}),intent(in) :: mapped_array + {{tuple.f_type}},intent(inout),pointer,dimension(:{% for i in range(1,rank) %},:{% endfor %}) :: data_{{loc}} + ! + integer(c_int) :: offset_remainder + integer(c_int) :: {{ gm.separated_list_single_line("n",",",rank) }},& + {{ gm.separated_list_single_line("lb",",",rank) }} + ! + {{tuple.f_type}},pointer,dimension(:{% for i in range(1,rank) %},:{% endfor %}) :: tmp + ! + {{ gm.separated_list_single_line("n"," = 1; ",rank) }} = 1 + {{ gm.separated_list_single_line("lb"," = 1; ",rank) }} = 1 + ! + n{{rank}} = int(mapped_array%data%num_elements / int(mapped_array%data%stride{{rank}},& + c_size_t),c_int) +{% for i in range(rank-1,0,-1) %} + n{{i}} = mapped_array%data%stride{{i+1}} / mapped_array%data%stride{{ i }} +{% endfor %} + ! + call c_f_pointer(mapped_array%data%data_{{loc}},tmp,SHAPE=[{{ gm.separated_list_single_line("n",",",rank) }}]) + ! + offset_remainder = mapped_array%data%index_offset +{% for i in range(rank,0,-1) %} + lb{{i}} = -offset_remainder / mapped_array%data%stride{{i}} + offset_remainder = offset_remainder + lb{{i}}*mapped_array%data%stride{{i}} +{% endfor %} + ! + data_{{loc}}({{ gm.separated_list_single_line("lb",":,",rank) }}:) => tmp +end subroutine +{% endfor %} +{% endfor %} +{% endfor %} +{%- endmacro -%} +{# #} +{# #} +{# #} +{%- macro gpufort_arrays_fortran_init_routines(datatypes,max_rank) -%} +{% set prefix = "gpufort_array" %} +{% set max_rank_ub = max_rank+1 %} +{% for rank in range(1,max_rank_ub) %} +{% set f_array = prefix+rank|string %} {% set routine = "init" %} {% set binding = f_array+"_"+routine %} {% set size_dims = ",dimension("+rank|string+")" %} - function {{binding}}_host(& - mapped_array,& - bytes_per_element,& - sizes,lbounds,& - pinned, copyout_at_destruction) result(ierr) - use iso_c_binding - use hipfort_enums - implicit none - type({{f_array}}),intent(inout) :: mapped_array - integer(c_int),intent(in),value :: bytes_per_element - integer(c_int){{size_dims}},intent(in) :: sizes - integer(c_int){{size_dims}},intent(in),optional :: lbounds - logical(c_bool),intent(in),optional :: pinned, copyout_at_destruction - integer(kind(hipSuccess)) :: ierr - ! - integer(c_int),dimension({{rank}}) :: opt_lbounds - logical(c_bool) :: opt_pinned, opt_copyout_at_destruction - ! - opt_lbounds = 1 - opt_copyout_at_destruction = .false. - if ( present(lbounds) ) opt_lbounds = lbounds - if ( present(copyout_at_destruction) ) opt_copyout_at_destruction = copyout_at_destruction - ierr = {{binding}}(& - mapped_array,& - bytes_per_element,& - c_null_ptr,c_null_ptr, & - sizes, opt_lbounds,& - opt_pinned, opt_copyout_at_destruction) - end function +function {{binding}}_host(& + mapped_array,& + bytes_per_element,& + sizes,lbounds,& + pinned, copyout_at_destruction) result(ierr) + use iso_c_binding + use hipfort_enums + implicit none + type({{f_array}}),intent(inout) :: mapped_array + integer(c_int),intent(in),value :: bytes_per_element + integer(c_int){{size_dims}},intent(in) :: sizes + integer(c_int){{size_dims}},intent(in),optional :: lbounds + logical(c_bool),intent(in),optional :: pinned, copyout_at_destruction + integer(kind(hipSuccess)) :: ierr + ! + integer(c_int),dimension({{rank}}) :: opt_lbounds + logical(c_bool) :: opt_pinned, opt_copyout_at_destruction + ! + opt_lbounds = 1 + opt_copyout_at_destruction = .false. + if ( present(lbounds) ) opt_lbounds = lbounds + if ( present(copyout_at_destruction) ) opt_copyout_at_destruction = copyout_at_destruction + ierr = {{binding}}(& + mapped_array,& + bytes_per_element,& + c_null_ptr,c_null_ptr, & + sizes, opt_lbounds,& + opt_pinned, opt_copyout_at_destruction) +end function {% for tuple in datatypes %} - function {{binding}}_{{tuple.f_kind}}(& - mapped_array,& - data_host,lbounds,& - data_dev,& - pinned,copyout_at_destruction) result(ierr) - use iso_c_binding - use hipfort_enums - implicit none - type({{f_array}}),intent(inout) :: mapped_array - {{tuple.f_type}},intent(in),target,dimension(:{% for i in range(1,rank) %},:{% endfor %}) :: data_host - integer(c_int){{size_dims}},intent(in),optional :: lbounds - type(c_ptr),intent(in),optional :: data_dev - logical(c_bool),intent(in),optional :: pinned, copyout_at_destruction - integer(kind(hipSuccess)) :: ierr - ! - integer(c_int),dimension({{rank}}) :: opt_lbounds - type(c_ptr) :: opt_data_dev - logical(c_bool) :: opt_pinned, opt_copyout_at_destruction - ! - opt_lbounds = 1 - opt_data_dev = c_null_ptr - opt_copyout_at_destruction = .false. - if ( present(lbounds) ) opt_lbounds = lbounds - if ( present(data_dev) ) opt_data_dev = data_dev - if ( present(copyout_at_destruction) ) opt_copyout_at_destruction = copyout_at_destruction - ierr = {{binding}}(& - mapped_array,& - int({{tuple.bytes}}, c_int),& - c_loc(data_host),opt_data_dev,& - shape(data_host), opt_lbounds,& - opt_pinned, opt_copyout_at_destruction) - end function - +function {{binding}}_{{tuple.f_kind}}(& + mapped_array,& + data_host,lbounds,& + data_dev,& + pinned,copyout_at_destruction) result(ierr) + use iso_c_binding + use hipfort_enums + implicit none + type({{f_array}}),intent(inout) :: mapped_array + {{tuple.f_type}},intent(in),target,dimension(:{% for i in range(1,rank) %},:{% endfor %}) :: data_host + integer(c_int){{size_dims}},intent(in),optional :: lbounds + type(c_ptr),intent(in),optional :: data_dev + logical(c_bool),intent(in),optional :: pinned, copyout_at_destruction + integer(kind(hipSuccess)) :: ierr + ! + integer(c_int),dimension({{rank}}) :: opt_lbounds + type(c_ptr) :: opt_data_dev + logical(c_bool) :: opt_pinned, opt_copyout_at_destruction + ! + opt_lbounds = 1 + opt_data_dev = c_null_ptr + opt_copyout_at_destruction = .false. + if ( present(lbounds) ) opt_lbounds = lbounds + if ( present(data_dev) ) opt_data_dev = data_dev + if ( present(copyout_at_destruction) ) opt_copyout_at_destruction = copyout_at_destruction + ierr = {{binding}}(& + mapped_array,& + int({{tuple.bytes}}, c_int),& + c_loc(data_host),opt_data_dev,& + shape(data_host), opt_lbounds,& + opt_pinned, opt_copyout_at_destruction) +end function {% endfor %} {% endfor %} {%- endmacro -%} +{# #} +{# #} +{# #} {%- macro gpufort_arrays_fortran_interfaces(datatypes,max_rank) -%} {% set max_rank_ub = max_rank+1 %} -{% set prefix = "gpufort_mapped_array" %} +{% set prefix = "gpufort_array" %} {% set routine = "init" %} {% set iface = prefix+"_"+routine %} interface {{iface}} {% for rank in range(1,max_rank_ub) %} {% set size_dims = ",dimension("+rank|string+")" %} -{% set f_array = prefix+"_"+rank|string %} +{% set f_array = prefix+rank|string %} {% set binding = f_array+"_"+routine %} function {{binding}} (& mapped_array,& @@ -108,7 +189,7 @@ {% endfor %} module procedure :: & {% for rank in range(1,max_rank_ub) %} -{% set f_array = prefix+"_"+rank|string %} +{% set f_array = prefix+rank|string %} {% set binding = f_array+"_"+routine %} {{binding}}_host,& {% for tuple in datatypes %} @@ -116,11 +197,11 @@ {% endfor %} end interface -{% for routine in ["destroy","copy_data_to_host","copy_data_to_device"] %} +{% for routine in ["destroy","copy_to_host","copy_to_device"] %} {% set iface = prefix+"_"+routine %} interface {{iface}} {% for rank in range(1,max_rank_ub) %} -{% set f_array = prefix+"_"+rank|string %} +{% set f_array = prefix+rank|string %} {% set binding = f_array+"_"+routine %} function {{binding}} (mapped_array,stream) & bind(c,name="{{binding}}") & @@ -141,7 +222,7 @@ {% set iface = prefix+"_"+routine %} interface {{iface}} {% for rank in range(1,max_rank_ub) %} -{% set f_array = prefix+"_"+rank|string %} +{% set f_array = prefix+rank|string %} {% set binding = f_array+"_"+routine %} function {{binding}} (mapped_array) & bind(c,name="{{binding}}") & @@ -160,7 +241,7 @@ {% set iface = prefix+"_"+routine %} interface {{iface}} {% for rank in range(1,max_rank_ub) %} -{% set f_array = prefix+"_"+rank|string %} +{% set f_array = prefix+rank|string %} {% set binding = f_array+"_"+routine %} function {{binding}} (mapped_array,destroy_if_zero_refs) & bind(c,name="{{binding}}") & diff --git a/python/fort2hip/templates/gpufort_arrays.macros.h b/python/fort2hip/templates/gpufort_arrays.macros.h index 31a50454..45b5cb8c 100644 --- a/python/fort2hip/templates/gpufort_arrays.macros.h +++ b/python/fort2hip/templates/gpufort_arrays.macros.h @@ -7,9 +7,9 @@ extern "C" { {% for rank in range(1,max_rank+1) %} {% set c_type = "char" %} -{% set c_prefix = "gpufort_mapped_array_"+rank|string %} +{% set c_prefix = "gpufort_array"+rank|string %} __host__ hipError_t {{c_prefix}}_init ( - gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, + gpufort::array{{rank}}<{{c_type}}>* array, int bytes_per_element, {{c_type}}* data_host, {{c_type}}* data_dev, @@ -18,7 +18,7 @@ extern "C" { bool pinned, bool copyout_at_destruction ) { - return mapped_array->init( + return array->init( bytes_per_element, data_host, data_dev, sizes, lower_bounds, @@ -27,40 +27,40 @@ extern "C" { } __host__ hipError_t {{c_prefix}}_destroy( - gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, + gpufort::array{{rank}}<{{c_type}}>* array, hipStream_t stream = nullptr ) { - return mapped_array->destroy(stream); + return array->destroy(stream); } - __host__ hipError_t {{c_prefix}}_copy_data_to_host ( - gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, + __host__ hipError_t {{c_prefix}}_copy_to_host ( + gpufort::array{{rank}}<{{c_type}}>* array, hipStream_t stream = nullptr ) { - return mapped_array->copy_data_to_host(stream); + return array->copy_to_host(stream); } - __host__ hipError_t {{c_prefix}}_copy_data_to_device ( - gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, + __host__ hipError_t {{c_prefix}}_copy_to_device ( + gpufort::array{{rank}}<{{c_type}}>* array, hipStream_t stream = nullptr ) { - return mapped_array->copy_data_to_device(stream); + return array->copy_to_device(stream); } __host__ void {{c_prefix}}_inc_num_refs( - gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array + gpufort::array{{rank}}<{{c_type}}>* array ) { - mapped_array->num_refs += 1; + array->num_refs += 1; } __host__ hipError_t {{c_prefix}}_dec_num_refs( - gpufort::MappedArray{{rank}}<{{c_type}}>* mapped_array, + gpufort::array{{rank}}<{{c_type}}>* array, bool destroy_if_zero_refs, hipStream_t stream = nullptr ) { - mapped_array->num_refs -= 1; - if ( destroy_if_zero_refs && mapped_array->num_refs == 0 ) { - return mapped_array->destroy(stream); + array->num_refs -= 1; + if ( destroy_if_zero_refs && array->num_refs == 0 ) { + return array->destroy(stream); } { return hipSuccess; } diff --git a/python/fort2hip/templates/gpufort_arrays.template.f03 b/python/fort2hip/templates/gpufort_arrays.template.f03 index 6be6d3d7..c28ffbc0 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.f03 +++ b/python/fort2hip/templates/gpufort_arrays.template.f03 @@ -10,7 +10,7 @@ module gpufort_arrays {% for rank in range(1,max_rank+1) %} {% set rank_ub = rank+1 %} ! {{rank}}-dimensional array - type, bind(c) :: gpufort_gpu_array_{{rank}} + type, bind(c) :: gpufort_array_descr{{rank}} type(c_ptr) :: data_host = c_null_ptr; type(c_ptr) :: data_dev = c_null_ptr; integer(c_size_t) :: num_elements = 0; !> Number of represented by this array. @@ -19,8 +19,8 @@ module gpufort_arrays integer(c_int) :: stride{{d}} = -1; !> Stride for dimension {{d}} {% endfor %} end type - type, bind(c) :: gpufort_mapped_array_{{rank}} - type(gpufort_gpu_array_{{rank}}) :: data + type, bind(c) :: gpufort_array{{rank}} + type(gpufort_array_descr{{rank}}) :: data logical(c_bool) :: pinned = .false.; !> If the host data is pinned. logical(c_bool) :: copyout_at_destruction = .false.; !> If the device data should be copied back to the host when this struct is destroyed. logical(c_bool) :: owns_host_data = .false.; !> If this is only a wrapper, i.e. no memory management is performed. @@ -32,8 +32,10 @@ module gpufort_arrays ! interfaces {{ gam.gpufort_arrays_fortran_interfaces(datatypes,max_rank) | indent(2,True) }} +{{ gam.gpufort_arrays_fortran_data_access_interfaces(datatypes,max_rank) | indent(2,True) }} ! subroutines contains -{{ gam.gpufort_arrays_fortran_routines(datatypes,max_rank) | indent(2,True) }} +{{ gam.gpufort_arrays_fortran_init_routines(datatypes,max_rank) | indent(2,True) }} +{{ gam.gpufort_arrays_fortran_data_access_routines(datatypes,max_rank) | indent(2,True) }} end module gpufort_arrays diff --git a/python/fort2hip/templates/gpufort_arrays.template.h b/python/fort2hip/templates/gpufort_arrays.template.h index a5dc022f..ad11647c 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.h +++ b/python/fort2hip/templates/gpufort_arrays.template.h @@ -27,7 +27,7 @@ namespace gpufort { * \note Size of this struct independent of template type T. */ template - struct GpuArray{{rank}} { + struct array_descr{{rank}} { T* data_host = nullptr; T* data_dev = nullptr; size_t num_elements = 0; //> Number of represented by this array. @@ -97,8 +97,8 @@ namespace gpufort { }; template - struct MappedArray{{rank}}{ - GpuArray{{rank}} data; + struct array{{rank}}{ + array_descr{{rank}} data; bool pinned = false; //> If the host data is pinned. bool copyout_at_destruction = false; //> If the device data should be copied back to the host when this struct is destroyed. bool owns_host_data = false; //> If this is only a wrapper, i.e. no memory management is performed. @@ -106,11 +106,11 @@ namespace gpufort { int num_refs = 0; //> Number of references. int bytes_per_element = -1; //> Bytes per element; stored to make num_data_bytes routine independent of T - MappedArray{{rank}}() { + array{{rank}}() { // do nothing } - ~MappedArray{{rank}}() { + ~array{{rank}}() { // do nothing } @@ -193,7 +193,7 @@ namespace gpufort { if ( ierr == hipSuccess ) { if ( this->owns_device_data && this->data.data_dev != nullptr ) { if ( this->copyout_at_destruction ) { - this->copy_data_to_host(stream); + this->copy_to_host(stream); } ierr = hipFree(this->data.data_dev); } @@ -210,7 +210,7 @@ namespace gpufort { * Copy host data to the device. * \return Array code returned by the underlying hipMemcpy operation. */ - __host__ hipError_t copy_data_to_host(hipStream_t stream = nullptr) { + __host__ hipError_t copy_to_host(hipStream_t stream = nullptr) { return hipMemcpyAsync( (void*) this->data.data_host, (void*) this->data.data_dev, @@ -222,7 +222,7 @@ namespace gpufort { * Copy device data to the host. * \return Array code returned by the underlying hipMemcpy operation. */ - __host__ hipError_t copy_data_to_device(hipStream_t stream = nullptr) { + __host__ hipError_t copy_to_device(hipStream_t stream = nullptr) { return hipMemcpyAsync( (void*) this->data.data_dev, (void*) this->data.data_host, @@ -237,10 +237,10 @@ namespace gpufort { * \param[in] device_struct device memory address to copy to */ __host__ hipError_t copy_self_to_device( - gpufort::MappedArray{{rank}}* device_struct, + gpufort::array{{rank}}* device_struct, hipStream_t stream = nullptr ) { - const size_t size = sizeof(MappedArray{{rank}}); // sizeof(T*) = sizeof(char*) + const size_t size = sizeof(array{{rank}}); // sizeof(T*) = sizeof(char*) return hipMemcpyAsync( (void*) device_struct, (void*) this, @@ -255,10 +255,10 @@ namespace gpufort { * \param[inout] device_copy pointer to device copy pointer */ __host__ hipError_t create_device_copy( - gpufort::MappedArray{{rank}}** device_copy, + gpufort::array{{rank}}** device_copy, hipStream_t stream = nullptr ) { - const size_t size = sizeof(MappedArray{{rank}}); // sizeof(T*) = sizeof(char*) + const size_t size = sizeof(array{{rank}}); // sizeof(T*) = sizeof(char*) hipError_t ierr = hipMalloc((void**)device_copy,size); if ( ierr == hipSuccess ) { return this->copy_self_to_device(*device_copy,stream); diff --git a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in index 203420d0..d9437af7 100644 --- a/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in +++ b/python/scanner/openacc/scanner_tree_acc2hipgpufortrt.py.in @@ -399,4 +399,4 @@ register_acc_backend("hip-gpufort-rt",\ Acc2HipGpufortRTPostprocess,\ AllocateHipGpufortRT,\ DeallocateHipGpufortRT,\ - "gpufort_acc_runtime") + "gpufort_acc_runtime") \ No newline at end of file diff --git a/python/translator/translator_directives.py.in b/python/translator/translator_directives.py.in index 56f2b6a3..ab30ace3 100644 --- a/python/translator/translator_directives.py.in +++ b/python/translator/translator_directives.py.in @@ -591,4 +591,4 @@ def format_directive(directive_line,max_line_width): line = sentinel+" " line += tk+" " result += line.rstrip() - return result + return result \ No newline at end of file diff --git a/test/gpufort_arrays/test_gpufort_arrays.hip.cpp b/test/gpufort_arrays/test_gpufort_arrays.hip.cpp index ebfb5099..6b833385 100644 --- a/test/gpufort_arrays/test_gpufort_arrays.hip.cpp +++ b/test/gpufort_arrays/test_gpufort_arrays.hip.cpp @@ -6,9 +6,9 @@ #include "test_gpufort_arrays_kernels.hip.cpp" void test1() { - gpufort::MappedArray1 int_array1; - gpufort::MappedArray2 int_array2; - gpufort::MappedArray3 int_array3; + gpufort::array1 int_array1; + gpufort::array2 int_array2; + gpufort::array3 int_array3; HIP_CHECK(int_array1.init(sizeof(int),nullptr,nullptr, 10, -1, true)); // hostptr,devptr, count, lower bound, pinned HIP_CHECK(int_array2.init(sizeof(int),nullptr,nullptr, 10,10, -1,-2, true)); @@ -34,9 +34,9 @@ void test1() { launch_fill_int_array_2(int_array2); launch_fill_int_array_3(int_array3); - HIP_CHECK(int_array1.copy_data_to_host()); - HIP_CHECK(int_array2.copy_data_to_host()); - HIP_CHECK(int_array3.copy_data_to_host()); + HIP_CHECK(int_array1.copy_to_host()); + HIP_CHECK(int_array2.copy_to_host()); + HIP_CHECK(int_array3.copy_to_host()); HIP_CHECK(hipDeviceSynchronize()); @@ -53,13 +53,13 @@ void test1() { } void test2() { - gpufort::MappedArray3 bool_array; - gpufort::MappedArray3 short_array; - gpufort::MappedArray3 char_array; - gpufort::MappedArray3 int_array; - gpufort::MappedArray3 long_array; - gpufort::MappedArray3 float_array; - gpufort::MappedArray3 double_array; + gpufort::array3 bool_array; + gpufort::array3 short_array; + gpufort::array3 char_array; + gpufort::array3 int_array; + gpufort::array3 long_array; + gpufort::array3 float_array; + gpufort::array3 double_array; assert(sizeof(bool_array)==sizeof(short_array)); assert(sizeof(char_array)==sizeof(short_array)); assert(sizeof(char_array)==sizeof(int_array)); @@ -71,6 +71,6 @@ void test2() { int main(int argc,char** argv) { test1(); test2(); - + std::cout << "PASSED" << std::endl; return 0; } diff --git a/test/gpufort_arrays/test_gpufort_arrays_interop.f03 b/test/gpufort_arrays/test_gpufort_arrays_interop.f03 index d8d63e73..fce45cfc 100644 --- a/test/gpufort_arrays/test_gpufort_arrays_interop.f03 +++ b/test/gpufort_arrays/test_gpufort_arrays_interop.f03 @@ -1,150 +1,7 @@ program test_gpufort_arrays_interop - use gpufort_arrays - use hipfort_check - use hipfort - implicit none - ! - interface - subroutine launch_fill_int_array_1(arr) & - bind(c,name="launch_fill_int_array_1") - use gpufort_arrays - type(gpufort_mapped_array_1),intent(inout) :: arr - end subroutine - subroutine launch_fill_int_array_2(arr) & - bind(c,name="launch_fill_int_array_2") - use gpufort_arrays - type(gpufort_mapped_array_2),intent(inout) :: arr - end subroutine - subroutine launch_fill_int_array_3(arr) & - bind(c,name="launch_fill_int_array_3") - use gpufort_arrays - type(gpufort_mapped_array_3),intent(inout) :: arr - end subroutine - end interface - ! - type(gpufort_mapped_array_1) :: marr1 - type(gpufort_mapped_array_2) :: marr2 - type(gpufort_mapped_array_3) :: marr3 - type(gpufort_mapped_array_4) :: marr4 - type(gpufort_mapped_array_5) :: marr5 - ! - real(c_float),target :: host_array_3(-1:8,-2:7,-3:6) - real(c_double_complex),target :: host_array_4(-1:8,-2:7,-3:6,-4:5) - integer(c_int),dimension(5) :: sizes5,lbounds5 - integer(c_int),pointer,dimension(:,:,:,:,:) :: tmp5, host_array_5 - ! - type(gpufort_mapped_array_1) :: int_marr1 - type(gpufort_mapped_array_2) :: int_marr2 - type(gpufort_mapped_array_3) :: int_marr3 - ! - integer(c_int),target :: int_array_1(-1:8) - integer(c_int),target :: int_array_2(-1:8,-2:7) - integer(c_int),target :: int_array_3(-1:8,-2:7,-3:6) - ! - integer :: i,j,k,n - - ! - ! PART 1: Creating mapped arrays - ! - - ! direct access; set from existing pointer - ! mapped_array,& - ! bytes_per_element,& - ! data_host,data_dev,& - ! sizes, lbounds,& - ! pinned, copyout_at_destruction) & - call hipCheck(gpufort_mapped_array_init(marr3,& - c_float,c_loc(host_array_3),c_null_ptr,& - shape(host_array_3),lbound(host_array_3),& - .false._c_bool,.false._c_bool)) - - call assert(marr3%data%stride1==1) - call assert(marr3%data%stride2==10) - call assert(marr3%data%stride3==100) - call assert(marr3%data%index_offset==321) - call assert(marr3%data%num_elements==1000) - - ! overloaded access; set from existing pointer - call hipCheck(gpufort_mapped_array_init(marr4,& - host_array_4, lbounds=lbound(host_array_4))) - - call assert(marr4%data%stride1==1) - call assert(marr4%data%stride2==10) - call assert(marr4%data%stride3==100) - call assert(marr4%data%stride4==1000) - call assert(marr4%data%index_offset==4321) - call assert(marr4%data%num_elements==10000) - - ! allocate device AND (pinned) host array - sizes5 = 4 - lbounds5 = -1 - call hipCheck(gpufort_mapped_array_init(marr5,& - c_int,sizes5,lbounds=lbounds5,pinned=.true._c_bool)) - call c_f_pointer(marr5%data%data_host,tmp5,shape=sizes5) - host_array_5(-1:,-1:,-1:,-1:,-1:) => tmp5 - - call assert(marr5%data%stride1==1) - call assert(marr5%data%stride2==4) - call assert(marr5%data%stride3==16) - call assert(marr5%data%stride4==64) - call assert(marr5%data%stride5==256) - call assert(marr5%data%index_offset==1+4+16+64+256) - call assert(marr5%data%num_elements==1024) - - ! destroy - call hipCheck(gpufort_mapped_array_destroy(marr3,c_null_ptr)) - call hipCheck(gpufort_mapped_array_destroy(marr4,c_null_ptr)) - call hipCheck(gpufort_mapped_array_destroy(marr5,c_null_ptr)) - - ! - ! PART 2: Interfacing - ! - call hipCheck(gpufort_mapped_array_init(int_marr1,& - int_array_1, lbounds=lbound(int_array_1))) - call hipCheck(gpufort_mapped_array_init(int_marr2,& - int_array_2, lbounds=lbound(int_array_2))) - call hipCheck(gpufort_mapped_array_init(int_marr3,& - int_array_3, lbounds=lbound(int_array_3))) - - ! call C code - call launch_fill_int_array_1(int_marr1) - call launch_fill_int_array_2(int_marr2) - call launch_fill_int_array_3(int_marr3) - - ! copy data to host - call hipCheck(gpufort_mapped_array_copy_data_to_host(int_marr1,c_null_ptr)) - call hipCheck(gpufort_mapped_array_copy_data_to_host(int_marr2,c_null_ptr)) - call hipCheck(gpufort_mapped_array_copy_data_to_host(int_marr3,c_null_ptr)) - - ! check - call hipCheck(hipDeviceSynchronize()) - - n=0 - do i = -1,8 - call assert(int_array_1(i) == n) - n = n +1 - end do - n=0 - do j = -2,7 - do i = -1,8 - call assert(int_array_2(i,j) == n) - n = n +1 - end do - end do - n=0 - do k = -3,6 - do j = -2,7 - do i = -1,8 - call assert(int_array_3(i,j,k) == n) - n = n +1 - end do - end do - end do - - ! destroy - call hipCheck(gpufort_mapped_array_destroy(int_marr1,c_null_ptr)) - call hipCheck(gpufort_mapped_array_destroy(int_marr2,c_null_ptr)) - call hipCheck(gpufort_mapped_array_destroy(int_marr3,c_null_ptr)) + call test_array_initialization() + call test_hip_interfacing() + print *, "PASSED" contains subroutine assert(condition) @@ -152,4 +9,170 @@ subroutine assert(condition) ! if ( .not. condition ) ERROR STOP "assertion failed" end subroutine + + subroutine test_array_initialization() + use gpufort_arrays + use hipfort_check + use hipfort + implicit none + ! + type(gpufort_array3) :: marr3 + type(gpufort_array4) :: marr4 + type(gpufort_array5) :: marr5 + ! + real(c_float),target :: host_array_3(-1:8,-2:7,-3:6) + real(c_double_complex),target :: host_array_4(-1:8,-2:7,-3:6,-4:5) + integer(c_int),pointer,dimension(:,:,:,:,:) :: host_array_5, device_array_5 + ! + integer :: i,j,k,n + + ! + ! PART 1: Creating mapped arrays + ! + + ! direct access; set from existing pointer + ! mapped_array,& + ! bytes_per_element,& + ! data_host,data_dev,& + ! sizes, lbounds,& + ! pinned, copyout_at_destruction) & + call hipCheck(gpufort_array_init(marr3,& + c_float,c_loc(host_array_3),c_null_ptr,& + shape(host_array_3),lbound(host_array_3),& + .false._c_bool,.false._c_bool)) + + call assert(marr3%data%stride1==1) + call assert(marr3%data%stride2==10) + call assert(marr3%data%stride3==100) + call assert(marr3%data%index_offset==321) + call assert(marr3%data%num_elements==1000) + + ! overloaded access; set from existing pointer + call hipCheck(gpufort_array_init(marr4,& + host_array_4, lbounds=lbound(host_array_4))) + + call assert(marr4%data%stride1==1) + call assert(marr4%data%stride2==10) + call assert(marr4%data%stride3==100) + call assert(marr4%data%stride4==1000) + call assert(marr4%data%index_offset==4321) + call assert(marr4%data%num_elements==10000) + + ! allocate device AND (pinned) host array + call hipCheck(gpufort_array_init(marr5,& + c_int,[4,4,4,4,4],lbounds=[-1,-1,-1,-1,-1],pinned=.true._c_bool)) + call assert(marr5%data%stride1==1) + call assert(marr5%data%stride2==4) + call assert(marr5%data%stride3==16) + call assert(marr5%data%stride4==64) + call assert(marr5%data%stride5==256) + call assert(marr5%data%index_offset==1+4+16+64+256) + call assert(marr5%data%num_elements==1024) + + ! obtain host data as Fortran pointer + call gpufort_array_hostptr(marr5,host_array_5) + do n = 1,5 + call assert(size(host_array_5,n) == 4) + call assert(lbound(host_array_5,n) == -1) + end do + !call assert(c_loc(host_array_5) == marr5%data%data_host) + + ! obtain device data as Fortran pointer + call gpufort_array_deviceptr(marr5,device_array_5) + do n = 1,5 + call assert(size(device_array_5,n) == 4) + call assert(lbound(device_array_5,n) == -1) + end do + !call assert(c_loc(device_array_5) == marr5%data%data_dev) + + ! destroy + call hipCheck(gpufort_array_destroy(marr3,c_null_ptr)) + call hipCheck(gpufort_array_destroy(marr4,c_null_ptr)) + call hipCheck(gpufort_array_destroy(marr5,c_null_ptr)) + end subroutine + + subroutine test_hip_interfacing() + use gpufort_arrays + use hipfort_check + use hipfort + implicit none + ! + interface + subroutine launch_fill_int_array_1(arr) & + bind(c,name="launch_fill_int_array_1") + use gpufort_arrays + type(gpufort_array1),intent(inout) :: arr + end subroutine + subroutine launch_fill_int_array_2(arr) & + bind(c,name="launch_fill_int_array_2") + use gpufort_arrays + type(gpufort_array2),intent(inout) :: arr + end subroutine + subroutine launch_fill_int_array_3(arr) & + bind(c,name="launch_fill_int_array_3") + use gpufort_arrays + type(gpufort_array3),intent(inout) :: arr + end subroutine + end interface + ! + type(gpufort_array1) :: int_marr1 + type(gpufort_array2) :: int_marr2 + type(gpufort_array3) :: int_marr3 + ! + integer(c_int),target :: int_array_1(-1:8) + integer(c_int),target :: int_array_2(-1:8,-2:7) + integer(c_int),target :: int_array_3(-1:8,-2:7,-3:6) + ! + integer :: i,j,k,n + + ! + ! PART 2: Interfacing + ! + call hipCheck(gpufort_array_init(int_marr1,& + int_array_1, lbounds=lbound(int_array_1))) + call hipCheck(gpufort_array_init(int_marr2,& + int_array_2, lbounds=lbound(int_array_2))) + call hipCheck(gpufort_array_init(int_marr3,& + int_array_3, lbounds=lbound(int_array_3))) + + ! call C code + call launch_fill_int_array_1(int_marr1) + call launch_fill_int_array_2(int_marr2) + call launch_fill_int_array_3(int_marr3) + + ! copy data to host + call hipCheck(gpufort_array_copy_to_host(int_marr1,c_null_ptr)) + call hipCheck(gpufort_array_copy_to_host(int_marr2,c_null_ptr)) + call hipCheck(gpufort_array_copy_to_host(int_marr3,c_null_ptr)) + + ! check + call hipCheck(hipDeviceSynchronize()) + + n=0 + do i = -1,8 + call assert(int_array_1(i) == n) + n = n +1 + end do + n=0 + do j = -2,7 + do i = -1,8 + call assert(int_array_2(i,j) == n) + n = n +1 + end do + end do + n=0 + do k = -3,6 + do j = -2,7 + do i = -1,8 + call assert(int_array_3(i,j,k) == n) + n = n +1 + end do + end do + end do + + ! destroy + call hipCheck(gpufort_array_destroy(int_marr1,c_null_ptr)) + call hipCheck(gpufort_array_destroy(int_marr2,c_null_ptr)) + call hipCheck(gpufort_array_destroy(int_marr3,c_null_ptr)) + end subroutine end program diff --git a/test/gpufort_arrays/test_gpufort_arrays_kernels.hip.cpp b/test/gpufort_arrays/test_gpufort_arrays_kernels.hip.cpp index 68e9f42d..4a92db6a 100644 --- a/test/gpufort_arrays/test_gpufort_arrays_kernels.hip.cpp +++ b/test/gpufort_arrays/test_gpufort_arrays_kernels.hip.cpp @@ -4,7 +4,7 @@ #include "gpufort_arrays.h" __global__ void fill_int_array_1( - gpufort::MappedArray1 arr + gpufort::array1 arr ) { int i = -1+threadIdx.x + blockDim.x*blockIdx.x; if ( (i+1) < 10 ) { @@ -14,7 +14,7 @@ __global__ void fill_int_array_1( } __global__ void fill_int_array_2( - gpufort::MappedArray2 arr + gpufort::array2 arr ) { int i = -1+threadIdx.x + blockDim.x*blockIdx.x; int j = -2+threadIdx.y + blockDim.y*blockIdx.y; @@ -24,7 +24,7 @@ __global__ void fill_int_array_2( } __global__ void fill_int_array_3( - gpufort::MappedArray3 arr + gpufort::array3 arr ) { int i = -1+threadIdx.x + blockDim.x*blockIdx.x; int j = -2+threadIdx.y + blockDim.y*blockIdx.y; @@ -35,14 +35,13 @@ __global__ void fill_int_array_3( } extern "C" { - void launch_fill_int_array_1(gpufort::MappedArray1 arr) { + void launch_fill_int_array_1(gpufort::array1 arr) { hipLaunchKernelGGL(fill_int_array_1,dim3(1),dim3(10,1,1),0,nullptr,arr); } - void launch_fill_int_array_2(gpufort::MappedArray2 arr) { + void launch_fill_int_array_2(gpufort::array2 arr) { hipLaunchKernelGGL(fill_int_array_2,dim3(1),dim3(10,10,1),0,nullptr,arr); } - void launch_fill_int_array_3(gpufort::MappedArray3 arr) { + void launch_fill_int_array_3(gpufort::array3 arr) { hipLaunchKernelGGL(fill_int_array_3,dim3(1),dim3(10,10,10),0,nullptr,arr); } } - From 22a863ea2fe066d6be6314c51d4059ceeb678fda Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Fri, 12 Nov 2021 13:44:41 -0500 Subject: [PATCH 36/67] Simplify a few examples. --- .../vector-add-module-vars.f90 | 4 +--- .../vector-add-procedures.f90 | 20 ++++++++----------- .../openacc/vector-add-declare/vector-add.f90 | 4 +--- .../src/gpufort_acc_runtime_base.f90 | 19 ++++++++++-------- .../src/gpufort_acc_runtime_c_impl.h | 1 + 5 files changed, 22 insertions(+), 26 deletions(-) diff --git a/examples/openacc/vector-add-declare/vector-add-module-vars.f90 b/examples/openacc/vector-add-declare/vector-add-module-vars.f90 index 48792589..1f64376d 100644 --- a/examples/openacc/vector-add-declare/vector-add-module-vars.f90 +++ b/examples/openacc/vector-add-declare/vector-add-module-vars.f90 @@ -16,9 +16,7 @@ program main allocate(x1(N),x2(N)) - do i = 1, N - y_exact(i) = 4 - end do + y_exact = 4 !$acc parallel loop do i = 1, N diff --git a/examples/openacc/vector-add-declare/vector-add-procedures.f90 b/examples/openacc/vector-add-declare/vector-add-procedures.f90 index 64eab7bd..76d6b54a 100644 --- a/examples/openacc/vector-add-declare/vector-add-procedures.f90 +++ b/examples/openacc/vector-add-declare/vector-add-procedures.f90 @@ -3,24 +3,20 @@ program main implicit none integer, parameter :: N = 1000 - integer :: i - integer(4) :: x(N), y(N), y_exact(N) + integer :: i,j + integer(4) :: x(N,N), y(N,N), y_exact(N) - do i = 1, N - y_exact(i) = 3 - end do + y_exact = 3 - do i = 1, N - x(i) = 1 - y(i) = 2 - end do + x = 1 + y = 2 - call vector_add_gpu(x,y,.FALSE.) - call vector_add_gpu(x,y,.TRUE.) ! return prematurely; do not perform addition + call vector_add_gpu(x(1:,3),y(1:,3),.FALSE.) + call vector_add_gpu(x(1:,3),y(1:,3),.TRUE.) ! return prematurely; do not perform addition do i = 1, N if ( y_exact(i) .ne.& - y(i) ) ERROR STOP "GPU and CPU result do not match" + y(i,3) ) ERROR STOP "GPU and CPU result do not match" end do print *, "PASSED" diff --git a/examples/openacc/vector-add-declare/vector-add.f90 b/examples/openacc/vector-add-declare/vector-add.f90 index 80c9f363..397c7b39 100644 --- a/examples/openacc/vector-add-declare/vector-add.f90 +++ b/examples/openacc/vector-add-declare/vector-add.f90 @@ -7,9 +7,7 @@ program main integer(4) :: x(N), y(N), y_exact(N) !$acc declare create(x,y) - do i = 1, N - y_exact(i) = 3 - end do + y_exact = 3 !$acc parallel loop do i = 1, N diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 index 11bea0d8..822dd8a4 100644 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 @@ -501,12 +501,12 @@ subroutine t_record_destroy_(record) implicit none class(t_record),intent(inout) :: record ! - if ( LOG_LEVEL > 1 ) then - write(output_unit,fmt="(a)",advance="no") "[gpufort-rt][2] destroy record: " - flush(output_unit) - call record%print() - flush(output_unit) - endif + if ( LOG_LEVEL > 1 ) then + write(output_unit,fmt="(a)",advance="no") "[gpufort-rt][2] destroy record: " + flush(output_unit) + call record%print() + flush(output_unit) + endif call hipCheck(hipFree(record%deviceptr)) record%deviceptr = c_null_ptr record%hostptr = c_null_ptr @@ -973,6 +973,8 @@ function gpufort_acc_present_b(hostptr,num_bytes,module_var,or,async) result(dev fits = is_subarray(record_list_%records(loc)%hostptr,record_list_%records(loc)%num_bytes,hostptr,num_bytes,offset_bytes) deviceptr = inc_cptr(record_list_%records(loc)%deviceptr,offset_bytes) else + offset_bytes = -1 + success = .true. opt_or = eval_optval_(or,gpufort_acc_event_undefined) select case (opt_or) case (gpufort_acc_event_copy) @@ -984,12 +986,13 @@ function gpufort_acc_present_b(hostptr,num_bytes,module_var,or,async) result(dev case (gpufort_acc_event_copyout) deviceptr = gpufort_acc_copyout_b(hostptr,num_bytes,async,module_var) case default + success = .false. print *, "ERROR: did not find record for hostptr:" CALL print_cptr(hostptr) ERROR STOP "gpufort_acc_present_b: no record found for hostptr" end select endif - if ( LOG_LEVEL > 0 ) then + if ( LOG_LEVEL > 0 .and. success ) then write(output_unit,fmt="(a)",advance="no") "[gpufort-rt][1] gpufort_acc_present_b: retrieved deviceptr=" flush(output_unit) CALL print_cptr(deviceptr) @@ -1356,4 +1359,4 @@ subroutine gpufort_acc_update_device_b(hostptr,condition,if_present,async,module endif end subroutine -end module \ No newline at end of file +end module diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_c_impl.h b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_c_impl.h index 6f85a10d..42fcff29 100644 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_c_impl.h +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_c_impl.h @@ -16,6 +16,7 @@ std::ostream& operator<<(std::ostream& os, record_creational_event ce) case record_creational_event::gpufort_acc_event_create : os << "create"; break; case record_creational_event::gpufort_acc_event_copyin : os << "copyin"; break; case record_creational_event::gpufort_acc_event_copyout : os << "copyout"; break; + case record_creational_event::gpufort_acc_event_copy : os << "copy"; break; default: os.setstate(std::ios_base::failbit); } return os; From df5b181978980706dbff17e453e09cb9149b5b86 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Fri, 12 Nov 2021 14:23:37 -0500 Subject: [PATCH 37/67] Central Makefile: Extract and use make_directories target --- Makefile | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 8b0fc5a1..15ac6f4f 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ LIBGPUFORT_ACC = libgpufort_acc_$(SUFFIX).a GPUFORT_DIR = $(shell gpufort --path) GPUFORT_ACC_DIR = $(GPUFORT_DIR)/runtime/gpufort_acc_runtime -all: | gpufort_headers gpufort_sources lib/$(LIBGPUFORT) lib/$(LIBGPUFORT_ACC) +all: | gpufort_headers lib/$(LIBGPUFORT) lib/$(LIBGPUFORT_ACC) make_directories gpufort_headers: make -C $(GPUFORT_DIR)/include all @@ -15,24 +15,26 @@ gpufort_headers: gpufort_sources: make -C $(GPUFORT_DIR)/src gpufort_sources -lib/$(LIBGPUFORT): gpufort_headers - make -C $(GPUFORT_DIR)/src all - mkdir -p $(GPUFORT_DIR)/lib +lib/$(LIBGPUFORT): | gpufort_headers gpufort_sources make_directories + make -C $(GPUFORT_DIR)/src $(LIBGPUFORT) mv $(GPUFORT_DIR)/src/$(LIBGPUFORT) $(GPUFORT_DIR)/lib - mv $(GPUFORT_DIR)/src/*.mod $(GPUFORT_DIR)/include/$(SUFFIX) + mv $(GPUFORT_DIR)/src/*.mod $(GPUFORT_DIR)/include/$(SUFFIX)/ make -C $(GPUFORT_DIR)/src clean -lib/$(LIBGPUFORT_ACC): +lib/$(LIBGPUFORT_ACC): make_directories make -C $(GPUFORT_ACC_DIR)/ lib/$(LIBGPUFORT_ACC) mv $(GPUFORT_ACC_DIR)/lib/$(LIBGPUFORT_ACC)\ - $(GPUFORT_DIR)/lib/ - mkdir -p $(GPUFORT_DIR)/include/$(SUFFIX) + $(GPUFORT_DIR)/lib/ mv $(GPUFORT_ACC_DIR)/include/*.mod\ - $(GPUFORT_DIR)/include/$(SUFFIX) + $(GPUFORT_DIR)/include/$(SUFFIX)/ #-mv $(GPUFORT_ACC_DIR)/include/*.h\ - # $(GPUFORT_DIR)/include/$(SUFFIX) + # $(GPUFORT_DIR)/include/$(SUFFIX) make -C $(GPUFORT_ACC_DIR)/ clean +make_directories: + mkdir -p $(GPUFORT_DIR)/lib + mkdir -p $(GPUFORT_DIR)/include/$(SUFFIX) + clean_all: make -C $(GPUFORT_DIR)/include clean_all make -C $(GPUFORT_DIR)/src clean_all From fa61ed468318fa540aa0fe7c8da5a1fc96d19c6b Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Fri, 12 Nov 2021 14:31:17 -0500 Subject: [PATCH 38/67] BUGFIX: Create empty cudafor-fort2hip.hip.cpp as cudafor apps expect it --- include/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/include/Makefile b/include/Makefile index 9a2e3e67..dbdeb7ca 100644 --- a/include/Makefile +++ b/include/Makefile @@ -6,6 +6,7 @@ all: headers modules headers: gpufort --create-gpufort-headers + touch cudafor-fort2hip.hip.cpp modules: gpufort -c cudafor.f90 From bc5431542fd788109f40cdbafc569dd62773e980 Mon Sep 17 00:00:00 2001 From: Dominic Charrier Date: Fri, 12 Nov 2021 20:46:43 +0100 Subject: [PATCH 39/67] Delete todos.md --- notes/todos.md | 62 -------------------------------------------------- 1 file changed, 62 deletions(-) delete mode 100755 notes/todos.md diff --git a/notes/todos.md b/notes/todos.md deleted file mode 100755 index 8d80350d..00000000 --- a/notes/todos.md +++ /dev/null @@ -1,62 +0,0 @@ -# ToDos - -* [ ] Implement kernel subroutine parser - * [ ] Remove input parameters from declarations in body; - * can be deduced from arglist - * return type is always void - * [x] Make grid,dim,sharedMem (int) and stream (type(c_ptr)) - arguments to kernel. Do not deduce them - -* [ ] Handle struct / derived type arguments to cuf kernels / kernel subroutines - * ~~Proposed solution: Flatten out the expression, use "TODO ..." as default type~~ - * ~~Eventually need a way to parse derived types ...~~ - * [x] Parse types and demangle all members. Create dummy variables with name "a%b%c" -* [x] Compress linear index mappings -* [x] Identify local variables in cuf kernels ... -* [x] and remove them from arg list, - * Scan for scalar lvalues - * Problem: need also to check if they have been used in function before assignment - * Proposed solution: - * Find all assignments and arithmeticLogicExpression in order - * Find rvalues and lvalues per expression, i.e have list [ { "lvalue" : [] , "rvalues": [] } ] - * Check if lvalue was used as rvalue before. If so, do not include in result list - * Problem: (Minor) When we do adaptive parsing, some lines are commented out, i.e. result might contain errors. - * Proposed solution: Do ignore result of procedure in this case -* [ ] detect reduced variables - * Criterion: scalar variable that is assigned but not read anymore - * [ ] compute partial sum per variable - * [ ] -* [ ] Add option to specify search dir as individual files, this allows to filter out some files - and be more specific what to include in scan and what not. -* [x] More type conversions and conjugate functions (dcmplx, dconjg, ...) -* [ ] Detect "/= 0" expressions and replace with "c_associated(...)" if type is stream or cufft plan (interger) type. - -* To replace expression in array evaluations, I need to know the index str / macro from the corresponding declaration. - * Problem is that I do not know the lower bound. Save lbound as well? - * Decision: Ignore for now! - -# Code snippets: - - -Search and replace expression: - -```python -for tokens,start,end in expr.scanString(string): - print(string.replace(string[start:end],"EDIT")) -``` - -for tokens,start,end in expr.scanString(string): - tokens[0].configure(extra="50") - print(string.replace(string[start:end],tokens[0].__str__())) - - -# Revision - - WHICH information do I need to introduce to the tree? - - allocate, copy intrinsices - if variable is on the device | (CUF,ACC)->HIP, CUF->OMP - - place holders if device pointers need to be introduced - if we need a variable | (CUF,ACC)->HIP - - device variables/subroutines if we need to declare them on the device | CUF -> OMP - What is needed only for ACC -> OMP? - - for some directives, only source2source - - OpenACC implicitly assumes that scalars are private -> need to know what is a scalar - From 62ea370bf0a5672b9f20a7130027044f228c0c91 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Fri, 12 Nov 2021 18:00:05 -0500 Subject: [PATCH 40/67] FEATURE: Add size/lbound/ubound to C++ gpufort array; add example --- examples/gpufort-arrays/vector-add/Makefile | 6 ++ .../vector-add/main-kernels.hip.cpp | 49 +++++++++ .../gpufort-arrays/vector-add/vector-add.f90 | 44 ++++++++ .../templates/gpufort_arrays.template.h | 102 ++++++++++++++++-- 4 files changed, 195 insertions(+), 6 deletions(-) create mode 100644 examples/gpufort-arrays/vector-add/Makefile create mode 100644 examples/gpufort-arrays/vector-add/main-kernels.hip.cpp create mode 100644 examples/gpufort-arrays/vector-add/vector-add.f90 diff --git a/examples/gpufort-arrays/vector-add/Makefile b/examples/gpufort-arrays/vector-add/Makefile new file mode 100644 index 00000000..cebc89be --- /dev/null +++ b/examples/gpufort-arrays/vector-add/Makefile @@ -0,0 +1,6 @@ +vector-add: + hipcc -c $(shell gpufort --cpp_config) main-kernels.hip.cpp -o main-kernels.hip.o + hipfc $(shell gpufort --gfortran_config) main-kernels.hip.o vector-add.f90 -o vector-add $(shell gpufort --ldflags) + +clean: + rm -f *.mod *.o vector-add diff --git a/examples/gpufort-arrays/vector-add/main-kernels.hip.cpp b/examples/gpufort-arrays/vector-add/main-kernels.hip.cpp new file mode 100644 index 00000000..d870ed43 --- /dev/null +++ b/examples/gpufort-arrays/vector-add/main-kernels.hip.cpp @@ -0,0 +1,49 @@ +// This file was generated by gpufort +#ifndef __KERNELS_HIP_CPP__ +#define __KERNELS_HIP_CPP__ +#include "hip/hip_runtime.h" +#include "hip/hip_complex.h" +#include "gpufort.h" +#include "gpufort_arrays.h" + + +// BEGIN main_26_e28c45 +/* + HIP C++ implementation of the function/loop body of: + + !$cuf kernel do(1) <<>> + do i=1,size(y_d,1) + y_d(i) = y_d(i) + a*xi + end do + +*/ + +__global__ void vecadd_kernel( + gpufort::array1 y_d, + float a, + gpufort::array1 x_d +) { + int i = 1 + (1)*(threadIdx.x + blockIdx.x * blockDim.x); + if (loop_cond(i,y_d.size(1),1)) { + y_d(i)= y_d(i) + a*x_d(i); + } +} + +extern "C" void launch_vecadd_kernel_auto( + const int sharedmem, + hipStream_t stream, + gpufort::array1* y_d, + float a, + gpufort::array1* x_d +) { + const int vecadd_kernel_blockX = 128; + dim3 block(vecadd_kernel_blockX); + const int vecadd_kernel_NX = (1 + (((*y_d).size(1)) - (1))); + const int vecadd_kernel_gridX = divideAndRoundUp( vecadd_kernel_NX, vecadd_kernel_blockX ); + dim3 grid(vecadd_kernel_gridX); + + // launch kernel + hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, (*y_d), a, (*x_d)); +} +// END vecadd_kernel +#endif // __KERNELS_HIP_CPP__ diff --git a/examples/gpufort-arrays/vector-add/vector-add.f90 b/examples/gpufort-arrays/vector-add/vector-add.f90 new file mode 100644 index 00000000..21db0335 --- /dev/null +++ b/examples/gpufort-arrays/vector-add/vector-add.f90 @@ -0,0 +1,44 @@ +program main + use hipfort + use hipfort_check + use gpufort_arrays + implicit none + integer, parameter :: N = 40000 + real :: x(N), y(N), a + type(gpufort_array1) :: x_d, y_d + type(dim3) :: grid, tBlock + type(c_ptr) :: stream = c_null_ptr + ! + interface + subroutine launch_vecadd_kernel_auto(& + sharedmem,stream,y_d,a,x_d) & + bind(c,name="launch_vecadd_kernel_auto") + use iso_c_binding + use gpufort_arrays + implicit none + integer,value :: sharedmem + type(c_ptr),value :: stream + type(gpufort_array1) :: x_d, y_d + real,value :: a + end subroutine + end interface + ! + tBlock = dim3(256,1,1) + grid = dim3(ceiling(real(N)/tBlock%x),1,1) + + call hipCheck(gpufort_array_init(x_d,x)) + call hipCheck(gpufort_array_init(y_d,y)) + + x = 1.0; y = 2.0; a = 2.0 + call hipCheck(gpufort_array_copy_to_device(x_d,stream)) + call hipCheck(gpufort_array_copy_to_device(y_d,stream)) + + call launch_vecadd_kernel_auto(0,stream,y_d,a,x_d) + + call hipCheck(gpufort_array_copy_to_host(y_d,stream)) + + call hipCheck(gpufort_array_destroy(x_d,stream)) + call hipCheck(gpufort_array_destroy(y_d,stream)) + + write(*,*) 'Max error: ', maxval(abs(y-4.0)) +end program main diff --git a/python/fort2hip/templates/gpufort_arrays.template.h b/python/fort2hip/templates/gpufort_arrays.template.h index ad11647c..c10016c0 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.h +++ b/python/fort2hip/templates/gpufort_arrays.template.h @@ -17,6 +17,9 @@ exit(error); \ } \ } +# endif +#ifndef __HIP_DEVICE_COMPILE__ +# include #endif namespace gpufort { {% for rank in range(1,max_rank+1) %} @@ -33,7 +36,7 @@ namespace gpufort { size_t num_elements = 0; //> Number of represented by this array. int index_offset = -1; //> Offset for index calculation; scalar product of negative lower bounds and strides. {% for d in range(1,rank_ub) %} - int stride{{d}} = -1; //> Strides for linearizing {{rank}}-dimensional index. + int stride{{d}} = -1; //> Stride {{d}} for linearizing {{rank}}-dimensional index. {% endfor %} /** @@ -53,10 +56,11 @@ namespace gpufort { this->data_host = data_host; this->data_dev = data_dev; // column-major access - this->num_elements = {{ gm.separated_list_single_line("n","*",rank) }}; -{% for d in range(1,rank_ub) %} - this->stride{{d}} = 1{%- for e in range(1,d) -%}*n{{e}}{%- endfor %}; + this->stride1 = 1; +{% for d in range(2,rank_ub) %} + this->stride{{d}} = this->stride{{d-1}}*n{{d-1}}; {% endfor %} + this->num_elements = this->stride{{rank}}*n{{rank}}; this->index_offset = {% for d in range(1,rank_ub) %} -lb{{d}}*this->stride{{d}}{{";" if loop.last}} @@ -73,9 +77,8 @@ namespace gpufort { ) { return this->index_offset {% for d in range(1,rank_ub) %} - + i{{d}}*this->stride{{d}} + + i{{d}}*this->stride{{d}}{{";" if loop.last}} {% endfor %} - ; } /** @@ -91,9 +94,72 @@ namespace gpufort { #ifdef __HIP_DEVICE_COMPILE__ return this->data_dev[index]; #else +{% for r in range(1,rank_ub) %} + assert(i{{r}} >= lbound({{r}})); + assert(i{{r}} <= ubound({{r}})); +{% endfor %} return this->data_host[index]; #endif } + + /** + * \return Size of the array in dimension 'dim'. + * \param[in] dim selected dimension: 1,...,{{rank}} + */ + __host__ __device__ __forceinline__ int size(int dim) { + #ifndef __HIP_DEVICE_COMPILE__ + assert(dim >= 1); + assert(dim <= {{rank}}); + #endif + switch(dim) { + case {{rank}}: + return this->num_elements / this->stride{{rank}}; +{% for r in range(rank-1,0,-1) %} + case {{r}}: + return this->stride{{r+1}} / this->stride{{r}}; +{% endfor %} + default: + #ifndef __HIP_DEVICE_COMPILE__ + std::cerr << "‘dim’ argument of ‘gpufort::array{{rank}}::size’ is not a valid dimension index ('dim': "<= 1); + assert(dim <= {{rank}}); + #endif + int offset_remainder = this->index_offset; +{% for r in range(rank,0,-1) %} + {{"int " if r == rank}}lb = -offset_remainder / this->stride{{r}}; +{% if r == 1 %} + #ifndef __HIP_DEVICE_COMPILE__ + offset_remainder = offset_remainder + lb*this->stride{{r}}; + assert(offset_remainder == 0); + #endif + return lb; +{% else %} + if ( dim == {{r}} ) return lb; + offset_remainder = offset_remainder + lb*this->stride{{r}}; +{% endif %} +{% endfor %} + } + + /** + * \return Upper bound (inclusive) of the array in dimension 'dim'. + * \param[in] dim selected dimension: 1,...,{{rank}} + */ + __host__ __device__ __forceinline__ int ubound(int dim) { + return this->lbound(dim) + this->size(dim) - 1; + } }; template @@ -291,6 +357,30 @@ namespace gpufort { {{ gm.separated_list_single_line("i",",",rank) | indent(8,"True") }} ); } + + /** + * \return Size of the array in dimension 'dim'. + * \param[in] dim selected dimension: 1,...,{{rank}} + */ + __host__ __device__ __forceinline__ int size(int dim) { + return this->data.size(dim); + } + + /** + * \return Lower bound (inclusive) of the array in dimension 'dim'. + * \param[in] dim selected dimension: 1,...,{{rank}} + */ + __host__ __device__ __forceinline__ int lbound(int dim) { + return this->data.lbound(dim); + } + + /** + * \return Upper bound (inclusive) of the array in dimension 'dim'. + * \param[in] dim selected dimension: 1,...,{{rank}} + */ + __host__ __device__ __forceinline__ int ubound(int dim) { + return this->data.ubound(dim); + } }; {{ "" if not loop.last }} {% endfor -%} From 82b774abbf64f4f8e24ef744dec20c0cb5f4435b Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Fri, 12 Nov 2021 18:15:18 -0500 Subject: [PATCH 41/67] gpufort-arrays/vector-add: Simplify; all args -> references on C++ side * Make all HIP C++ kernel launcher arguments references via "&" * Remove the iso_c_binding interface in the Fortran file Have to investigate why and for which compilers this is working ... --- .../vector-add/main-kernels.hip.cpp | 16 ++++++++-------- .../gpufort-arrays/vector-add/vector-add.f90 | 14 -------------- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/examples/gpufort-arrays/vector-add/main-kernels.hip.cpp b/examples/gpufort-arrays/vector-add/main-kernels.hip.cpp index d870ed43..6055e437 100644 --- a/examples/gpufort-arrays/vector-add/main-kernels.hip.cpp +++ b/examples/gpufort-arrays/vector-add/main-kernels.hip.cpp @@ -29,21 +29,21 @@ __global__ void vecadd_kernel( } } -extern "C" void launch_vecadd_kernel_auto( - const int sharedmem, - hipStream_t stream, - gpufort::array1* y_d, - float a, - gpufort::array1* x_d +extern "C" void launch_vecadd_kernel_auto_( + const int& sharedmem, + hipStream_t& stream, + gpufort::array1& y_d, + float& a, + gpufort::array1& x_d ) { const int vecadd_kernel_blockX = 128; dim3 block(vecadd_kernel_blockX); - const int vecadd_kernel_NX = (1 + (((*y_d).size(1)) - (1))); + const int vecadd_kernel_NX = (1 + ((y_d.size(1)) - (1))); const int vecadd_kernel_gridX = divideAndRoundUp( vecadd_kernel_NX, vecadd_kernel_blockX ); dim3 grid(vecadd_kernel_gridX); // launch kernel - hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, (*y_d), a, (*x_d)); + hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, y_d, a, x_d); } // END vecadd_kernel #endif // __KERNELS_HIP_CPP__ diff --git a/examples/gpufort-arrays/vector-add/vector-add.f90 b/examples/gpufort-arrays/vector-add/vector-add.f90 index 21db0335..0b4d8fc1 100644 --- a/examples/gpufort-arrays/vector-add/vector-add.f90 +++ b/examples/gpufort-arrays/vector-add/vector-add.f90 @@ -9,20 +9,6 @@ program main type(dim3) :: grid, tBlock type(c_ptr) :: stream = c_null_ptr ! - interface - subroutine launch_vecadd_kernel_auto(& - sharedmem,stream,y_d,a,x_d) & - bind(c,name="launch_vecadd_kernel_auto") - use iso_c_binding - use gpufort_arrays - implicit none - integer,value :: sharedmem - type(c_ptr),value :: stream - type(gpufort_array1) :: x_d, y_d - real,value :: a - end subroutine - end interface - ! tBlock = dim3(256,1,1) grid = dim3(ceiling(real(N)/tBlock%x),1,1) From 1b228de90f19b1f9734be54065cb5ee1a838acac Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 15 Nov 2021 11:54:21 -0500 Subject: [PATCH 42/67] gpufort_arrays: Multiple new allocation and synchronization modes AllocMode: WrapHostWrapDevice = 0, //> Wrap host and device pointers. WrapHostAllocDevice = 1, //> Wrap host pointer and allocate a new device array. AllocHostWrapDevice = 2, //> Allocate new host array and wrap device pointer. AllocHostAllocDevice = 3, //> Allocate new host and device arrays. AllocPinnedHostWrapDevice = 4, //> Allocate new pinned host array and wrap device pointer. AllocPinnedHostAllocDevice = 5 //> Allocate new pinned host array and wrap device pointer. SyncMode: None = 0, //> Simply create (or wrap) the device data. Copy = 1, //> Copy to device after initialization and back to host before destruction. Copyin = 2, //> Copy to device after initialization. Copyout = 3, //> Copy from device to host before destruction. InvertedCopy = 4, //> 'Copy' in opposite direction: Copy from device to host after initialization and back to device before destruction. InvertedCopyin = 5, //> 'Copyin' in opposite direction: Copy from device to host after initialization. InvertedCopyout = 6 //> 'Copyout'in opposite direction: Copy from host to device before destruction. --- .../vector-add/Makefile | 4 +- .../vector-add/main-kernels.hip.cpp | 0 .../vector-add/vector-add.f90 | 0 .../templates/gpufort_arrays.macros.f03 | 87 ++++--- .../templates/gpufort_arrays.macros.h | 7 +- .../templates/gpufort_arrays.template.f03 | 46 +++- .../templates/gpufort_arrays.template.h | 228 ++++++++++++++---- test/gpufort_arrays/Makefile | 4 +- .../test_gpufort_arrays.hip.cpp | 9 +- .../test_gpufort_arrays_interop.f03 | 8 +- 10 files changed, 292 insertions(+), 101 deletions(-) rename examples/{gpufort-arrays => gpufort_arrays}/vector-add/Makefile (59%) rename examples/{gpufort-arrays => gpufort_arrays}/vector-add/main-kernels.hip.cpp (100%) rename examples/{gpufort-arrays => gpufort_arrays}/vector-add/vector-add.f90 (100%) diff --git a/examples/gpufort-arrays/vector-add/Makefile b/examples/gpufort_arrays/vector-add/Makefile similarity index 59% rename from examples/gpufort-arrays/vector-add/Makefile rename to examples/gpufort_arrays/vector-add/Makefile index cebc89be..2045fdad 100644 --- a/examples/gpufort-arrays/vector-add/Makefile +++ b/examples/gpufort_arrays/vector-add/Makefile @@ -1,5 +1,7 @@ +CFLAGS = -g -ggdb + vector-add: - hipcc -c $(shell gpufort --cpp_config) main-kernels.hip.cpp -o main-kernels.hip.o + hipcc $(shell gpufort --cpp_config) $(CFLAGS) -c main-kernels.hip.cpp -o main-kernels.hip.o hipfc $(shell gpufort --gfortran_config) main-kernels.hip.o vector-add.f90 -o vector-add $(shell gpufort --ldflags) clean: diff --git a/examples/gpufort-arrays/vector-add/main-kernels.hip.cpp b/examples/gpufort_arrays/vector-add/main-kernels.hip.cpp similarity index 100% rename from examples/gpufort-arrays/vector-add/main-kernels.hip.cpp rename to examples/gpufort_arrays/vector-add/main-kernels.hip.cpp diff --git a/examples/gpufort-arrays/vector-add/vector-add.f90 b/examples/gpufort_arrays/vector-add/vector-add.f90 similarity index 100% rename from examples/gpufort-arrays/vector-add/vector-add.f90 rename to examples/gpufort_arrays/vector-add/vector-add.f90 diff --git a/python/fort2hip/templates/gpufort_arrays.macros.f03 b/python/fort2hip/templates/gpufort_arrays.macros.f03 index 10810285..b794811b 100644 --- a/python/fort2hip/templates/gpufort_arrays.macros.f03 +++ b/python/fort2hip/templates/gpufort_arrays.macros.f03 @@ -93,63 +93,81 @@ mapped_array,& bytes_per_element,& sizes,lbounds,& - pinned, copyout_at_destruction) result(ierr) + alloc_mode,sync_mode,stream) result(ierr) use iso_c_binding use hipfort_enums implicit none type({{f_array}}),intent(inout) :: mapped_array - integer(c_int),intent(in),value :: bytes_per_element integer(c_int){{size_dims}},intent(in) :: sizes integer(c_int){{size_dims}},intent(in),optional :: lbounds - logical(c_bool),intent(in),optional :: pinned, copyout_at_destruction - integer(kind(hipSuccess)) :: ierr + integer(c_int),intent(in) :: bytes_per_element + integer(kind(gpufort_array_wrap_host_wrap_device)),intent(in),optional :: alloc_mode + integer(kind(gpufort_array_sync_none)),intent(in),optional :: sync_mode + type(c_ptr),intent(in),optional :: stream ! - integer(c_int),dimension({{rank}}) :: opt_lbounds - logical(c_bool) :: opt_pinned, opt_copyout_at_destruction + integer(kind(hipSuccess)) :: ierr ! - opt_lbounds = 1 - opt_copyout_at_destruction = .false. - if ( present(lbounds) ) opt_lbounds = lbounds - if ( present(copyout_at_destruction) ) opt_copyout_at_destruction = copyout_at_destruction + integer(c_int),dimension({{rank}}) :: opt_lbounds + integer(kind(gpufort_array_wrap_host_wrap_device)) :: opt_alloc_mode + integer(kind(gpufort_array_sync_none)) :: opt_sync_mode + type(c_ptr) :: opt_stream + ! + opt_lbounds = 1 + opt_alloc_mode = gpufort_array_alloc_host_alloc_device ! allocate both by default + opt_sync_mode = gpufort_array_sync_none + opt_stream = c_null_ptr + if ( present(lbounds) ) opt_lbounds = lbounds + if ( present(alloc_mode) ) opt_alloc_mode = alloc_mode + if ( present(sync_mode) ) opt_sync_mode = sync_mode + if ( present(stream) ) opt_stream = stream ierr = {{binding}}(& mapped_array,& bytes_per_element,& c_null_ptr,c_null_ptr, & sizes, opt_lbounds,& - opt_pinned, opt_copyout_at_destruction) + opt_alloc_mode, opt_sync_mode, opt_stream) end function {% for tuple in datatypes %} function {{binding}}_{{tuple.f_kind}}(& mapped_array,& data_host,lbounds,& data_dev,& - pinned,copyout_at_destruction) result(ierr) + alloc_mode,sync_mode,stream) result(ierr) use iso_c_binding use hipfort_enums implicit none type({{f_array}}),intent(inout) :: mapped_array {{tuple.f_type}},intent(in),target,dimension(:{% for i in range(1,rank) %},:{% endfor %}) :: data_host integer(c_int){{size_dims}},intent(in),optional :: lbounds - type(c_ptr),intent(in),optional :: data_dev - logical(c_bool),intent(in),optional :: pinned, copyout_at_destruction - integer(kind(hipSuccess)) :: ierr + type(c_ptr),intent(in),optional :: data_dev + integer(kind(gpufort_array_wrap_host_wrap_device)),intent(in),optional :: alloc_mode + integer(kind(gpufort_array_sync_none)),intent(in),optional :: sync_mode + type(c_ptr),intent(in),optional :: stream + ! + integer(kind(hipSuccess)) :: ierr ! - integer(c_int),dimension({{rank}}) :: opt_lbounds - type(c_ptr) :: opt_data_dev - logical(c_bool) :: opt_pinned, opt_copyout_at_destruction + integer(c_int),dimension({{rank}}) :: opt_lbounds + type(c_ptr) :: opt_data_dev + integer(kind(gpufort_array_wrap_host_wrap_device)) :: opt_alloc_mode + integer(kind(gpufort_array_sync_none)) :: opt_sync_mode + type(c_ptr) :: opt_stream ! - opt_lbounds = 1 - opt_data_dev = c_null_ptr - opt_copyout_at_destruction = .false. - if ( present(lbounds) ) opt_lbounds = lbounds - if ( present(data_dev) ) opt_data_dev = data_dev - if ( present(copyout_at_destruction) ) opt_copyout_at_destruction = copyout_at_destruction + opt_lbounds = 1 + opt_data_dev = c_null_ptr + opt_alloc_mode = gpufort_array_wrap_host_alloc_device + opt_sync_mode = gpufort_array_sync_none + opt_stream = c_null_ptr + if ( present(lbounds) ) opt_lbounds = lbounds + if ( present(data_dev) ) opt_data_dev = data_dev + if ( present(alloc_mode) ) opt_alloc_mode = alloc_mode + if ( present(sync_mode) ) opt_sync_mode = sync_mode + if ( present(stream) ) opt_stream = stream ierr = {{binding}}(& mapped_array,& int({{tuple.bytes}}, c_int),& c_loc(data_host),opt_data_dev,& shape(data_host), opt_lbounds,& - opt_pinned, opt_copyout_at_destruction) + opt_alloc_mode, opt_sync_mode, opt_stream) end function {% endfor %} {% endfor %} @@ -172,19 +190,24 @@ bytes_per_element,& data_host,data_dev,& sizes, lbounds,& - pinned, copyout_at_destruction) & + alloc_mode,sync_mode,stream) & bind(c,name="{{binding}}") & result(ierr) use iso_c_binding use hipfort_enums import {{f_array}} + import gpufort_array_wrap_host_wrap_device + import gpufort_array_sync_none implicit none - type({{f_array}}),intent(inout) :: mapped_array - integer(c_int),intent(in),value :: bytes_per_element - type(c_ptr),intent(in),value :: data_host, data_dev - integer(c_int){{size_dims}},intent(in) :: sizes, lbounds - logical(c_bool),intent(in),value :: pinned, copyout_at_destruction - integer(kind(hipSuccess)) :: ierr + type({{f_array}}),intent(inout) :: mapped_array + integer(c_int),intent(in),value :: bytes_per_element + type(c_ptr),intent(in),value :: data_host, data_dev + integer(c_int){{size_dims}},intent(in) :: sizes, lbounds + integer(kind(gpufort_array_wrap_host_wrap_device)),intent(in),value :: alloc_mode + integer(kind(gpufort_array_sync_none)),intent(in),value :: sync_mode + type(c_ptr),intent(in),value :: stream + ! + integer(kind(hipSuccess)) :: ierr end function {% endfor %} module procedure :: & diff --git a/python/fort2hip/templates/gpufort_arrays.macros.h b/python/fort2hip/templates/gpufort_arrays.macros.h index 45b5cb8c..f65b88bd 100644 --- a/python/fort2hip/templates/gpufort_arrays.macros.h +++ b/python/fort2hip/templates/gpufort_arrays.macros.h @@ -15,14 +15,15 @@ extern "C" { {{c_type}}* data_dev, int* sizes, int* lower_bounds, - bool pinned, - bool copyout_at_destruction + gpufort::AllocMode alloc_mode, + gpufort::SyncMode sync_mode, + hipStream_t stream ) { return array->init( bytes_per_element, data_host, data_dev, sizes, lower_bounds, - pinned, copyout_at_destruction + alloc_mode, sync_mode, stream ); } diff --git a/python/fort2hip/templates/gpufort_arrays.template.f03 b/python/fort2hip/templates/gpufort_arrays.template.f03 index c28ffbc0..abc7034d 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.f03 +++ b/python/fort2hip/templates/gpufort_arrays.template.f03 @@ -3,30 +3,50 @@ {% import "templates/gpufort_arrays.macros.f03" as gam %} module gpufort_arrays use iso_c_binding + implicit none + + enum, bind(c) + enumerator :: gpufort_array_sync_none = 0 !> Simply create (or wrap) the device data. + enumerator :: gpufort_array_sync_copy = 1 !> Copy to device after initialization and back to host before destruction. + enumerator :: gpufort_array_sync_copyin = 2 !> Copy to device after initialization. + enumerator :: gpufort_array_sync_copyout = 3 !> Copy back to host before destruction. + enumerator :: gpufort_array_sync_inverted_copy = 4 !> 'Copy' in opposite direction: Copy from device to host after initialization and back to device before destruction. + enumerator :: gpufort_array_sync_inverted_copyin = 5 !> 'Copyin' in opposite direction: Copy from device to host after initialization. + enumerator :: gpufort_array_sync_inverted_copyout = 6 !> 'Copyout'in opposite direction: Copy from host to device before destruction. + end enum + + enum, bind(c) + enumerator :: gpufort_array_wrap_host_wrap_device = 0 !> Wrap host and device pointers. + enumerator :: gpufort_array_wrap_host_alloc_device = 1 !> Wrap host pointer and allocate a new device array. + enumerator :: gpufort_array_alloc_host_wrap_device = 2 !> Allocate new host array and wrap device pointer. + enumerator :: gpufort_array_alloc_host_alloc_device = 3 !> Allocate new host and device arrays. + enumerator :: gpufort_array_alloc_pinned_host_wrap_device = 4 !> Allocate new pinned host array and wrap device pointer. + enumerator :: gpufort_array_alloc_pinned_host_alloc_device = 5 !> Allocate new pinned host array and wrap device pointer. + end enum + ! NOTE: the below types must have exactly the ! same data layout as the corresponding ! gpufort C/C++ structs. - {% for rank in range(1,max_rank+1) %} {% set rank_ub = rank+1 %} ! {{rank}}-dimensional array type, bind(c) :: gpufort_array_descr{{rank}} - type(c_ptr) :: data_host = c_null_ptr; - type(c_ptr) :: data_dev = c_null_ptr; - integer(c_size_t) :: num_elements = 0; !> Number of represented by this array. - integer(c_int) :: index_offset = -1; !> Offset for index calculation; scalar product of negative lower bounds and strides. + type(c_ptr) :: data_host = c_null_ptr + type(c_ptr) :: data_dev = c_null_ptr + integer(c_size_t) :: num_elements = 0 !> Number of represented by this array. + integer(c_int) :: index_offset = -1 !> Offset for index calculation; scalar product of negative lower bounds and strides. {% for d in range(1,rank_ub) %} - integer(c_int) :: stride{{d}} = -1; !> Stride for dimension {{d}} + integer(c_int) :: stride{{d}} = -1 !> Stride for dimension {{d}} {% endfor %} end type type, bind(c) :: gpufort_array{{rank}} - type(gpufort_array_descr{{rank}}) :: data - logical(c_bool) :: pinned = .false.; !> If the host data is pinned. - logical(c_bool) :: copyout_at_destruction = .false.; !> If the device data should be copied back to the host when this struct is destroyed. - logical(c_bool) :: owns_host_data = .false.; !> If this is only a wrapper, i.e. no memory management is performed. - logical(c_bool) :: owns_device_data = .false.; !> If this is only a wrapper, i.e. no memory management is performed. - integer(c_int) :: num_refs = 0; !> Number of references. - integer(c_int) :: bytes_per_element = -1; !> Bytes per data element. + type(gpufort_array_descr{{rank}}) :: data + integer(kind(gpufort_array_wrap_host_wrap_device)) :: alloc_mode = gpufort_array_wrap_host_alloc_device !> Data allocation strategy. Default: + !> wrap the host and allocate device data + integer(kind(gpufort_array_sync_none)) :: sync_mode = gpufort_array_sync_none !> How data should be synchronized + !> during the initialization and destruction of this GPUFORT array. + integer(c_int) :: num_refs = 0 !> Number of references. + integer(c_int) :: bytes_per_element = -1 !> Bytes per data element. end type{{"\n" if not loop.last}} {% endfor %} diff --git a/python/fort2hip/templates/gpufort_arrays.template.h b/python/fort2hip/templates/gpufort_arrays.template.h index c10016c0..3dac4bcb 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.h +++ b/python/fort2hip/templates/gpufort_arrays.template.h @@ -22,6 +22,25 @@ # include #endif namespace gpufort { + enum class SyncMode { + None = 0, //> Simply create (or wrap) the device data. + Copy = 1, //> Copy to device after initialization and back to host before destruction. + Copyin = 2, //> Copy to device after initialization. + Copyout = 3, //> Copy from device to host before destruction. + InvertedCopy = 4, //> 'Copy' in opposite direction: Copy from device to host after initialization and back to device before destruction. + InvertedCopyin = 5, //> 'Copyin' in opposite direction: Copy from device to host after initialization. + InvertedCopyout = 6 //> 'Copyout'in opposite direction: Copy from host to device before destruction. + }; + + enum class AllocMode { + WrapHostWrapDevice = 0, //> Wrap host and device pointers. + WrapHostAllocDevice = 1, //> Wrap host pointer and allocate a new device array. + AllocHostWrapDevice = 2, //> Allocate new host array and wrap device pointer. + AllocHostAllocDevice = 3, //> Allocate new host and device arrays. + AllocPinnedHostWrapDevice = 4, //> Allocate new pinned host array and wrap device pointer. + AllocPinnedHostAllocDevice = 5 //> Allocate new pinned host array and wrap device pointer. + }; + {% for rank in range(1,max_rank+1) %} {% set rank_ub = rank+1 %} /** @@ -164,13 +183,13 @@ namespace gpufort { template struct array{{rank}}{ - array_descr{{rank}} data; - bool pinned = false; //> If the host data is pinned. - bool copyout_at_destruction = false; //> If the device data should be copied back to the host when this struct is destroyed. - bool owns_host_data = false; //> If this is only a wrapper, i.e. no memory management is performed. - bool owns_device_data = false; //> If this is only a wrapper, i.e. no memory management is performed. - int num_refs = 0; //> Number of references. - int bytes_per_element = -1; //> Bytes per element; stored to make num_data_bytes routine independent of T + array_descr{{rank}} data; + AllocMode alloc_mode = AllocMode::WrapHostAllocDevice; //> Data allocation strategy. Default: + //> wrap the host and allocate device data + SyncMode sync_mode = SyncMode::None; //> How data should be synchronized + //> during the initialization and destruction of this GPUFORT array. + int num_refs = 0; //> Number of references. + int bytes_per_element = -1; //> Bytes per element; stored to make num_data_bytes routine independent of T array{{rank}}() { // do nothing @@ -196,28 +215,86 @@ namespace gpufort { T* data_host, T* data_dev, {{ gm.bound_args_single_line("int ",rank) | indent(8,True) }}, - bool pinned, - bool copyout_at_destruction = false) { - hipError_t ierr = hipSuccess; + AllocMode alloc_mode = AllocMode::WrapHostAllocDevice, + SyncMode sync_mode = SyncMode::None, + hipStream_t stream = nullptr) { this->data.wrap( data_host, data_dev, {{ gm.bound_args_single_line("",rank) | indent(10,True) }} ); - this->bytes_per_element = bytes_per_element; - this->pinned = pinned; - this->copyout_at_destruction = copyout_at_destruction; - this->owns_host_data = data_host == nullptr; - this->owns_device_data = data_dev == nullptr; - this->num_refs = 1; - if ( this->owns_host_data && pinned ) { - ierr = hipHostMalloc((void**) &this->data.data_host,this->num_data_bytes(),0); - } else if ( this->owns_host_data ) { - this->data.data_host = (T*) malloc(this->num_data_bytes()); + this->bytes_per_element = bytes_per_element; + this->num_refs = 1; + this->alloc_mode = alloc_mode; + this->sync_mode = sync_mode; + + // host array allocation + hipError_t ierr = hipSuccess; + switch (this->alloc_mode) { +#ifdef GPUFORT_ARRAYS_ALWAYS_PIN_HOST_DATA + case AllocMode::AllocHostWrapDevice: + case AllocMode::AllocHostAllocDevice: +#endif + case AllocMode::AllocPinnedHostWrapDevice: + case AllocMode::AllocPinnedHostAllocDevice: + ierr = hipHostMalloc((void**) &this->data.data_host,this->num_data_bytes(),0); + break; +#ifndef GPUFORT_ARRAYS_ALWAYS_PIN_HOST_DATA + case AllocMode::AllocHostWrapDevice: + case AllocMode::AllocHostAllocDevice: + this->data.data_host = (T*) malloc(this->num_data_bytes()); + break; +#endif + case AllocMode::WrapHostWrapDevice: + case AllocMode::WrapHostAllocDevice: + // do nothing as already set by data.wrap call + break; + default: + std::cerr << "ERROR: gpufort::Array{{rank}}::init(...): Unexpected value for 'this->alloc_mode': " + << static_cast(this->alloc_mode) << std::endl; + std::terminate(); + break; + } + // device array allocation + if ( ierr == hipSuccess ) { + switch (this->alloc_mode) { + case AllocMode::AllocHostWrapDevice: + case AllocMode::AllocPinnedHostWrapDevice: + case AllocMode::WrapHostWrapDevice: + // do nothing as already set by data.wrap call + break; + case AllocMode::WrapHostAllocDevice: + case AllocMode::AllocHostAllocDevice: + case AllocMode::AllocPinnedHostAllocDevice: + ierr = hipMalloc((void**) &this->data.data_dev, this->num_data_bytes()); + break; + default: + break; + } + } + if ( ierr == hipSuccess ) { + // synchronize host/device + switch (this->sync_mode) { + case SyncMode::None: + case SyncMode::Copyout: + case SyncMode::InvertedCopyout: + // do nothing + break; + case SyncMode::Copy: + case SyncMode::Copyin: + ierr = this->copy_to_device(stream); + break; + case SyncMode::InvertedCopy: + case SyncMode::InvertedCopyin: + ierr = this->copy_to_host(stream); + break; + default: + std::cerr << "ERROR: gpufort::Array{{rank}}::destroy(...): Unexpected value for 'sync_mode': " + << static_cast(sync_mode) << std::endl; + std::terminate(); + break; + } } - if ( ierr == hipSuccess && this->owns_device_data ) { - ierr = hipMalloc((void**) &this->data.data_dev, this->num_data_bytes()); - } return ierr; } @@ -227,16 +304,16 @@ namespace gpufort { T* data_dev, int* sizes, int* lower_bounds, - bool pinned, - bool copyout_at_destruction = false) { - return this->init( - bytes_per_element, - data_host, - data_dev, - sizes[0],{% for d in range(1,rank) %}sizes[{{d}}],{% endfor %}{{""}} - lower_bounds[0],{% for d in range(1,rank) %}lower_bounds[{{d}}],{% endfor %}{{""}} - pinned, - copyout_at_destruction); + AllocMode alloc_mode = AllocMode::WrapHostAllocDevice, + SyncMode sync_mode = SyncMode::None, + hipStream_t stream = nullptr) { + return this->init( + bytes_per_element, + data_host, + data_dev, + sizes[0],{% for d in range(1,rank) %}sizes[{{d}}],{% endfor %}{{""}} + lower_bounds[0],{% for d in range(1,rank) %}lower_bounds[{{d}}],{% endfor %}{{""}} + alloc_mode,sync_mode,stream); } /** @@ -248,22 +325,77 @@ namespace gpufort { */ __host__ hipError_t destroy(hipStream_t stream) { hipError_t ierr = hipSuccess; - if ( this->bytes_per_element > 0 ) { - if ( this->owns_host_data && this->data.data_host != nullptr ) { - if ( this->pinned ) { - ierr = hipHostFree(this->data.data_host); - } else { - free(this->data.data_host); + if ( bytes_per_element > 0 ) { + // synchronize host/device + switch (this->sync_mode) { + case SyncMode::Copy: + case SyncMode::Copyout: + ierr = this->copy_to_host(stream); + break; + case SyncMode::InvertedCopy: + case SyncMode::InvertedCopyout: + ierr = this->copy_to_device(stream); + break; + case SyncMode::None: + case SyncMode::Copyin: + case SyncMode::InvertedCopyin: + // do nothing + break; + default: + std::cerr << "ERROR: gpufort::Array{{rank}}::destroy(...): Unexpected value for 'sync_mode': " + << static_cast(sync_mode) << std::endl; + std::terminate(); + break; + } + // host array allocation + if ( ierr == hipSuccess ) { + switch (this->alloc_mode) { +#ifdef GPUFORT_ARRAYS_ALWAYS_PIN_HOST_DATA + case AllocMode::AllocHostWrapDevice: + case AllocMode::AllocHostAllocDevice: +#endif + case AllocMode::AllocPinnedHostWrapDevice: + case AllocMode::AllocPinnedHostAllocDevice: + ierr = hipHostFree(this->data.data_host); + break; +#ifndef GPUFORT_ARRAYS_ALWAYS_PIN_HOST_DATA + case AllocMode::AllocHostWrapDevice: + case AllocMode::AllocHostAllocDevice: + free(this->data.data_host); + break; +#endif + case AllocMode::WrapHostWrapDevice: + case AllocMode::WrapHostAllocDevice: + break; + default: + std::cerr << "ERROR: gpufort::Array{{rank}}::destroy(...): Unexpected value for 'alloc_mode': " + << static_cast(alloc_mode) << std::endl; + std::terminate(); + break; } } + // device array allocation if ( ierr == hipSuccess ) { - if ( this->owns_device_data && this->data.data_dev != nullptr ) { - if ( this->copyout_at_destruction ) { - this->copy_to_host(stream); - } - ierr = hipFree(this->data.data_dev); + switch (this->alloc_mode) { + case AllocMode::AllocHostWrapDevice: + case AllocMode::AllocPinnedHostWrapDevice: + case AllocMode::WrapHostWrapDevice: + // do nothing as already set by data.wrap call + break; + case AllocMode::WrapHostAllocDevice: + case AllocMode::AllocHostAllocDevice: + case AllocMode::AllocPinnedHostAllocDevice: + ierr = hipFree(this->data.data_dev); + break; + default: + break; } } + if ( ierr == hipSuccess ) { + this->data.data_host = nullptr; + this->data.data_dev = nullptr; + this->bytes_per_element = -1; + } } return ierr; } @@ -277,6 +409,10 @@ namespace gpufort { * \return Array code returned by the underlying hipMemcpy operation. */ __host__ hipError_t copy_to_host(hipStream_t stream = nullptr) { + #ifndef __HIP_DEVICE_COMPILE__ + assert(this->data.data_host!=nullptr); + assert(this->data.data_dev!=nullptr); + #endif return hipMemcpyAsync( (void*) this->data.data_host, (void*) this->data.data_dev, @@ -289,6 +425,10 @@ namespace gpufort { * \return Array code returned by the underlying hipMemcpy operation. */ __host__ hipError_t copy_to_device(hipStream_t stream = nullptr) { + #ifndef __HIP_DEVICE_COMPILE__ + assert(this->data.data_host!=nullptr); + assert(this->data.data_dev!=nullptr); + #endif return hipMemcpyAsync( (void*) this->data.data_dev, (void*) this->data.data_host, diff --git a/test/gpufort_arrays/Makefile b/test/gpufort_arrays/Makefile index 33d7fab3..f2b422ef 100644 --- a/test/gpufort_arrays/Makefile +++ b/test/gpufort_arrays/Makefile @@ -5,8 +5,8 @@ FORT_TEST_SRC = test_gpufort_arrays_interop.f03 FORT_TEST_APP = $(FORT_TEST_SRC:.f03=.x) FORT_TEST_DEPS = test_gpufort_arrays_kernels.hip.o -HIPCC_CFLAGS ?= $(shell gpufort --cpp_config) -FC_CFLAGS ?= $(shell gpufort --gfortran_config) +HIPCC_CFLAGS ?= $(shell gpufort --cpp_config) -g -ggdb +FC_CFLAGS ?= $(shell gpufort --gfortran_config) -g -ggdb LDFLAGS ?= $(shell gpufort --ldflags) diff --git a/test/gpufort_arrays/test_gpufort_arrays.hip.cpp b/test/gpufort_arrays/test_gpufort_arrays.hip.cpp index 6b833385..e8f945a6 100644 --- a/test/gpufort_arrays/test_gpufort_arrays.hip.cpp +++ b/test/gpufort_arrays/test_gpufort_arrays.hip.cpp @@ -10,9 +10,12 @@ void test1() { gpufort::array2 int_array2; gpufort::array3 int_array3; - HIP_CHECK(int_array1.init(sizeof(int),nullptr,nullptr, 10, -1, true)); // hostptr,devptr, count, lower bound, pinned - HIP_CHECK(int_array2.init(sizeof(int),nullptr,nullptr, 10,10, -1,-2, true)); - HIP_CHECK(int_array3.init(sizeof(int),nullptr,nullptr, 10,10,10, -1,-2,-3, true)); + HIP_CHECK(int_array1.init(sizeof(int),nullptr,nullptr, 10, -1, + gpufort::AllocMode::AllocPinnedHostAllocDevice)); // hostptr,devptr, count, lower bound, alloc_mode + HIP_CHECK(int_array2.init(sizeof(int),nullptr,nullptr, 10,10, -1,-2, + gpufort::AllocMode::AllocHostAllocDevice)); + HIP_CHECK(int_array3.init(sizeof(int),nullptr,nullptr, 10,10,10, -1,-2,-3, + gpufort::AllocMode::AllocPinnedHostAllocDevice)); assert( 10==int_array1.data.num_elements); assert( 100==int_array2.data.num_elements); diff --git a/test/gpufort_arrays/test_gpufort_arrays_interop.f03 b/test/gpufort_arrays/test_gpufort_arrays_interop.f03 index fce45cfc..b5c57469 100644 --- a/test/gpufort_arrays/test_gpufort_arrays_interop.f03 +++ b/test/gpufort_arrays/test_gpufort_arrays_interop.f03 @@ -35,11 +35,12 @@ subroutine test_array_initialization() ! bytes_per_element,& ! data_host,data_dev,& ! sizes, lbounds,& - ! pinned, copyout_at_destruction) & + ! alloc_mode,sync_mode,stream) & call hipCheck(gpufort_array_init(marr3,& c_float,c_loc(host_array_3),c_null_ptr,& shape(host_array_3),lbound(host_array_3),& - .false._c_bool,.false._c_bool)) + gpufort_array_wrap_host_alloc_device,& + gpufort_array_sync_none,c_null_ptr)) call assert(marr3%data%stride1==1) call assert(marr3%data%stride2==10) @@ -60,7 +61,8 @@ subroutine test_array_initialization() ! allocate device AND (pinned) host array call hipCheck(gpufort_array_init(marr5,& - c_int,[4,4,4,4,4],lbounds=[-1,-1,-1,-1,-1],pinned=.true._c_bool)) + c_int,[4,4,4,4,4],lbounds=[-1,-1,-1,-1,-1],& + alloc_mode=gpufort_array_alloc_pinned_host_alloc_device)) call assert(marr5%data%stride1==1) call assert(marr5%data%stride2==4) call assert(marr5%data%stride3==16) From a7d8f40fa6617728f4928ca68f2920c4d3d079d3 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 15 Nov 2021 14:13:45 -0500 Subject: [PATCH 43/67] gpufort_arrays/vector-add-non-interoperable-types: Add example Example showcases how we could with non-interoperable array members of derived types that have the pointer or allocatable qualifier. --- .../Makefile | 8 ++ .../main-kernels.hip.cpp | 48 +++++++++++ .../vector-add.f90 | 86 +++++++++++++++++++ src/Makefile | 5 +- 4 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 examples/gpufort_arrays/vector-add-non-interoperable-types/Makefile create mode 100644 examples/gpufort_arrays/vector-add-non-interoperable-types/main-kernels.hip.cpp create mode 100644 examples/gpufort_arrays/vector-add-non-interoperable-types/vector-add.f90 diff --git a/examples/gpufort_arrays/vector-add-non-interoperable-types/Makefile b/examples/gpufort_arrays/vector-add-non-interoperable-types/Makefile new file mode 100644 index 00000000..2045fdad --- /dev/null +++ b/examples/gpufort_arrays/vector-add-non-interoperable-types/Makefile @@ -0,0 +1,8 @@ +CFLAGS = -g -ggdb + +vector-add: + hipcc $(shell gpufort --cpp_config) $(CFLAGS) -c main-kernels.hip.cpp -o main-kernels.hip.o + hipfc $(shell gpufort --gfortran_config) main-kernels.hip.o vector-add.f90 -o vector-add $(shell gpufort --ldflags) + +clean: + rm -f *.mod *.o vector-add diff --git a/examples/gpufort_arrays/vector-add-non-interoperable-types/main-kernels.hip.cpp b/examples/gpufort_arrays/vector-add-non-interoperable-types/main-kernels.hip.cpp new file mode 100644 index 00000000..ca50a34f --- /dev/null +++ b/examples/gpufort_arrays/vector-add-non-interoperable-types/main-kernels.hip.cpp @@ -0,0 +1,48 @@ +// This file was generated by gpufort +#ifndef __KERNELS_HIP_CPP__ +#define __KERNELS_HIP_CPP__ +#include "hip/hip_runtime.h" +#include "hip/hip_complex.h" +#include "gpufort.h" +#include "gpufort_arrays.h" + +struct mesh_t { + float a; + gpufort::array1 x; + gpufort::array1 y; +}; + +// BEGIN main_26_e28c45 +/* + HIP C++ implementation of the function/loop body of: + + !$cuf kernel do(1) <<>> + do i=1,size(y,1) + y(i) = y(i) + a*xi + end do + +*/ + +__global__ void vecadd_kernel(mesh_t mesh) { + int i = 1 + (1)*(threadIdx.x + blockIdx.x * blockDim.x); + if (loop_cond(i,mesh.y.size(1),1)) { + mesh.y(i)= mesh.y(i) + mesh.a*mesh.x(i); + } +} + +extern "C" void launch_vecadd_kernel_auto_( + const int& sharedmem, + hipStream_t& stream, + mesh_t& mesh +) { + const int vecadd_kernel_blockX = 128; + dim3 block(vecadd_kernel_blockX); + const int vecadd_kernel_NX = (1 + ((mesh.y.size(1)) - (1))); + const int vecadd_kernel_gridX = divideAndRoundUp( vecadd_kernel_NX, vecadd_kernel_blockX ); + dim3 grid(vecadd_kernel_gridX); + + // launch kernel + hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, mesh); +} +// END vecadd_kernel +#endif // __KERNELS_HIP_CPP__ diff --git a/examples/gpufort_arrays/vector-add-non-interoperable-types/vector-add.f90 b/examples/gpufort_arrays/vector-add-non-interoperable-types/vector-add.f90 new file mode 100644 index 00000000..5624dcdb --- /dev/null +++ b/examples/gpufort_arrays/vector-add-non-interoperable-types/vector-add.f90 @@ -0,0 +1,86 @@ +module types + use iso_c_binding + use gpufort_arrays + ! original non-interoperable type + type :: mesh_t + real :: a + real,allocatable :: x(:), y(:) + end type + + ! interoperable type; (will be) autogenerated by GPUFORT + type,bind(c) :: mesh_t_interop + real(c_float) :: a + type(gpufort_array1) :: x, y + end type +end module + +program main + use types + use hipfort_check + implicit none + integer, parameter :: N = 40000 + ! + type(mesh_t) :: mesh_orig + type(mesh_t_interop) :: mesh + type(c_ptr) :: stream = c_null_ptr + ! + call create_original_type(mesh_orig,stream) + call copy_to_intermediate_type(mesh_orig,mesh,stream) + + !call hipCheck(gpufort_array_copy_to_device(mesh%x,stream)) + !call hipCheck(gpufort_array_copy_to_device(mesh%y,stream)) + + call launch_vecadd_kernel_auto(0,stream,mesh) + + !call hipCheck(gpufort_array_copy_to_host(mesh%y,stream)) + + call destroy(mesh,stream) + + write(*,*) 'Max error: ', maxval(abs(mesh_orig%y-4.0)) +contains + subroutine create_original_type(mesh_orig,stream) + use types + use hipfort + use hipfort_check + implicit none + type(mesh_t),intent(inout) :: mesh_orig + type(c_ptr),intent(in) :: stream + ! + allocate(mesh_orig%x(N)) + allocate(mesh_orig%y(N)) + mesh_orig%x = 1.0; mesh_orig%y = 2.0; mesh_orig%a = 2.0 + end subroutine + + ! (will be) autogenerated by gpufort + subroutine copy_to_intermediate_type(mesh_orig,mesh,stream) + use types + use hipfort + use hipfort_check + implicit none + type(mesh_t),intent(in) :: mesh_orig + type(mesh_t_interop),intent(inout) :: mesh + type(c_ptr),intent(in) :: stream + ! + call hipCheck(gpufort_array_init(mesh%x,mesh_orig%x,& + alloc_mode=gpufort_array_wrap_host_alloc_device,& + sync_mode=gpufort_array_sync_copyin,& + stream=stream)) + call hipCheck(gpufort_array_init(mesh%y,mesh_orig%y,& + alloc_mode=gpufort_array_wrap_host_alloc_device,& + sync_mode=gpufort_array_sync_copy,& + stream=stream)) + mesh%a = mesh_orig%a + end subroutine + + ! (will be) autogenerated by GPUFORT + subroutine destroy(mesh,stream) + use types + use hipfort + use hipfort_check + type(mesh_t_interop),intent(inout) :: mesh + type(c_ptr),intent(in) :: stream + ! + call hipCheck(gpufort_array_destroy(mesh%x,stream)) + call hipCheck(gpufort_array_destroy(mesh%y,stream)) + end subroutine +end program main diff --git a/src/Makefile b/src/Makefile index 6c4df71c..444b05bc 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,8 +4,9 @@ HIPCC ?= hipcc GPUFORT_INC = -I$(shell gpufort --path)/include -FC_CFLAGS ?= -std=f2008 -ffree-line-length-none -cpp -fmax-errors=5 -HIPCC_CFLAGS ?= -fPIC +FC_CFLAGS ?= -std=f2008 -ffree-line-length-none -cpp -fmax-errors=5 +HIPCC_CFLAGS ?= -fPIC -DGPUFORT_ARRAYS_ALWAYS_PIN_HOST_DATA +#HIPCC_CFLAGS += -g -ggdb SUFFIX ?= $(if $(HIP_PLATFORM),$(HIP_PLATFORM),amd) LIBGPUFORT = libgpufort_$(SUFFIX).a From a2a832df3c021eea375f3665e54ef250898f3692 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 15 Nov 2021 15:55:21 -0500 Subject: [PATCH 44/67] gpufort_acc_runtime: Fix several issues * record%is_subarray now uses `num_bytes_used` instead of `num_bytes` (which is typically scaled by a factor 1.x vs `num_bytes_used`) to check if a host array is subarray of an already mapped array. In a scenario where multiple slices of an array were mapped by the runtime, using `num_bytes` led the runtime to classify one subarray as a subarray of another array with the previous implementation. * Rewrite conditionals such as `if ( present(var) .and. var .eq. ...) as right operand might be evaluated before the left one. --- .../vector-add.f90 | 5 --- .../templates/gpufort_arrays.template.f03 | 2 +- .../templates/gpufort_arrays.template.h | 2 +- .../src/gpufort_acc_runtime_base.f90 | 34 +++++++++++++------ 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/examples/gpufort_arrays/vector-add-non-interoperable-types/vector-add.f90 b/examples/gpufort_arrays/vector-add-non-interoperable-types/vector-add.f90 index 5624dcdb..a502f88c 100644 --- a/examples/gpufort_arrays/vector-add-non-interoperable-types/vector-add.f90 +++ b/examples/gpufort_arrays/vector-add-non-interoperable-types/vector-add.f90 @@ -26,13 +26,8 @@ program main ! call create_original_type(mesh_orig,stream) call copy_to_intermediate_type(mesh_orig,mesh,stream) - - !call hipCheck(gpufort_array_copy_to_device(mesh%x,stream)) - !call hipCheck(gpufort_array_copy_to_device(mesh%y,stream)) call launch_vecadd_kernel_auto(0,stream,mesh) - - !call hipCheck(gpufort_array_copy_to_host(mesh%y,stream)) call destroy(mesh,stream) diff --git a/python/fort2hip/templates/gpufort_arrays.template.f03 b/python/fort2hip/templates/gpufort_arrays.template.f03 index abc7034d..6bf6d658 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.f03 +++ b/python/fort2hip/templates/gpufort_arrays.template.f03 @@ -6,7 +6,7 @@ module gpufort_arrays implicit none enum, bind(c) - enumerator :: gpufort_array_sync_none = 0 !> Simply create (or wrap) the device data. + enumerator :: gpufort_array_sync_none = 0 !> No copies between host and device data after initialization and before destruction. enumerator :: gpufort_array_sync_copy = 1 !> Copy to device after initialization and back to host before destruction. enumerator :: gpufort_array_sync_copyin = 2 !> Copy to device after initialization. enumerator :: gpufort_array_sync_copyout = 3 !> Copy back to host before destruction. diff --git a/python/fort2hip/templates/gpufort_arrays.template.h b/python/fort2hip/templates/gpufort_arrays.template.h index 3dac4bcb..32f9ac9f 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.h +++ b/python/fort2hip/templates/gpufort_arrays.template.h @@ -23,7 +23,7 @@ #endif namespace gpufort { enum class SyncMode { - None = 0, //> Simply create (or wrap) the device data. + None = 0, //> No copies between host and device data after initialization and before destruction. Copy = 1, //> Copy to device after initialization and back to host before destruction. Copyin = 2, //> Copy to device after initialization. Copyout = 3, //> Copy from device to host before destruction. diff --git a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 index 822dd8a4..91a06322 100644 --- a/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 +++ b/runtime/gpufort_acc_runtime/src/gpufort_acc_runtime_base.f90 @@ -170,17 +170,24 @@ function gpufort_acc_runtime_record_exists(hostptr,id,print_record) result(succe ! logical :: success ! - integer :: i - logical :: opt_print_record + integer :: i + logical :: opt_print_record + type(c_ptr) :: opt_hostptr + integer :: opt_id ! opt_print_record = .false. + opt_hostptr = c_null_ptr + opt_id = -1 ! if ( present(print_record) ) opt_print_record = print_record + if ( present(hostptr) ) opt_hostptr = hostptr + if ( present(id) ) opt_id = id ! success = .false. do i = 1, record_list_%last_record_index - if ( ( present(hostptr) .and. record_list_%records(i)%is_subarray(hostptr,0_8) ) .or. & - ( present(id) .and. record_list_%records(i)%id .eq. id ) ) then + + if ( ( record_list_%records(i)%is_subarray(opt_hostptr,0_8) ) .or. & + ( record_list_%records(i)%id .eq. opt_id ) ) then success = .true. if ( opt_print_record ) then CALL record_list_%records(i)%print() @@ -219,6 +226,11 @@ subroutine gpufort_acc_runtime_print_summary(print_records) ! integer :: i, j integer(c_size_t) :: free_memory, total_memory + logical :: opt_print_records + ! + opt_print_records = .false. + ! + if ( present(print_records) ) opt_print_records = print_records ! CALL hipCheck(hipMemGetInfo(free_memory,total_memory)) ! @@ -232,7 +244,7 @@ subroutine gpufort_acc_runtime_print_summary(print_records) print *, "- last record index = ", record_list_%last_record_index print *, "- device memory allocated (B) = ", record_list_%total_memory_bytes print *, "" - if ( present(print_records) .and. print_records ) then + if ( opt_print_records ) then do i = 1, record_list_%last_record_index print *, "- record ", i, ":" CALL record_list_%records(i)%print() @@ -433,7 +445,7 @@ subroutine t_record_copy_to_host_(record,async) #endif end subroutine - function t_record_is_subarray_(record,hostptr,num_bytes) result(rval) + function t_record_is_subarray_(record,hostptr,num_bytes,offset_bytes) result(rval) use iso_c_binding use gpufort_acc_runtime_c_bindings implicit none @@ -442,9 +454,12 @@ function t_record_is_subarray_(record,hostptr,num_bytes) result(rval) integer(c_size_t), intent(in) :: num_bytes ! logical :: rval - integer(c_size_t) :: offset_bytes + integer(c_size_t),intent(inout),optional :: offset_bytes + ! + integer(c_size_t) :: opt_offset_bytes ! - rval = is_subarray(record%hostptr,record%num_bytes, hostptr, num_bytes, offset_bytes) + rval = is_subarray(record%hostptr,record%num_bytes_used, hostptr, num_bytes, opt_offset_bytes) + if ( present(offset_bytes) ) offset_bytes = opt_offset_bytes end function !> Release the record for reuse/deallocation. @@ -528,7 +543,6 @@ function t_record_decrement_num_refs_(record,threshold) result(ret) ! logical :: ret ! - record%num_refs = record%num_refs - 1 ret = record%num_refs <= eval_optval_(threshold,0) end function @@ -970,7 +984,7 @@ function gpufort_acc_present_b(hostptr,num_bytes,module_var,or,async) result(dev else loc = record_list_%find_record(hostptr,success) ! TODO already detect a suitable candidate here on-the-fly if ( success ) then - fits = is_subarray(record_list_%records(loc)%hostptr,record_list_%records(loc)%num_bytes,hostptr,num_bytes,offset_bytes) + fits = record_list_%records(loc)%is_subarray(hostptr,num_bytes,offset_bytes) deviceptr = inc_cptr(record_list_%records(loc)%deviceptr,offset_bytes) else offset_bytes = -1 From 505a920a95058feb9e894b847d9ec54bd081fe61 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Tue, 16 Nov 2021 17:05:27 -0500 Subject: [PATCH 45/67] gpufort_arrays: + ifaces for host/dev ptr wrapping * gufort_arrays.f03: Add specialized ifaces for pointer wrapping: * gpufort_array_wrap: Wrap a host and device pointer pair. Application: OpenACC. * gpufort_array_wrap_device_ptr: Wrap a device Fortran pointer. Application: CUDA Fortran / hipfort * Add example to examples/gpufort_arrays/vector-add-hipmalloc * gpufort_arrays.h: * Make size,lbound,ubound const functions * Add const versions for operator(..) and linearized_index(..) --- .../vector-add-hipmalloc/Makefile | 8 + .../vector-add-hipmalloc/main-kernels.hip.cpp | 45 +++++ .../vector-add-hipmalloc/vector-add.f90 | 29 ++++ .../vector-add/main-kernels.hip.cpp | 20 +-- .../gpufort_arrays/vector-add/vector-add.f90 | 2 +- .../templates/gpufort_arrays.macros.f03 | 164 ++++++++++++++++++ .../templates/gpufort_arrays.template.f03 | 1 + .../templates/gpufort_arrays.template.h | 49 +++++- 8 files changed, 297 insertions(+), 21 deletions(-) create mode 100644 examples/gpufort_arrays/vector-add-hipmalloc/Makefile create mode 100644 examples/gpufort_arrays/vector-add-hipmalloc/main-kernels.hip.cpp create mode 100644 examples/gpufort_arrays/vector-add-hipmalloc/vector-add.f90 diff --git a/examples/gpufort_arrays/vector-add-hipmalloc/Makefile b/examples/gpufort_arrays/vector-add-hipmalloc/Makefile new file mode 100644 index 00000000..2045fdad --- /dev/null +++ b/examples/gpufort_arrays/vector-add-hipmalloc/Makefile @@ -0,0 +1,8 @@ +CFLAGS = -g -ggdb + +vector-add: + hipcc $(shell gpufort --cpp_config) $(CFLAGS) -c main-kernels.hip.cpp -o main-kernels.hip.o + hipfc $(shell gpufort --gfortran_config) main-kernels.hip.o vector-add.f90 -o vector-add $(shell gpufort --ldflags) + +clean: + rm -f *.mod *.o vector-add diff --git a/examples/gpufort_arrays/vector-add-hipmalloc/main-kernels.hip.cpp b/examples/gpufort_arrays/vector-add-hipmalloc/main-kernels.hip.cpp new file mode 100644 index 00000000..d2a30bdf --- /dev/null +++ b/examples/gpufort_arrays/vector-add-hipmalloc/main-kernels.hip.cpp @@ -0,0 +1,45 @@ +// This file was generated by gpufort +#ifndef __KERNELS_HIP_CPP__ +#define __KERNELS_HIP_CPP__ +#include "hip/hip_runtime.h" +#include "hip/hip_complex.h" +#include "gpufort.h" +#include "gpufort_arrays.h" + + +// BEGIN main_26_e28c45 +/* + HIP C++ implementation of the function/loop body of: + + !$cuf kernel do(1) <<>> + do i=1,size(y_d,1) + y_d(i) = y_d(i) + a*x_d(i) + end do + +*/ + +__global__ void vecadd_kernel( + gpufort::array1 y_d, + const float a, + const gpufort::array1 x_d +) { + int i = 1 + (1)*(threadIdx.x + blockIdx.x * blockDim.x); + if (loop_cond(i,y_d.size(1),1)) { + y_d(i)= y_d(i) + a*x_d(i); + } +} + +extern "C" void launch_vecadd_kernel_( + const dim3& grid, + const dim3& block, + const int& sharedmem, + hipStream_t& stream, + gpufort::array1& y_d, + const float& a, + const gpufort::array1& x_d +) { + // launch kernel + hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, y_d, a, x_d); +} +// END vecadd_kernel +#endif // __KERNELS_HIP_CPP__ diff --git a/examples/gpufort_arrays/vector-add-hipmalloc/vector-add.f90 b/examples/gpufort_arrays/vector-add-hipmalloc/vector-add.f90 new file mode 100644 index 00000000..4c55d0f8 --- /dev/null +++ b/examples/gpufort_arrays/vector-add-hipmalloc/vector-add.f90 @@ -0,0 +1,29 @@ +program main + use hipfort + use hipfort_check + use gpufort_arrays + implicit none + integer, parameter :: N = 40000 + real :: x(N), y(N), a + real,pointer :: x_d(:), y_d(:) + type(dim3) :: grid, tBlock + type(c_ptr) :: stream = c_null_ptr + ! + tBlock = dim3(256,1,1) + grid = dim3(ceiling(real(N)/tBlock%x),1,1) + + x = 1.0; y = 2.0; a = 2.0 + + call hipCheck(hipMalloc(x_d,source=x)) + call hipCheck(hipMalloc(y_d,source=y)) + + call launch_vecadd_kernel(grid,tBlock,0,stream,& + gpufort_array_wrap_device_ptr(y_d,lbound(y)),a,& + gpufort_array_wrap_device_ptr(x_d)) + + call hipCheck(hipMemcpy(y,y_d,hipMemcpyDeviceToHost)) + call hipCheck(hipFree(x_d)) + call hipCheck(hipFree(y_d)) + + write(*,*) 'Max error: ', maxval(abs(y-4.0)) +end program main diff --git a/examples/gpufort_arrays/vector-add/main-kernels.hip.cpp b/examples/gpufort_arrays/vector-add/main-kernels.hip.cpp index 6055e437..d2a30bdf 100644 --- a/examples/gpufort_arrays/vector-add/main-kernels.hip.cpp +++ b/examples/gpufort_arrays/vector-add/main-kernels.hip.cpp @@ -13,15 +13,15 @@ !$cuf kernel do(1) <<>> do i=1,size(y_d,1) - y_d(i) = y_d(i) + a*xi + y_d(i) = y_d(i) + a*x_d(i) end do */ __global__ void vecadd_kernel( gpufort::array1 y_d, - float a, - gpufort::array1 x_d + const float a, + const gpufort::array1 x_d ) { int i = 1 + (1)*(threadIdx.x + blockIdx.x * blockDim.x); if (loop_cond(i,y_d.size(1),1)) { @@ -29,19 +29,15 @@ __global__ void vecadd_kernel( } } -extern "C" void launch_vecadd_kernel_auto_( +extern "C" void launch_vecadd_kernel_( + const dim3& grid, + const dim3& block, const int& sharedmem, hipStream_t& stream, gpufort::array1& y_d, - float& a, - gpufort::array1& x_d + const float& a, + const gpufort::array1& x_d ) { - const int vecadd_kernel_blockX = 128; - dim3 block(vecadd_kernel_blockX); - const int vecadd_kernel_NX = (1 + ((y_d.size(1)) - (1))); - const int vecadd_kernel_gridX = divideAndRoundUp( vecadd_kernel_NX, vecadd_kernel_blockX ); - dim3 grid(vecadd_kernel_gridX); - // launch kernel hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, y_d, a, x_d); } diff --git a/examples/gpufort_arrays/vector-add/vector-add.f90 b/examples/gpufort_arrays/vector-add/vector-add.f90 index 0b4d8fc1..259bc042 100644 --- a/examples/gpufort_arrays/vector-add/vector-add.f90 +++ b/examples/gpufort_arrays/vector-add/vector-add.f90 @@ -19,7 +19,7 @@ program main call hipCheck(gpufort_array_copy_to_device(x_d,stream)) call hipCheck(gpufort_array_copy_to_device(y_d,stream)) - call launch_vecadd_kernel_auto(0,stream,y_d,a,x_d) + call launch_vecadd_kernel(grid,tBlock,0,stream,y_d,a,x_d) call hipCheck(gpufort_array_copy_to_host(y_d,stream)) diff --git a/python/fort2hip/templates/gpufort_arrays.macros.f03 b/python/fort2hip/templates/gpufort_arrays.macros.f03 index b794811b..0ef0e5bc 100644 --- a/python/fort2hip/templates/gpufort_arrays.macros.f03 +++ b/python/fort2hip/templates/gpufort_arrays.macros.f03 @@ -175,11 +175,135 @@ {# #} {# #} {# #} +{%- macro gpufort_arrays_fortran_wrap_routines(datatypes,max_rank) -%} +{% set prefix = "gpufort_array" %} +{% set max_rank_ub = max_rank+1 %} +{% for rank in range(1,max_rank_ub) %} +{% set f_array = prefix+rank|string %} +{% set routine = "init" %} +{% set binding = f_array+"_"+routine %} +{% set size_dims = ",dimension("+rank|string+")" %} +{% for tuple in datatypes %} +{% for dev in ["","_cptr"] %} +function {{f_array}}_wrap_{{tuple.f_kind}}{{dev}}(& + data_host,data_dev,lbounds,& + sync_mode,stream,ierr) result(mapped_array) + use iso_c_binding + use hipfort_enums + implicit none + {{tuple.f_type}},intent(in),target,dimension(:{% for i in range(1,rank) %},:{% endfor %}) :: data_host +{% if dev == "_cptr" %} + type(c_ptr),intent(in) :: data_dev +{% else %} + {{tuple.f_type}},intent(in),target,dimension(:{% for i in range(1,rank) %},:{% endfor %}) :: data_dev +{% endif %} + integer(c_int){{size_dims}},intent(in),optional :: lbounds + integer(kind(gpufort_array_sync_none)),intent(in),optional :: sync_mode + type(c_ptr),intent(in),optional :: stream + integer(kind(hipSuccess)),intent(inout),optional :: ierr + ! + type({{f_array}}) :: mapped_array + ! + integer(c_int),dimension({{rank}}) :: opt_lbounds + integer(kind(gpufort_array_sync_none)) :: opt_sync_mode + type(c_ptr) :: opt_stream + integer(kind(hipSuccess)) :: opt_ierr + ! + opt_lbounds = 1 + opt_sync_mode = gpufort_array_sync_none + opt_stream = c_null_ptr + if ( present(lbounds) ) opt_lbounds = lbounds + if ( present(sync_mode) ) opt_sync_mode = sync_mode + if ( present(stream) ) opt_stream = stream +{% if dev == "_cptr" %} +{% set data_dev_arg = "data_dev" %} +{% else %} +{% set data_dev_arg = "c_loc(data_dev)" %} +{% endif %} + opt_ierr = {{binding}}(& + mapped_array,& + int({{tuple.bytes}}, c_int),& + c_loc(data_host),{{data_dev_arg}},& + shape(data_host), opt_lbounds,& + gpufort_array_wrap_host_wrap_device,& + opt_sync_mode,opt_stream) + if ( present(ierr) ) ierr = opt_ierr +end function +{% endfor %} +{% endfor %} +{% set routine = "init" %} +{% set binding = f_array+"_"+routine %} +{% set size_dims = ",dimension("+rank|string+")" %} +{# function {{f_array}}_wrap_device_ptr_cptr(& #} +{# data_dev,& #} +{# sizes,lbounds,& #} +{# bytes_per_element,ierr) result(mapped_array) #} +{# use iso_c_binding #} +{# use hipfort_enums #} +{# implicit none #} +{# type(c_ptr),intent(in) :: data_dev #} +{# integer(c_int){{size_dims}},intent(in) :: sizes #} +{# integer(c_int){{size_dims}},intent(in),optional :: lbounds #} +{# integer(c_int),intent(in),optional :: bytes_per_element #} +{# integer(kind(hipSuccess)),intent(inout),optional :: ierr #} +{# ! #} +{# type({{f_array}}) :: mapped_array #} +{# ! #} +{# integer(c_int),dimension({{rank}}) :: opt_lbounds #} +{# integer(c_int) :: opt_bytes_per_element #} +{# integer(kind(hipSuccess)) :: opt_ierr #} +{# ! #} +{# opt_lbounds = 1 #} +{# opt_bytes_per_element = -1 #} +{# if ( present(lbounds) ) opt_lbounds = lbounds #} +{# if ( present(bytes_per_element) ) opt_bytes_per_element = bytes_per_element #} +{# opt_ierr = {{binding}}(& #} +{# mapped_array,& #} +{# opt_bytes_per_element,& #} +{# c_null_ptr,data_dev,& #} +{# sizes, opt_lbounds,& #} +{# gpufort_array_wrap_host_wrap_device,& #} +{# gpufort_array_sync_none,c_null_ptr) #} +{# if ( present(ierr) ) ierr = opt_ierr #} +{# end function #} +{% for tuple in datatypes %} +function {{f_array}}_wrap_device_ptr_{{tuple.f_kind}}(& + data_dev,lbounds,ierr) result(mapped_array) + use iso_c_binding + use hipfort_enums + implicit none + {{tuple.f_type}},intent(in),pointer,dimension(:{% for i in range(1,rank) %},:{% endfor %}) :: data_dev + integer(c_int){{size_dims}},intent(in),optional :: lbounds + integer(kind(hipSuccess)),intent(inout),optional :: ierr + ! + type({{f_array}}) :: mapped_array + ! + integer(c_int),dimension({{rank}}) :: opt_lbounds + integer(kind(hipSuccess)) :: opt_ierr + ! + opt_lbounds = 1 + if ( present(lbounds) ) opt_lbounds = lbounds + opt_ierr = {{binding}}(& + mapped_array,& + int({{tuple.bytes}}, c_int),& + c_null_ptr,c_loc(data_dev),& + shape(data_dev), opt_lbounds,& + gpufort_array_wrap_host_wrap_device,& + gpufort_array_sync_none,c_null_ptr) + if ( present(ierr) ) ierr = opt_ierr +end function +{% endfor %} +{% endfor %} +{# #} +{# #} +{# #} +{%- endmacro -%} {%- macro gpufort_arrays_fortran_interfaces(datatypes,max_rank) -%} {% set max_rank_ub = max_rank+1 %} {% set prefix = "gpufort_array" %} {% set routine = "init" %} {% set iface = prefix+"_"+routine %} +!> Initialize a gpufort_array of a rank that matches that of the input data. interface {{iface}} {% for rank in range(1,max_rank_ub) %} {% set size_dims = ",dimension("+rank|string+")" %} @@ -220,6 +344,46 @@ {% endfor %} end interface +{% set routine = "wrap" %} +{% set iface = prefix+"_"+routine %} +!> Wrap a Fortran or type(c_ptr) pointer pair that points to host and device data. +!> Only wrap, allocate nothing, +!> and do not synchronize at initialization or destruction time. +!> \return gpufort_array of a rank that matches that of the input data. +interface {{iface}} + module procedure :: &{{"\n"}} +{%- for rank in range(1,max_rank_ub) -%} +{%- set size_dims = ",dimension("+rank|string+")" -%} +{%- set f_array = prefix+rank|string -%} +{%- set binding = f_array+"_"+routine -%} +{%- for tuple in datatypes -%} +{%- for dev in ["","_cptr"] -%} +{{binding | indent(6,True)}}_{{tuple.f_kind}}{{dev}}{{",&\n" if not loop.last}} +{%- endfor -%}{{",&\n" if not loop.last}} +{%- endfor -%}{{",&\n" if not loop.last}} +{%- endfor %}{{""}} +end interface + +{% set routine = "wrap_device_ptr" %} +{% set iface = prefix+"_"+routine %} +!> Wrap a Fortran pointer or type(c_ptr) that points to device data. +!> Set the host pointer to null. Only wrap, allocate nothing, +!> and do not synchronize at initialization or destruction time. +!> \note Calling gpufort_array_copy_to_host or gpufort_array_copy_to_device +!> will result in HIP errors as the host pointer is set to null. +!> \return gpufort_array of a rank that matches that of the input data. +interface {{iface}} + module procedure :: & +{% for rank in range(1,max_rank_ub) %} +{% set size_dims = ",dimension("+rank|string+")" %} +{% set f_array = prefix+rank|string %} +{% set binding = f_array+"_"+routine %} +{# {{binding}}_cptr,& #} +{% for tuple in datatypes %} + {{binding}}_{{tuple.f_kind}}{{",&\n" if not loop.last}}{% endfor %}{{",&" if not loop.last}} +{% endfor %} +end interface + {% for routine in ["destroy","copy_to_host","copy_to_device"] %} {% set iface = prefix+"_"+routine %} interface {{iface}} diff --git a/python/fort2hip/templates/gpufort_arrays.template.f03 b/python/fort2hip/templates/gpufort_arrays.template.f03 index 6bf6d658..39551191 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.f03 +++ b/python/fort2hip/templates/gpufort_arrays.template.f03 @@ -57,5 +57,6 @@ module gpufort_arrays ! subroutines contains {{ gam.gpufort_arrays_fortran_init_routines(datatypes,max_rank) | indent(2,True) }} +{{ gam.gpufort_arrays_fortran_wrap_routines(datatypes,max_rank) | indent(2,True) }} {{ gam.gpufort_arrays_fortran_data_access_routines(datatypes,max_rank) | indent(2,True) }} end module gpufort_arrays diff --git a/python/fort2hip/templates/gpufort_arrays.template.h b/python/fort2hip/templates/gpufort_arrays.template.h index 32f9ac9f..2a497b1b 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.h +++ b/python/fort2hip/templates/gpufort_arrays.template.h @@ -93,7 +93,7 @@ namespace gpufort { */ __host__ __device__ __forceinline__ int linearized_index ( {{ gm.arglist("const int i",rank) | indent(6,"True") }} - ) { + ) const { return this->index_offset {% for d in range(1,rank_ub) %} + i{{d}}*this->stride{{d}}{{";" if loop.last}} @@ -121,11 +121,32 @@ namespace gpufort { #endif } + /** + * \return Element at given index. + * \param[in] i1,i2,... multi-dimensional array index. + */ + __host__ __device__ __forceinline__ const T& operator() ( +{{ gm.arglist("const int i",rank) | indent(6,"True") }} + ) const { + const int index = linearized_index( +{{ gm.separated_list_single_line("i",",",rank) | indent(8,"True") }} + ); + #ifdef __HIP_DEVICE_COMPILE__ + return this->data_dev[index]; + #else +{% for r in range(1,rank_ub) %} + assert(i{{r}} >= lbound({{r}})); + assert(i{{r}} <= ubound({{r}})); +{% endfor %} + return this->data_host[index]; + #endif + } + /** * \return Size of the array in dimension 'dim'. * \param[in] dim selected dimension: 1,...,{{rank}} */ - __host__ __device__ __forceinline__ int size(int dim) { + __host__ __device__ __forceinline__ int size(int dim) const { #ifndef __HIP_DEVICE_COMPILE__ assert(dim >= 1); assert(dim <= {{rank}}); @@ -151,7 +172,7 @@ namespace gpufort { * \return Lower bound (inclusive) of the array in dimension 'dim'. * \param[in] dim selected dimension: 1,...,{{rank}} */ - __host__ __device__ __forceinline__ int lbound(int dim) { + __host__ __device__ __forceinline__ int lbound(int dim) const { #ifndef __HIP_DEVICE_COMPILE__ assert(dim >= 1); assert(dim <= {{rank}}); @@ -176,7 +197,7 @@ namespace gpufort { * \return Upper bound (inclusive) of the array in dimension 'dim'. * \param[in] dim selected dimension: 1,...,{{rank}} */ - __host__ __device__ __forceinline__ int ubound(int dim) { + __host__ __device__ __forceinline__ int ubound(int dim) const { return this->lbound(dim) + this->size(dim) - 1; } }; @@ -480,7 +501,7 @@ namespace gpufort { */ __host__ __device__ __forceinline__ int linearized_index ( {{ gm.arglist("const int i",rank) | indent(6,"True") }} - ) { + ) const { return this->data.linearized_index( {{ gm.separated_list_single_line("i",",",rank) | indent(8,"True") }} ); @@ -498,11 +519,23 @@ namespace gpufort { ); } + /** + * \return Element at given index. + * \param[in] i1,i2,... multi-dimensional array index. + */ + __host__ __device__ __forceinline__ const T& operator() ( +{{ gm.arglist("const int i",rank) | indent(6,"True") }} + ) const { + return this->data( +{{ gm.separated_list_single_line("i",",",rank) | indent(8,"True") }} + ); + } + /** * \return Size of the array in dimension 'dim'. * \param[in] dim selected dimension: 1,...,{{rank}} */ - __host__ __device__ __forceinline__ int size(int dim) { + __host__ __device__ __forceinline__ int size(int dim) const { return this->data.size(dim); } @@ -510,7 +543,7 @@ namespace gpufort { * \return Lower bound (inclusive) of the array in dimension 'dim'. * \param[in] dim selected dimension: 1,...,{{rank}} */ - __host__ __device__ __forceinline__ int lbound(int dim) { + __host__ __device__ __forceinline__ int lbound(int dim) const { return this->data.lbound(dim); } @@ -518,7 +551,7 @@ namespace gpufort { * \return Upper bound (inclusive) of the array in dimension 'dim'. * \param[in] dim selected dimension: 1,...,{{rank}} */ - __host__ __device__ __forceinline__ int ubound(int dim) { + __host__ __device__ __forceinline__ int ubound(int dim) const { return this->data.ubound(dim); } }; From 52c7b9d2ca4f9f6d6125656aad9e9600be2b3deb Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 17 Nov 2021 05:43:56 -0500 Subject: [PATCH 46/67] REFACTOR: Use singular for gpufort header & module names --- .../vector-add-hipmalloc/Makefile | 0 .../vector-add-hipmalloc/main-kernels.hip.cpp | 4 +- .../vector-add-hipmalloc/vector-add.f90 | 4 +- .../Makefile | 0 .../main-kernels.hip.cpp | 4 +- .../vector-add.f90 | 4 +- examples/gpufort_arrays/vector-add/Makefile | 8 ---- .../vector-add/main-kernels.hip.cpp | 45 ------------------- .../gpufort_arrays/vector-add/vector-add.f90 | 30 ------------- python/fort2hip/fort2hip.py | 36 +++++++-------- python/fort2hip/model.py | 24 +++++----- ...ys.macros.f03 => gpufort_array.macros.f03} | 12 ++--- ...arrays.macros.h => gpufort_array.macros.h} | 4 +- ...emplate.f03 => gpufort_array.template.f03} | 16 +++---- ...ys.template.h => gpufort_array.template.h} | 4 +- ...hip.cpp => gpufort_array.template.hip.cpp} | 6 +-- ...emplate.h => gpufort_reduction.template.h} | 0 .../templates/hip_implementation.template.cpp | 4 +- .../Makefile | 8 ++-- .../test_compile_headers.hip.cpp | 4 +- .../test_gpufort_arrays.hip.cpp | 6 +-- .../test_gpufort_arrays_interop.f03 | 14 +++--- .../test_gpufort_arrays_kernels.hip.cpp | 4 +- 23 files changed, 79 insertions(+), 162 deletions(-) rename examples/{gpufort_arrays => gpufort_array}/vector-add-hipmalloc/Makefile (100%) rename examples/{gpufort_arrays => gpufort_array}/vector-add-hipmalloc/main-kernels.hip.cpp (94%) rename examples/{gpufort_arrays => gpufort_array}/vector-add-hipmalloc/vector-add.f90 (94%) rename examples/{gpufort_arrays => gpufort_array}/vector-add-non-interoperable-types/Makefile (100%) rename examples/{gpufort_arrays => gpufort_array}/vector-add-non-interoperable-types/main-kernels.hip.cpp (95%) rename examples/{gpufort_arrays => gpufort_array}/vector-add-non-interoperable-types/vector-add.f90 (98%) delete mode 100644 examples/gpufort_arrays/vector-add/Makefile delete mode 100644 examples/gpufort_arrays/vector-add/main-kernels.hip.cpp delete mode 100644 examples/gpufort_arrays/vector-add/vector-add.f90 rename python/fort2hip/templates/{gpufort_arrays.macros.f03 => gpufort_array.macros.f03} (97%) rename python/fort2hip/templates/{gpufort_arrays.macros.h => gpufort_array.macros.h} (96%) rename python/fort2hip/templates/{gpufort_arrays.template.f03 => gpufort_array.template.f03} (87%) rename python/fort2hip/templates/{gpufort_arrays.template.h => gpufort_array.template.h} (99%) rename python/fort2hip/templates/{gpufort_arrays.template.hip.cpp => gpufort_array.template.hip.cpp} (64%) rename python/fort2hip/templates/{gpufort_reductions.template.h => gpufort_reduction.template.h} (100%) rename test/{gpufort_arrays => gpufort_array}/Makefile (72%) rename test/{gpufort_arrays => gpufort_array}/test_compile_headers.hip.cpp (76%) rename test/{gpufort_arrays => gpufort_array}/test_gpufort_arrays.hip.cpp (97%) rename test/{gpufort_arrays => gpufort_array}/test_gpufort_arrays_interop.f03 (96%) rename test/{gpufort_arrays => gpufort_array}/test_gpufort_arrays_kernels.hip.cpp (97%) diff --git a/examples/gpufort_arrays/vector-add-hipmalloc/Makefile b/examples/gpufort_array/vector-add-hipmalloc/Makefile similarity index 100% rename from examples/gpufort_arrays/vector-add-hipmalloc/Makefile rename to examples/gpufort_array/vector-add-hipmalloc/Makefile diff --git a/examples/gpufort_arrays/vector-add-hipmalloc/main-kernels.hip.cpp b/examples/gpufort_array/vector-add-hipmalloc/main-kernels.hip.cpp similarity index 94% rename from examples/gpufort_arrays/vector-add-hipmalloc/main-kernels.hip.cpp rename to examples/gpufort_array/vector-add-hipmalloc/main-kernels.hip.cpp index d2a30bdf..0fa83b0f 100644 --- a/examples/gpufort_arrays/vector-add-hipmalloc/main-kernels.hip.cpp +++ b/examples/gpufort_array/vector-add-hipmalloc/main-kernels.hip.cpp @@ -4,7 +4,7 @@ #include "hip/hip_runtime.h" #include "hip/hip_complex.h" #include "gpufort.h" -#include "gpufort_arrays.h" +#include "gpufort_array.h" // BEGIN main_26_e28c45 @@ -42,4 +42,4 @@ extern "C" void launch_vecadd_kernel_( hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, y_d, a, x_d); } // END vecadd_kernel -#endif // __KERNELS_HIP_CPP__ +#endif // __KERNELS_HIP_CPP__ \ No newline at end of file diff --git a/examples/gpufort_arrays/vector-add-hipmalloc/vector-add.f90 b/examples/gpufort_array/vector-add-hipmalloc/vector-add.f90 similarity index 94% rename from examples/gpufort_arrays/vector-add-hipmalloc/vector-add.f90 rename to examples/gpufort_array/vector-add-hipmalloc/vector-add.f90 index 4c55d0f8..07ec40a8 100644 --- a/examples/gpufort_arrays/vector-add-hipmalloc/vector-add.f90 +++ b/examples/gpufort_array/vector-add-hipmalloc/vector-add.f90 @@ -1,7 +1,7 @@ program main use hipfort use hipfort_check - use gpufort_arrays + use gpufort_array implicit none integer, parameter :: N = 40000 real :: x(N), y(N), a @@ -26,4 +26,4 @@ program main call hipCheck(hipFree(y_d)) write(*,*) 'Max error: ', maxval(abs(y-4.0)) -end program main +end program main \ No newline at end of file diff --git a/examples/gpufort_arrays/vector-add-non-interoperable-types/Makefile b/examples/gpufort_array/vector-add-non-interoperable-types/Makefile similarity index 100% rename from examples/gpufort_arrays/vector-add-non-interoperable-types/Makefile rename to examples/gpufort_array/vector-add-non-interoperable-types/Makefile diff --git a/examples/gpufort_arrays/vector-add-non-interoperable-types/main-kernels.hip.cpp b/examples/gpufort_array/vector-add-non-interoperable-types/main-kernels.hip.cpp similarity index 95% rename from examples/gpufort_arrays/vector-add-non-interoperable-types/main-kernels.hip.cpp rename to examples/gpufort_array/vector-add-non-interoperable-types/main-kernels.hip.cpp index ca50a34f..f9d99c6e 100644 --- a/examples/gpufort_arrays/vector-add-non-interoperable-types/main-kernels.hip.cpp +++ b/examples/gpufort_array/vector-add-non-interoperable-types/main-kernels.hip.cpp @@ -4,7 +4,7 @@ #include "hip/hip_runtime.h" #include "hip/hip_complex.h" #include "gpufort.h" -#include "gpufort_arrays.h" +#include "gpufort_array.h" struct mesh_t { float a; @@ -45,4 +45,4 @@ extern "C" void launch_vecadd_kernel_auto_( hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, mesh); } // END vecadd_kernel -#endif // __KERNELS_HIP_CPP__ +#endif // __KERNELS_HIP_CPP__ \ No newline at end of file diff --git a/examples/gpufort_arrays/vector-add-non-interoperable-types/vector-add.f90 b/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 similarity index 98% rename from examples/gpufort_arrays/vector-add-non-interoperable-types/vector-add.f90 rename to examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 index a502f88c..9aacf70d 100644 --- a/examples/gpufort_arrays/vector-add-non-interoperable-types/vector-add.f90 +++ b/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 @@ -1,6 +1,6 @@ module types use iso_c_binding - use gpufort_arrays + use gpufort_array ! original non-interoperable type type :: mesh_t real :: a @@ -78,4 +78,4 @@ subroutine destroy(mesh,stream) call hipCheck(gpufort_array_destroy(mesh%x,stream)) call hipCheck(gpufort_array_destroy(mesh%y,stream)) end subroutine -end program main +end program main \ No newline at end of file diff --git a/examples/gpufort_arrays/vector-add/Makefile b/examples/gpufort_arrays/vector-add/Makefile deleted file mode 100644 index 2045fdad..00000000 --- a/examples/gpufort_arrays/vector-add/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -CFLAGS = -g -ggdb - -vector-add: - hipcc $(shell gpufort --cpp_config) $(CFLAGS) -c main-kernels.hip.cpp -o main-kernels.hip.o - hipfc $(shell gpufort --gfortran_config) main-kernels.hip.o vector-add.f90 -o vector-add $(shell gpufort --ldflags) - -clean: - rm -f *.mod *.o vector-add diff --git a/examples/gpufort_arrays/vector-add/main-kernels.hip.cpp b/examples/gpufort_arrays/vector-add/main-kernels.hip.cpp deleted file mode 100644 index d2a30bdf..00000000 --- a/examples/gpufort_arrays/vector-add/main-kernels.hip.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// This file was generated by gpufort -#ifndef __KERNELS_HIP_CPP__ -#define __KERNELS_HIP_CPP__ -#include "hip/hip_runtime.h" -#include "hip/hip_complex.h" -#include "gpufort.h" -#include "gpufort_arrays.h" - - -// BEGIN main_26_e28c45 -/* - HIP C++ implementation of the function/loop body of: - - !$cuf kernel do(1) <<>> - do i=1,size(y_d,1) - y_d(i) = y_d(i) + a*x_d(i) - end do - -*/ - -__global__ void vecadd_kernel( - gpufort::array1 y_d, - const float a, - const gpufort::array1 x_d -) { - int i = 1 + (1)*(threadIdx.x + blockIdx.x * blockDim.x); - if (loop_cond(i,y_d.size(1),1)) { - y_d(i)= y_d(i) + a*x_d(i); - } -} - -extern "C" void launch_vecadd_kernel_( - const dim3& grid, - const dim3& block, - const int& sharedmem, - hipStream_t& stream, - gpufort::array1& y_d, - const float& a, - const gpufort::array1& x_d -) { - // launch kernel - hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, y_d, a, x_d); -} -// END vecadd_kernel -#endif // __KERNELS_HIP_CPP__ diff --git a/examples/gpufort_arrays/vector-add/vector-add.f90 b/examples/gpufort_arrays/vector-add/vector-add.f90 deleted file mode 100644 index 259bc042..00000000 --- a/examples/gpufort_arrays/vector-add/vector-add.f90 +++ /dev/null @@ -1,30 +0,0 @@ -program main - use hipfort - use hipfort_check - use gpufort_arrays - implicit none - integer, parameter :: N = 40000 - real :: x(N), y(N), a - type(gpufort_array1) :: x_d, y_d - type(dim3) :: grid, tBlock - type(c_ptr) :: stream = c_null_ptr - ! - tBlock = dim3(256,1,1) - grid = dim3(ceiling(real(N)/tBlock%x),1,1) - - call hipCheck(gpufort_array_init(x_d,x)) - call hipCheck(gpufort_array_init(y_d,y)) - - x = 1.0; y = 2.0; a = 2.0 - call hipCheck(gpufort_array_copy_to_device(x_d,stream)) - call hipCheck(gpufort_array_copy_to_device(y_d,stream)) - - call launch_vecadd_kernel(grid,tBlock,0,stream,y_d,a,x_d) - - call hipCheck(gpufort_array_copy_to_host(y_d,stream)) - - call hipCheck(gpufort_array_destroy(x_d,stream)) - call hipCheck(gpufort_array_destroy(y_d,stream)) - - write(*,*) 'Max error: ', maxval(abs(y-4.0)) -end program main diff --git a/python/fort2hip/fort2hip.py b/python/fort2hip/fort2hip.py index 6741ca69..6e4d92ea 100644 --- a/python/fort2hip/fort2hip.py +++ b/python/fort2hip/fort2hip.py @@ -603,20 +603,20 @@ def generate_gpufort_headers(output_dir): msg = "created gpufort main header: ".ljust(40) + gpufort_header_file_path utils.logging.log_info(LOG_PREFIX,"generate_gpufort_headers",msg) - gpufort_reductions_header_file_path = os.path.join(output_dir, "gpufort_reductions.h") - model.GpufortReductionsHeaderModel().generate_file(gpufort_reductions_header_file_path) - msg = "created gpufort reductions header file: ".ljust(40) + gpufort_reductions_header_file_path + gpufort_reduction_header_file_path = os.path.join(output_dir, "gpufort_reduction.h") + model.GpufortReductionHeaderModel().generate_file(gpufort_reduction_header_file_path) + msg = "created gpufort reductions header file: ".ljust(40) + gpufort_reduction_header_file_path utils.logging.log_info(LOG_PREFIX,"generate_gpufort_headers",msg) # gpufort arrays - gpufort_arrays_context={ + gpufort_array_context={ "max_rank":GPUFORT_HEADERS_MAX_DIM, "datatypes":GPUFORT_HEADERS_DATATYPES } - gpufort_arrays_header_file_path = os.path.join(output_dir,"gpufort_arrays.h") - model.GpufortArraysHeaderModel().generate_file(gpufort_arrays_header_file_path,\ - context=gpufort_arrays_context) - msg = "created gpufort arrays header file: ".ljust(40) + gpufort_arrays_header_file_path + gpufort_array_header_file_path = os.path.join(output_dir,"gpufort_array.h") + model.GpufortArrayHeaderModel().generate_file(gpufort_array_header_file_path,\ + context=gpufort_array_context) + msg = "created gpufort arrays header file: ".ljust(40) + gpufort_array_header_file_path utils.logging.log_info(LOG_PREFIX,"generate_gpufort_headers",msg) utils.logging.log_info(LOG_PREFIX,"generate_gpufort_headers",msg) @@ -630,20 +630,20 @@ def generate_gpufort_sources(output_dir): {"output_dir": output_dir}) # gpufort arrays - gpufort_arrays_context={ + gpufort_array_context={ "max_rank":GPUFORT_HEADERS_MAX_DIM, "datatypes":GPUFORT_HEADERS_DATATYPES } - gpufort_arrays_source_file_path = os.path.join(output_dir,"gpufort_arrays.hip.cpp") - model.GpufortArraysSourceModel().generate_file(gpufort_arrays_source_file_path,\ - context=gpufort_arrays_context) - msg = "created gpufort arrays C++ source file: ".ljust(40) + gpufort_arrays_source_file_path + gpufort_array_source_file_path = os.path.join(output_dir,"gpufort_array.hip.cpp") + model.GpufortArraySourceModel().generate_file(gpufort_array_source_file_path,\ + context=gpufort_array_context) + msg = "created gpufort arrays C++ source file: ".ljust(40) + gpufort_array_source_file_path utils.logging.log_info(LOG_PREFIX,"generate_gpufort_sources",msg) - gpufort_arrays_fortran_interfaces_module_path = os.path.join(output_dir,"gpufort_arrays.f03") - model.GpufortArraysFortranInterfacesModel().generate_file(gpufort_arrays_fortran_interfaces_module_path,\ - context=gpufort_arrays_context) - msg = "created gpufort arrays Fortran interface module: ".ljust(40) + gpufort_arrays_fortran_interfaces_module_path + gpufort_array_fortran_interfaces_module_path = os.path.join(output_dir,"gpufort_array.f03") + model.GpufortArrayFortranInterfacesModel().generate_file(gpufort_array_fortran_interfaces_module_path,\ + context=gpufort_array_context) + msg = "created gpufort arrays Fortran interface module: ".ljust(40) + gpufort_array_fortran_interfaces_module_path utils.logging.log_info(LOG_PREFIX,"generate_gpufort_sources",msg) utils.logging.log_leave_function(LOG_PREFIX,"generate_gpufort_sources") @@ -780,4 +780,4 @@ def device_procedure_filter_(child): utils.logging.log_leave_function(LOG_PREFIX,"generate_hip_files") - return fortran_module_filepath, main_hip_filepath + return fortran_module_filepath, main_hip_filepath \ No newline at end of file diff --git a/python/fort2hip/model.py b/python/fort2hip/model.py index 0181c9c1..6ce77ac1 100644 --- a/python/fort2hip/model.py +++ b/python/fort2hip/model.py @@ -41,27 +41,27 @@ class GpufortHeaderModel(BaseModel): def __init__(self): BaseModel.__init__(self,"templates/gpufort.template.h") -class GpufortReductionsHeaderModel(BaseModel): +class GpufortReductionHeaderModel(BaseModel): def __init__(self): - BaseModel.__init__(self,"templates/gpufort_reductions.template.h") + BaseModel.__init__(self,"templates/gpufort_reduction.template.h") -class GpufortArraysHeaderModel(BaseModel): +class GpufortArrayHeaderModel(BaseModel): def __init__(self): - BaseModel.__init__(self,"templates/gpufort_arrays.template.h") + BaseModel.__init__(self,"templates/gpufort_array.template.h") -class GpufortArraysSourceModel(BaseModel): +class GpufortArraySourceModel(BaseModel): def __init__(self): - BaseModel.__init__(self,"templates/gpufort_arrays.template.hip.cpp") + BaseModel.__init__(self,"templates/gpufort_array.template.hip.cpp") -class GpufortArraysFortranInterfacesModel(BaseModel): +class GpufortArrayFortranInterfacesModel(BaseModel): def __init__(self): - BaseModel.__init__(self,"templates/gpufort_arrays.template.f03") + BaseModel.__init__(self,"templates/gpufort_array.template.f03") #model = GpufortHeaderModel() #model.generate_file("gpufort.h") -#model = GpufortReductionsHeaderModel() -#model.generate_file("gpufort_reductions.h") +#model = GpufortReductionHeaderModel() +#model.generate_file("gpufort_reduction.h") -#model_c = GpufortArraysModel().generate_file("gpufort_arrays.h", +#model_c = GpufortArrayModel().generate_file("gpufort_array.h", # context={"max_rank":7}) -#model_f = GpufortArraysFortranInterfaceModel().generate_file("gpufort_arrays.f90") +#model_f = GpufortArrayFortranInterfaceModel().generate_file("gpufort_array.f90") \ No newline at end of file diff --git a/python/fort2hip/templates/gpufort_arrays.macros.f03 b/python/fort2hip/templates/gpufort_array.macros.f03 similarity index 97% rename from python/fort2hip/templates/gpufort_arrays.macros.f03 rename to python/fort2hip/templates/gpufort_array.macros.f03 index 0ef0e5bc..455d8e0e 100644 --- a/python/fort2hip/templates/gpufort_arrays.macros.f03 +++ b/python/fort2hip/templates/gpufort_array.macros.f03 @@ -5,7 +5,7 @@ {# #} {# #} {# #} -{%- macro gpufort_arrays_fortran_data_access_interfaces(datatypes,max_rank) -%} +{%- macro gpufort_array_fortran_data_access_interfaces(datatypes,max_rank) -%} {% set prefix = "gpufort_array" %} {% set max_rank_ub = max_rank+1 %} {% for loc in ["host","dev"] %} @@ -30,7 +30,7 @@ {# #} {# #} {# #} -{%- macro gpufort_arrays_fortran_data_access_routines(datatypes,max_rank) -%} +{%- macro gpufort_array_fortran_data_access_routines(datatypes,max_rank) -%} {% set prefix = "gpufort_array" %} {% set max_rank_ub = max_rank+1 %} {% for loc in ["host","dev"] %} @@ -81,7 +81,7 @@ {# #} {# #} {# #} -{%- macro gpufort_arrays_fortran_init_routines(datatypes,max_rank) -%} +{%- macro gpufort_array_fortran_init_routines(datatypes,max_rank) -%} {% set prefix = "gpufort_array" %} {% set max_rank_ub = max_rank+1 %} {% for rank in range(1,max_rank_ub) %} @@ -175,7 +175,7 @@ {# #} {# #} {# #} -{%- macro gpufort_arrays_fortran_wrap_routines(datatypes,max_rank) -%} +{%- macro gpufort_array_fortran_wrap_routines(datatypes,max_rank) -%} {% set prefix = "gpufort_array" %} {% set max_rank_ub = max_rank+1 %} {% for rank in range(1,max_rank_ub) %} @@ -298,7 +298,7 @@ {# #} {# #} {%- endmacro -%} -{%- macro gpufort_arrays_fortran_interfaces(datatypes,max_rank) -%} +{%- macro gpufort_array_fortran_interfaces(datatypes,max_rank) -%} {% set max_rank_ub = max_rank+1 %} {% set prefix = "gpufort_array" %} {% set routine = "init" %} @@ -443,4 +443,4 @@ end function {% endfor %} end interface -{%- endmacro -%} +{%- endmacro -%} \ No newline at end of file diff --git a/python/fort2hip/templates/gpufort_arrays.macros.h b/python/fort2hip/templates/gpufort_array.macros.h similarity index 96% rename from python/fort2hip/templates/gpufort_arrays.macros.h rename to python/fort2hip/templates/gpufort_array.macros.h index f65b88bd..5c1a1473 100644 --- a/python/fort2hip/templates/gpufort_arrays.macros.h +++ b/python/fort2hip/templates/gpufort_array.macros.h @@ -2,7 +2,7 @@ {# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} {# requires that the bound_args and bound_args_single_line macros exist #} {% import "templates/gpufort.macros.h" as gm %} -{%- macro gpufort_arrays_c_bindings(datatypes,max_rank) -%} +{%- macro gpufort_array_c_bindings(datatypes,max_rank) -%} {# C side #} extern "C" { {% for rank in range(1,max_rank+1) %} @@ -68,4 +68,4 @@ extern "C" { } {% endfor %} } // extern "C" -{%- endmacro -%} +{%- endmacro -%} \ No newline at end of file diff --git a/python/fort2hip/templates/gpufort_arrays.template.f03 b/python/fort2hip/templates/gpufort_array.template.f03 similarity index 87% rename from python/fort2hip/templates/gpufort_arrays.template.f03 rename to python/fort2hip/templates/gpufort_array.template.f03 index 39551191..5e61f8db 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.f03 +++ b/python/fort2hip/templates/gpufort_array.template.f03 @@ -1,7 +1,7 @@ {# SPDX-License-Identifier: MIT #} {# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} -{% import "templates/gpufort_arrays.macros.f03" as gam %} -module gpufort_arrays +{% import "templates/gpufort_array.macros.f03" as gam %} +module gpufort_array use iso_c_binding implicit none @@ -51,12 +51,12 @@ module gpufort_arrays {% endfor %} ! interfaces -{{ gam.gpufort_arrays_fortran_interfaces(datatypes,max_rank) | indent(2,True) }} -{{ gam.gpufort_arrays_fortran_data_access_interfaces(datatypes,max_rank) | indent(2,True) }} +{{ gam.gpufort_array_fortran_interfaces(datatypes,max_rank) | indent(2,True) }} +{{ gam.gpufort_array_fortran_data_access_interfaces(datatypes,max_rank) | indent(2,True) }} ! subroutines contains -{{ gam.gpufort_arrays_fortran_init_routines(datatypes,max_rank) | indent(2,True) }} -{{ gam.gpufort_arrays_fortran_wrap_routines(datatypes,max_rank) | indent(2,True) }} -{{ gam.gpufort_arrays_fortran_data_access_routines(datatypes,max_rank) | indent(2,True) }} -end module gpufort_arrays +{{ gam.gpufort_array_fortran_init_routines(datatypes,max_rank) | indent(2,True) }} +{{ gam.gpufort_array_fortran_wrap_routines(datatypes,max_rank) | indent(2,True) }} +{{ gam.gpufort_array_fortran_data_access_routines(datatypes,max_rank) | indent(2,True) }} +end module gpufort_array \ No newline at end of file diff --git a/python/fort2hip/templates/gpufort_arrays.template.h b/python/fort2hip/templates/gpufort_array.template.h similarity index 99% rename from python/fort2hip/templates/gpufort_arrays.template.h rename to python/fort2hip/templates/gpufort_array.template.h index 2a497b1b..c0292524 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.h +++ b/python/fort2hip/templates/gpufort_array.template.h @@ -1,7 +1,7 @@ {# SPDX-License-Identifier: MIT #} {# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} {% import "templates/gpufort.macros.h" as gm %} -{% import "templates/gpufort_arrays.macros.h" as gam %} +{% import "templates/gpufort_array.macros.h" as gam %} // This file was generated from a template via gpufort --gpufort-create-headers #ifndef _GPUFORT_ARRAYS_H_ # define _GPUFORT_ARRAYS_H_ @@ -558,4 +558,4 @@ namespace gpufort { {{ "" if not loop.last }} {% endfor -%} } -#endif // _GPUFORT_ARRAYS_H_ +#endif // _GPUFORT_ARRAYS_H_ \ No newline at end of file diff --git a/python/fort2hip/templates/gpufort_arrays.template.hip.cpp b/python/fort2hip/templates/gpufort_array.template.hip.cpp similarity index 64% rename from python/fort2hip/templates/gpufort_arrays.template.hip.cpp rename to python/fort2hip/templates/gpufort_array.template.hip.cpp index 8d37ecfc..69d4202e 100644 --- a/python/fort2hip/templates/gpufort_arrays.template.hip.cpp +++ b/python/fort2hip/templates/gpufort_array.template.hip.cpp @@ -1,8 +1,8 @@ {# SPDX-License-Identifier: MIT #} {# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. #} -{% import "templates/gpufort_arrays.macros.h" as gam %} +{% import "templates/gpufort_array.macros.h" as gam %} // This file was generated from a template via gpufort --gpufort-create-headers // C bindings -#include "gpufort_arrays.h" +#include "gpufort_array.h" -{{ gam.gpufort_arrays_c_bindings(datatypes,max_rank) }} +{{ gam.gpufort_array_c_bindings(datatypes,max_rank) }} \ No newline at end of file diff --git a/python/fort2hip/templates/gpufort_reductions.template.h b/python/fort2hip/templates/gpufort_reduction.template.h similarity index 100% rename from python/fort2hip/templates/gpufort_reductions.template.h rename to python/fort2hip/templates/gpufort_reduction.template.h diff --git a/python/fort2hip/templates/hip_implementation.template.cpp b/python/fort2hip/templates/hip_implementation.template.cpp index 2fc95c77..54fb3519 100644 --- a/python/fort2hip/templates/hip_implementation.template.cpp +++ b/python/fort2hip/templates/hip_implementation.template.cpp @@ -18,7 +18,7 @@ {% endfor %} #include "gpufort.h" {% if have_reductions -%} -#include "gpufort_reductions.h" +#include "gpufort_reduction.h" {%- endif -%} {%- macro make_block(kernel) -%} {% set krnl_prefix = kernel.kernel_name %} @@ -224,4 +224,4 @@ extern "C" void {{iface_prefix}}_cpu( {% endif +%} // END {{krnl_prefix}} {% endfor %}{# kernels #} -#endif // {{ guard }} +#endif // {{ guard }} \ No newline at end of file diff --git a/test/gpufort_arrays/Makefile b/test/gpufort_array/Makefile similarity index 72% rename from test/gpufort_arrays/Makefile rename to test/gpufort_array/Makefile index f2b422ef..3880b0aa 100644 --- a/test/gpufort_arrays/Makefile +++ b/test/gpufort_array/Makefile @@ -1,9 +1,9 @@ -HIP_TEST_SRC = test_compile_headers.hip.cpp test_gpufort_arrays.hip.cpp +HIP_TEST_SRC = test_compile_headers.hip.cpp test_gpufort_array.hip.cpp HIP_TEST_APP = $(HIP_TEST_SRC:.hip.cpp=.x) -FORT_TEST_SRC = test_gpufort_arrays_interop.f03 +FORT_TEST_SRC = test_gpufort_array_interop.f03 FORT_TEST_APP = $(FORT_TEST_SRC:.f03=.x) -FORT_TEST_DEPS = test_gpufort_arrays_kernels.hip.o +FORT_TEST_DEPS = test_gpufort_array_kernels.hip.o HIPCC_CFLAGS ?= $(shell gpufort --cpp_config) -g -ggdb FC_CFLAGS ?= $(shell gpufort --gfortran_config) -g -ggdb @@ -25,4 +25,4 @@ generate_headers: hipcc -c $(HIPCC_CFLAGS) $^ -o $@ clean: - rm -f $(HIP_TEST_APP) $(FORT_TEST_APP) *.o *.mod + rm -f $(HIP_TEST_APP) $(FORT_TEST_APP) *.o *.mod \ No newline at end of file diff --git a/test/gpufort_arrays/test_compile_headers.hip.cpp b/test/gpufort_array/test_compile_headers.hip.cpp similarity index 76% rename from test/gpufort_arrays/test_compile_headers.hip.cpp rename to test/gpufort_array/test_compile_headers.hip.cpp index 6867e016..d4740abb 100644 --- a/test/gpufort_arrays/test_compile_headers.hip.cpp +++ b/test/gpufort_array/test_compile_headers.hip.cpp @@ -1,7 +1,7 @@ #include "gpufort.h" -#include "gpufort_arrays.h" +#include "gpufort_array.h" #include "gpufort_reductions.h" int main(int argc,char** argv) { return 0; -} +} \ No newline at end of file diff --git a/test/gpufort_arrays/test_gpufort_arrays.hip.cpp b/test/gpufort_array/test_gpufort_arrays.hip.cpp similarity index 97% rename from test/gpufort_arrays/test_gpufort_arrays.hip.cpp rename to test/gpufort_array/test_gpufort_arrays.hip.cpp index e8f945a6..d006e63c 100644 --- a/test/gpufort_arrays/test_gpufort_arrays.hip.cpp +++ b/test/gpufort_array/test_gpufort_arrays.hip.cpp @@ -1,9 +1,9 @@ #include "gpufort.h" -#include "gpufort_arrays.h" +#include "gpufort_array.h" #include -#include "test_gpufort_arrays_kernels.hip.cpp" +#include "test_gpufort_array_kernels.hip.cpp" void test1() { gpufort::array1 int_array1; @@ -76,4 +76,4 @@ int main(int argc,char** argv) { test2(); std::cout << "PASSED" << std::endl; return 0; -} +} \ No newline at end of file diff --git a/test/gpufort_arrays/test_gpufort_arrays_interop.f03 b/test/gpufort_array/test_gpufort_arrays_interop.f03 similarity index 96% rename from test/gpufort_arrays/test_gpufort_arrays_interop.f03 rename to test/gpufort_array/test_gpufort_arrays_interop.f03 index b5c57469..4c6a150c 100644 --- a/test/gpufort_arrays/test_gpufort_arrays_interop.f03 +++ b/test/gpufort_array/test_gpufort_arrays_interop.f03 @@ -1,4 +1,4 @@ -program test_gpufort_arrays_interop +program test_gpufort_array_interop call test_array_initialization() call test_hip_interfacing() print *, "PASSED" @@ -11,7 +11,7 @@ subroutine assert(condition) end subroutine subroutine test_array_initialization() - use gpufort_arrays + use gpufort_array use hipfort_check use hipfort implicit none @@ -94,7 +94,7 @@ subroutine test_array_initialization() end subroutine subroutine test_hip_interfacing() - use gpufort_arrays + use gpufort_array use hipfort_check use hipfort implicit none @@ -102,17 +102,17 @@ subroutine test_hip_interfacing() interface subroutine launch_fill_int_array_1(arr) & bind(c,name="launch_fill_int_array_1") - use gpufort_arrays + use gpufort_array type(gpufort_array1),intent(inout) :: arr end subroutine subroutine launch_fill_int_array_2(arr) & bind(c,name="launch_fill_int_array_2") - use gpufort_arrays + use gpufort_array type(gpufort_array2),intent(inout) :: arr end subroutine subroutine launch_fill_int_array_3(arr) & bind(c,name="launch_fill_int_array_3") - use gpufort_arrays + use gpufort_array type(gpufort_array3),intent(inout) :: arr end subroutine end interface @@ -177,4 +177,4 @@ subroutine launch_fill_int_array_3(arr) & call hipCheck(gpufort_array_destroy(int_marr2,c_null_ptr)) call hipCheck(gpufort_array_destroy(int_marr3,c_null_ptr)) end subroutine -end program +end program \ No newline at end of file diff --git a/test/gpufort_arrays/test_gpufort_arrays_kernels.hip.cpp b/test/gpufort_array/test_gpufort_arrays_kernels.hip.cpp similarity index 97% rename from test/gpufort_arrays/test_gpufort_arrays_kernels.hip.cpp rename to test/gpufort_array/test_gpufort_arrays_kernels.hip.cpp index 4a92db6a..d12df72e 100644 --- a/test/gpufort_arrays/test_gpufort_arrays_kernels.hip.cpp +++ b/test/gpufort_array/test_gpufort_arrays_kernels.hip.cpp @@ -1,7 +1,7 @@ #include "hip/hip_runtime.h" #include "hip/hip_runtime_api.h" -#include "gpufort_arrays.h" +#include "gpufort_array.h" __global__ void fill_int_array_1( gpufort::array1 arr @@ -44,4 +44,4 @@ extern "C" { void launch_fill_int_array_3(gpufort::array3 arr) { hipLaunchKernelGGL(fill_int_array_3,dim3(1),dim3(10,10,10),0,nullptr,arr); } -} +} \ No newline at end of file From e21f7fe080aaa444bdab79d2a00a4ea32fe6b7bb Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 17 Nov 2021 05:44:59 -0500 Subject: [PATCH 47/67] vector-add-non-interop*: Showcase nested struct init and access. --- .../main-kernels.hip.cpp | 11 ++- .../vector-add.f90 | 95 +++++++++++-------- 2 files changed, 62 insertions(+), 44 deletions(-) diff --git a/examples/gpufort_array/vector-add-non-interoperable-types/main-kernels.hip.cpp b/examples/gpufort_array/vector-add-non-interoperable-types/main-kernels.hip.cpp index f9d99c6e..353035ae 100644 --- a/examples/gpufort_array/vector-add-non-interoperable-types/main-kernels.hip.cpp +++ b/examples/gpufort_array/vector-add-non-interoperable-types/main-kernels.hip.cpp @@ -6,9 +6,14 @@ #include "gpufort.h" #include "gpufort_array.h" +// C++ structs with same layout as Fortran interop types +struct node_t { + float val; +}; + struct mesh_t { float a; - gpufort::array1 x; + gpufort::array1 x; gpufort::array1 y; }; @@ -26,7 +31,7 @@ struct mesh_t { __global__ void vecadd_kernel(mesh_t mesh) { int i = 1 + (1)*(threadIdx.x + blockIdx.x * blockDim.x); if (loop_cond(i,mesh.y.size(1),1)) { - mesh.y(i)= mesh.y(i) + mesh.a*mesh.x(i); + mesh.y(i)= mesh.y(i) + mesh.a*mesh.x(i).val; } } @@ -45,4 +50,4 @@ extern "C" void launch_vecadd_kernel_auto_( hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, mesh); } // END vecadd_kernel -#endif // __KERNELS_HIP_CPP__ \ No newline at end of file +#endif // __KERNELS_HIP_CPP__ diff --git a/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 b/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 index 9aacf70d..880daefb 100644 --- a/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 +++ b/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 @@ -1,16 +1,27 @@ module types use iso_c_binding use gpufort_array - ! original non-interoperable type + + ! original non-interoperable types + type :: node_t + real :: val + end type + type :: mesh_t real :: a - real,allocatable :: x(:), y(:) + type(node_t),allocatable :: x(:) + real,allocatable :: y(:) + end type + + ! interoperable types; (will be) autogenerated by GPUFORT + type,bind(c) :: node_t_interop + real(c_float) :: val end type - ! interoperable type; (will be) autogenerated by GPUFORT type,bind(c) :: mesh_t_interop real(c_float) :: a - type(gpufort_array1) :: x, y + type(gpufort_array1) :: x + type(gpufort_array1) :: y end type end module @@ -21,61 +32,63 @@ program main integer, parameter :: N = 40000 ! type(mesh_t) :: mesh_orig - type(mesh_t_interop) :: mesh + type(mesh_t_interop) :: mesh_interop type(c_ptr) :: stream = c_null_ptr ! - call create_original_type(mesh_orig,stream) - call copy_to_intermediate_type(mesh_orig,mesh,stream) + call init_orig_type() + + call init_interop_type() - call launch_vecadd_kernel_auto(0,stream,mesh) + call launch_vecadd_kernel_auto(0,stream,mesh_interop) - call destroy(mesh,stream) + call destroy_interop_type() write(*,*) 'Max error: ', maxval(abs(mesh_orig%y-4.0)) contains - subroutine create_original_type(mesh_orig,stream) - use types - use hipfort - use hipfort_check + subroutine init_orig_type() implicit none - type(mesh_t),intent(inout) :: mesh_orig - type(c_ptr),intent(in) :: stream - ! + integer i allocate(mesh_orig%x(N)) allocate(mesh_orig%y(N)) - mesh_orig%x = 1.0; mesh_orig%y = 2.0; mesh_orig%a = 2.0 + mesh_orig%x(:)%val = 1.0; + mesh_orig%y(:) = 2.0; mesh_orig%a = 2.0 end subroutine ! (will be) autogenerated by gpufort - subroutine copy_to_intermediate_type(mesh_orig,mesh,stream) - use types - use hipfort - use hipfort_check + subroutine init_interop_type() + use gpufort_array + use iso_c_binding implicit none - type(mesh_t),intent(in) :: mesh_orig - type(mesh_t_interop),intent(inout) :: mesh - type(c_ptr),intent(in) :: stream - ! - call hipCheck(gpufort_array_init(mesh%x,mesh_orig%x,& - alloc_mode=gpufort_array_wrap_host_alloc_device,& - sync_mode=gpufort_array_sync_copyin,& - stream=stream)) - call hipCheck(gpufort_array_init(mesh%y,mesh_orig%y,& + integer i + type(node_t_interop) :: node_t_interop_dummy + type(node_t_interop),pointer :: mesh_t_interop_x(:) + ! Allocate interoperable struct array + ! Generate type specific init routine + call hipCheck(gpufort_array_init(mesh_interop%x,& + int(c_sizeof(node_t_interop_dummy),c_int),& + shape(mesh_orig%x),& + lbounds=lbound(mesh_orig%x),& + alloc_mode=gpufort_array_alloc_pinned_host_alloc_device)) + + ! Copy to device; from non-interop type to interop type + call c_f_pointer(mesh_interop%x%data%data_host,mesh_t_interop_x,shape=shape(mesh_orig%x)) + mesh_t_interop_x(:)%val = mesh_orig%x(:)%val ! depends on members & rank + call hipCheck(gpufort_array_copy_to_device(mesh_interop%x,stream)) + + ! Init basic datatype array + call hipCheck(gpufort_array_init(mesh_interop%y,mesh_orig%y,& alloc_mode=gpufort_array_wrap_host_alloc_device,& sync_mode=gpufort_array_sync_copy,& stream=stream)) - mesh%a = mesh_orig%a + mesh_interop%a = mesh_orig%a end subroutine ! (will be) autogenerated by GPUFORT - subroutine destroy(mesh,stream) - use types - use hipfort - use hipfort_check - type(mesh_t_interop),intent(inout) :: mesh - type(c_ptr),intent(in) :: stream - ! - call hipCheck(gpufort_array_destroy(mesh%x,stream)) - call hipCheck(gpufort_array_destroy(mesh%y,stream)) + subroutine destroy_interop_type() + use gpufort_array + use iso_c_binding + implicit none + call hipCheck(gpufort_array_destroy(mesh_interop%x,stream)) + call hipCheck(gpufort_array_destroy(mesh_interop%y,stream)) end subroutine -end program main \ No newline at end of file +end program main From 7e67cba2e32093da7ffa36b7eb1d3ed20e7c2214 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 17 Nov 2021 05:52:11 -0500 Subject: [PATCH 48/67] Add some developer comments --- .../vector-add-non-interoperable-types/vector-add.f90 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 b/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 index 880daefb..5e945100 100644 --- a/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 +++ b/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 @@ -63,7 +63,10 @@ subroutine init_interop_type() type(node_t_interop) :: node_t_interop_dummy type(node_t_interop),pointer :: mesh_t_interop_x(:) ! Allocate interoperable struct array - ! Generate type specific init routine + ! Generate type specific init routine? + ! REQ: Need to know shape and bounds, not mesh_orig + ! NOTE: size can be supplied from the CPP side, too. + ! NOTE: alloc_mode will remain as is. call hipCheck(gpufort_array_init(mesh_interop%x,& int(c_sizeof(node_t_interop_dummy),c_int),& shape(mesh_orig%x),& @@ -71,6 +74,7 @@ subroutine init_interop_type() alloc_mode=gpufort_array_alloc_pinned_host_alloc_device)) ! Copy to device; from non-interop type to interop type + ! REQ: Need to know mesh_orig for value assignment call c_f_pointer(mesh_interop%x%data%data_host,mesh_t_interop_x,shape=shape(mesh_orig%x)) mesh_t_interop_x(:)%val = mesh_orig%x(:)%val ! depends on members & rank call hipCheck(gpufort_array_copy_to_device(mesh_interop%x,stream)) From 42c692b239dfee63f0274d28ffd46eb0d6876fd1 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 17 Nov 2021 09:55:31 -0500 Subject: [PATCH 49/67] Readd gpufort_array/vector-add example --- examples/gpufort_array/vector-add/Makefile | 8 ++++ .../vector-add/main-kernels.hip.cpp | 47 +++++++++++++++++++ .../gpufort_array/vector-add/vector-add.f90 | 30 ++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 examples/gpufort_array/vector-add/Makefile create mode 100644 examples/gpufort_array/vector-add/main-kernels.hip.cpp create mode 100644 examples/gpufort_array/vector-add/vector-add.f90 diff --git a/examples/gpufort_array/vector-add/Makefile b/examples/gpufort_array/vector-add/Makefile new file mode 100644 index 00000000..2045fdad --- /dev/null +++ b/examples/gpufort_array/vector-add/Makefile @@ -0,0 +1,8 @@ +CFLAGS = -g -ggdb + +vector-add: + hipcc $(shell gpufort --cpp_config) $(CFLAGS) -c main-kernels.hip.cpp -o main-kernels.hip.o + hipfc $(shell gpufort --gfortran_config) main-kernels.hip.o vector-add.f90 -o vector-add $(shell gpufort --ldflags) + +clean: + rm -f *.mod *.o vector-add diff --git a/examples/gpufort_array/vector-add/main-kernels.hip.cpp b/examples/gpufort_array/vector-add/main-kernels.hip.cpp new file mode 100644 index 00000000..2d1073d5 --- /dev/null +++ b/examples/gpufort_array/vector-add/main-kernels.hip.cpp @@ -0,0 +1,47 @@ +// This file was generated by gpufort +#ifndef __KERNELS_HIP_CPP__ +#define __KERNELS_HIP_CPP__ +#include "hip/hip_runtime.h" +#include "hip/hip_complex.h" +#include "gpufort.h" +#include "gpufort_array.h" + + +// BEGIN main_26_e28c45 +/* + HIP C++ implementation of the function/loop body of: + + !$cuf kernel do(1) <<>> + do i=1,size(y_d,1) + y_d(i) = y_d(i) + a*x_d(i) + end do + +*/ + +__global__ void vecadd_kernel( + gpufort::array1 y_d, + const float a, + const gpufort::array1 x_d +) { + int i = 1 + (1)*(threadIdx.x + blockIdx.x * blockDim.x); + if (loop_cond(i,y_d.size(1),1)) { + y_d(i)= y_d(i) + a*x_d(i); + } +} + +extern "C" void launch_vecadd_kernel_( + const dim3& grid, + const dim3& block, + const int& sharedmem, + hipStream_t& stream, + gpufort::array1& y_d, + const float& a, + const gpufort::array1& x_d +) { + // launch kernel + hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, y_d, a, x_d); + //y_d.print_host_data(std::cout,"launch_vecadd_kernel:y_d:host",gpufort::PrintMode::PrintCValues,12); + //y_d.print_device_data(std::cout,"launch_vecadd_kernel:y_d:device",gpufort::PrintMode::PrintValuesAndNorms,12); +} +// END vecadd_kernel +#endif // __KERNELS_HIP_CPP__ diff --git a/examples/gpufort_array/vector-add/vector-add.f90 b/examples/gpufort_array/vector-add/vector-add.f90 new file mode 100644 index 00000000..6a970a4d --- /dev/null +++ b/examples/gpufort_array/vector-add/vector-add.f90 @@ -0,0 +1,30 @@ +program main + use hipfort + use hipfort_check + use gpufort_array + implicit none + integer, parameter :: N = 40000 + real :: x(N), y(N), a + type(gpufort_array1) :: x_d, y_d + type(dim3) :: grid, tBlock + type(c_ptr) :: stream = c_null_ptr + ! + tBlock = dim3(256,1,1) + grid = dim3(ceiling(real(N)/tBlock%x),1,1) + + call hipCheck(gpufort_array_init(x_d,x)) + call hipCheck(gpufort_array_init(y_d,y)) + + x = 1.0; y = 2.0; a = 2.0 + call hipCheck(gpufort_array_copy_to_device(x_d,stream)) + call hipCheck(gpufort_array_copy_to_device(y_d,stream)) + + call launch_vecadd_kernel(grid,tBlock,0,stream,y_d,a,x_d) + + call hipCheck(gpufort_array_copy_to_host(y_d,stream)) + + call hipCheck(gpufort_array_destroy(x_d,stream)) + call hipCheck(gpufort_array_destroy(y_d,stream)) + + write(*,*) 'Max error: ', maxval(abs(y-4.0)) +end program main \ No newline at end of file From 3822779641b6dc2728f09404dc24f7a9bf66bab2 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Wed, 17 Nov 2021 09:56:06 -0500 Subject: [PATCH 50/67] gpufort_array.h: Add __host__ print host/device data routine --- .../templates/gpufort_array.template.h | 95 ++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/python/fort2hip/templates/gpufort_array.template.h b/python/fort2hip/templates/gpufort_array.template.h index c0292524..2f55ccb1 100644 --- a/python/fort2hip/templates/gpufort_array.template.h +++ b/python/fort2hip/templates/gpufort_array.template.h @@ -8,7 +8,9 @@ # include # ifndef _GPUFORT_H_ # include +# include # include +# include # define HIP_CHECK(condition) \ { \ hipError_t error = condition; \ @@ -21,6 +23,10 @@ #ifndef __HIP_DEVICE_COMPILE__ # include #endif +#ifndef GPUFORT_ARRAY_PRINT_PREC +# define GPUFORT_ARRAY_PRINT_PREC 6 +#endif + namespace gpufort { enum class SyncMode { None = 0, //> No copies between host and device data after initialization and before destruction. @@ -40,6 +46,14 @@ namespace gpufort { AllocPinnedHostWrapDevice = 4, //> Allocate new pinned host array and wrap device pointer. AllocPinnedHostAllocDevice = 5 //> Allocate new pinned host array and wrap device pointer. }; + + enum class PrintMode { + PrintNorms = 0, //> Print norms and metrics. + PrintValues = 1, //> Print array values; write index in Fortran (i,j,k,...) style. + PrintValuesAndNorms = 2, //> Print array values and norms and metrics; write index in Fortran (i,j,k,...) style. + PrintCValues = 3, //> Print array values; write index in C/C++ [i] style. + PrintCValuesAndNorms = 4 //> Print array values and norms and metrics; write index in C/C++ [i] style. + }; {% for rank in range(1,max_rank+1) %} {% set rank_ub = rank+1 %} @@ -554,8 +568,87 @@ namespace gpufort { __host__ __device__ __forceinline__ int ubound(int dim) const { return this->data.ubound(dim); } + +{% for source in ["host","device"] %} + /** + * Write {{source}} data values and their corresponding index + * to an output stream. + * \param[inout] out output stream + * \param[in] prefix prefix to put before each output line + * \param[in] print_prec precision to use when printing floating point numbers + * [default=GPUFORT_ARRAY_PRINT_PREC[default=6]] + * \note This method only makes sense for numeric data types and + * may result in compilation, runtime errors or undefined output if the + * underlying data is not numeric. + */ + __host__ void print_{{source}}_data( + std::ostream& out, const char* prefix, PrintMode print_mode, + const int print_prec=GPUFORT_ARRAY_PRINT_PREC) const { + const bool print_norms = + print_mode==PrintMode::PrintNorms || + print_mode==PrintMode::PrintValuesAndNorms || + print_mode==PrintMode::PrintCValuesAndNorms; + const bool print_values = + print_mode==PrintMode::PrintValues || + print_mode==PrintMode::PrintValuesAndNorms; + const bool print_values_c_style = + print_mode==PrintMode::PrintCValues || + print_mode==PrintMode::PrintCValuesAndNorms; + if ( !print_norms && !print_values && !print_values_c_style ) { + std::cerr << "ERROR: gpufort::Array{{rank}}::print_{{source}}_data(...): Unexpected value for 'print_mode': " + << static_cast(this->alloc_mode) << std::endl; + std::terminate(); + } +{% for col in range(1,rank_ub) %} + const int n{{col}} = this->size({{col}}); + const int lb{{col}} = this->lbound({{col}}); +{% endfor %} + const int n = this->data.num_elements; +{% if source == "device" %} + std::vector host_array(n); + T* A_h = host_array.data(); + T* A = this->data.data_dev; + HIP_CHECK(hipMemcpy(A_h, A, n*sizeof(T), hipMemcpyDeviceToHost)); +{% else %} + T* A_h = this->data.data_host; +{% endif %} + T min = +std::numeric_limits::max(); + T max = -std::numeric_limits::max(); + T sum = 0; + T l1 = 0; + T l2 = 0; + out << prefix << ":\n"; +{% for col in range(1,rank_ub) %} + for ( int i{{rank_ub-col}} = 0; i{{rank_ub-col}} < n{{rank_ub-col}}; i{{rank_ub-col}}++ ) { +{% endfor %} + const int idx = this->linearized_index({% for col in range(1,rank_ub) -%}i{{col}}{{ "," if not loop.last }}{% endfor -%}); + T value = A_h[idx]; + if ( print_norms ) { + min = std::min(value,min); + max = std::max(value,max); + sum += value; + l1 += std::abs(value); + l2 += value*value; + } + if ( print_values ) { + out << prefix << "(" << {% for col in range(1,rank_ub) -%}(lb{{col}}+i{{col}}) << {{ "\",\" <<" |safe if not loop.last }} {% endfor -%} ") = " << std::setprecision(print_prec) << value << "\n"; + } else if ( print_values_c_style ) { + out << prefix << "[" << idx << "] = " << std::setprecision(print_prec) << value << "\n"; + } + {%+ for col in range(1,rank_ub) -%}}{%- endfor %} // for loops + if ( print_norms ) { + out << prefix << ":min=" << std::setprecision(print_prec) << min << "\n"; + out << prefix << ":max=" << std::setprecision(print_prec) << max << "\n"; + out << prefix << ":sum=" << std::setprecision(print_prec) << sum << "\n"; + out << prefix << ":l1=" << std::setprecision(print_prec) << l1 << "\n"; + out << prefix << ":l2=" << std::setprecision(print_prec) << std::sqrt(l2) << "\n"; + out << prefix << "num_elements=" << std::setprecision(print_prec) << n << "\n"; + } + } +{% endfor %} + }; {{ "" if not loop.last }} {% endfor -%} } -#endif // _GPUFORT_ARRAYS_H_ \ No newline at end of file +#endif // _GPUFORT_ARRAYS_H_ From 1005738521d06de9c28dbe31e397e97bf0c5f1bd Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 18 Nov 2021 05:14:37 -0500 Subject: [PATCH 51/67] exa*/gpufort*/non-interop*-types: Change 1 original member to pointer --- .../vector-add-non-interoperable-types/vector-add.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 b/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 index 5e945100..023e7745 100644 --- a/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 +++ b/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 @@ -9,8 +9,8 @@ module types type :: mesh_t real :: a - type(node_t),allocatable :: x(:) - real,allocatable :: y(:) + type(node_t),allocatable :: x(:) + real,pointer,dimension(:) :: y end type ! interoperable types; (will be) autogenerated by GPUFORT From fb9e5e4d16a3dcbcdd45dbf767837c7267fa23a6 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 18 Nov 2021 05:16:03 -0500 Subject: [PATCH 52/67] test/gpufort_array/*: Change file names as expected by Makefile --- .../gpufort_array/test_gpufort_arrays.hip.cpp | 79 -------- .../test_gpufort_arrays_interop.f03 | 180 ------------------ .../test_gpufort_arrays_kernels.hip.cpp | 47 ----- 3 files changed, 306 deletions(-) delete mode 100644 test/gpufort_array/test_gpufort_arrays.hip.cpp delete mode 100644 test/gpufort_array/test_gpufort_arrays_interop.f03 delete mode 100644 test/gpufort_array/test_gpufort_arrays_kernels.hip.cpp diff --git a/test/gpufort_array/test_gpufort_arrays.hip.cpp b/test/gpufort_array/test_gpufort_arrays.hip.cpp deleted file mode 100644 index d006e63c..00000000 --- a/test/gpufort_array/test_gpufort_arrays.hip.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "gpufort.h" -#include "gpufort_array.h" - -#include - -#include "test_gpufort_array_kernels.hip.cpp" - -void test1() { - gpufort::array1 int_array1; - gpufort::array2 int_array2; - gpufort::array3 int_array3; - - HIP_CHECK(int_array1.init(sizeof(int),nullptr,nullptr, 10, -1, - gpufort::AllocMode::AllocPinnedHostAllocDevice)); // hostptr,devptr, count, lower bound, alloc_mode - HIP_CHECK(int_array2.init(sizeof(int),nullptr,nullptr, 10,10, -1,-2, - gpufort::AllocMode::AllocHostAllocDevice)); - HIP_CHECK(int_array3.init(sizeof(int),nullptr,nullptr, 10,10,10, -1,-2,-3, - gpufort::AllocMode::AllocPinnedHostAllocDevice)); - - assert( 10==int_array1.data.num_elements); - assert( 100==int_array2.data.num_elements); - assert(1000==int_array3.data.num_elements); - - assert( 1==int_array1.data.index_offset); - assert( 21==int_array2.data.index_offset); - assert(321==int_array3.data.index_offset); - - assert(0==int_array1.linearized_index(-1)); - assert(0==int_array2.linearized_index(-1,-2)); - assert(0==int_array3.linearized_index(-1,-2,-3)); - - assert( 9==int_array1.linearized_index(-1+10-1)); // upper bound - assert( 99==int_array2.linearized_index(-1+10-1,-2+10-1)); - assert(999==int_array3.linearized_index(-1+10-1,-2+10-1,-3+10-1)); - - launch_fill_int_array_1(int_array1); - launch_fill_int_array_2(int_array2); - launch_fill_int_array_3(int_array3); - - HIP_CHECK(int_array1.copy_to_host()); - HIP_CHECK(int_array2.copy_to_host()); - HIP_CHECK(int_array3.copy_to_host()); - - HIP_CHECK(hipDeviceSynchronize()); - - for (int n = 0; n < int_array1.data.num_elements; n++ ) { - //std::cout << int_array1.data.data_host[n] << std::endl; - assert(int_array1.data.data_host[n] == n); - } - for (int n = 0; n < int_array2.data.num_elements; n++ ) { - assert(int_array2.data.data_host[n] == n); - } - for (int n = 0; n < int_array3.data.num_elements; n++ ) { - assert(int_array3.data.data_host[n] == n); - } -} - -void test2() { - gpufort::array3 bool_array; - gpufort::array3 short_array; - gpufort::array3 char_array; - gpufort::array3 int_array; - gpufort::array3 long_array; - gpufort::array3 float_array; - gpufort::array3 double_array; - assert(sizeof(bool_array)==sizeof(short_array)); - assert(sizeof(char_array)==sizeof(short_array)); - assert(sizeof(char_array)==sizeof(int_array)); - assert(sizeof(long_array)==sizeof(int_array)); - assert(sizeof(long_array)==sizeof(float_array)); - assert(sizeof(double_array)==sizeof(float_array)); -} - -int main(int argc,char** argv) { - test1(); - test2(); - std::cout << "PASSED" << std::endl; - return 0; -} \ No newline at end of file diff --git a/test/gpufort_array/test_gpufort_arrays_interop.f03 b/test/gpufort_array/test_gpufort_arrays_interop.f03 deleted file mode 100644 index 4c6a150c..00000000 --- a/test/gpufort_array/test_gpufort_arrays_interop.f03 +++ /dev/null @@ -1,180 +0,0 @@ -program test_gpufort_array_interop - call test_array_initialization() - call test_hip_interfacing() - print *, "PASSED" -contains - - subroutine assert(condition) - logical,intent(in) :: condition - ! - if ( .not. condition ) ERROR STOP "assertion failed" - end subroutine - - subroutine test_array_initialization() - use gpufort_array - use hipfort_check - use hipfort - implicit none - ! - type(gpufort_array3) :: marr3 - type(gpufort_array4) :: marr4 - type(gpufort_array5) :: marr5 - ! - real(c_float),target :: host_array_3(-1:8,-2:7,-3:6) - real(c_double_complex),target :: host_array_4(-1:8,-2:7,-3:6,-4:5) - integer(c_int),pointer,dimension(:,:,:,:,:) :: host_array_5, device_array_5 - ! - integer :: i,j,k,n - - ! - ! PART 1: Creating mapped arrays - ! - - ! direct access; set from existing pointer - ! mapped_array,& - ! bytes_per_element,& - ! data_host,data_dev,& - ! sizes, lbounds,& - ! alloc_mode,sync_mode,stream) & - call hipCheck(gpufort_array_init(marr3,& - c_float,c_loc(host_array_3),c_null_ptr,& - shape(host_array_3),lbound(host_array_3),& - gpufort_array_wrap_host_alloc_device,& - gpufort_array_sync_none,c_null_ptr)) - - call assert(marr3%data%stride1==1) - call assert(marr3%data%stride2==10) - call assert(marr3%data%stride3==100) - call assert(marr3%data%index_offset==321) - call assert(marr3%data%num_elements==1000) - - ! overloaded access; set from existing pointer - call hipCheck(gpufort_array_init(marr4,& - host_array_4, lbounds=lbound(host_array_4))) - - call assert(marr4%data%stride1==1) - call assert(marr4%data%stride2==10) - call assert(marr4%data%stride3==100) - call assert(marr4%data%stride4==1000) - call assert(marr4%data%index_offset==4321) - call assert(marr4%data%num_elements==10000) - - ! allocate device AND (pinned) host array - call hipCheck(gpufort_array_init(marr5,& - c_int,[4,4,4,4,4],lbounds=[-1,-1,-1,-1,-1],& - alloc_mode=gpufort_array_alloc_pinned_host_alloc_device)) - call assert(marr5%data%stride1==1) - call assert(marr5%data%stride2==4) - call assert(marr5%data%stride3==16) - call assert(marr5%data%stride4==64) - call assert(marr5%data%stride5==256) - call assert(marr5%data%index_offset==1+4+16+64+256) - call assert(marr5%data%num_elements==1024) - - ! obtain host data as Fortran pointer - call gpufort_array_hostptr(marr5,host_array_5) - do n = 1,5 - call assert(size(host_array_5,n) == 4) - call assert(lbound(host_array_5,n) == -1) - end do - !call assert(c_loc(host_array_5) == marr5%data%data_host) - - ! obtain device data as Fortran pointer - call gpufort_array_deviceptr(marr5,device_array_5) - do n = 1,5 - call assert(size(device_array_5,n) == 4) - call assert(lbound(device_array_5,n) == -1) - end do - !call assert(c_loc(device_array_5) == marr5%data%data_dev) - - ! destroy - call hipCheck(gpufort_array_destroy(marr3,c_null_ptr)) - call hipCheck(gpufort_array_destroy(marr4,c_null_ptr)) - call hipCheck(gpufort_array_destroy(marr5,c_null_ptr)) - end subroutine - - subroutine test_hip_interfacing() - use gpufort_array - use hipfort_check - use hipfort - implicit none - ! - interface - subroutine launch_fill_int_array_1(arr) & - bind(c,name="launch_fill_int_array_1") - use gpufort_array - type(gpufort_array1),intent(inout) :: arr - end subroutine - subroutine launch_fill_int_array_2(arr) & - bind(c,name="launch_fill_int_array_2") - use gpufort_array - type(gpufort_array2),intent(inout) :: arr - end subroutine - subroutine launch_fill_int_array_3(arr) & - bind(c,name="launch_fill_int_array_3") - use gpufort_array - type(gpufort_array3),intent(inout) :: arr - end subroutine - end interface - ! - type(gpufort_array1) :: int_marr1 - type(gpufort_array2) :: int_marr2 - type(gpufort_array3) :: int_marr3 - ! - integer(c_int),target :: int_array_1(-1:8) - integer(c_int),target :: int_array_2(-1:8,-2:7) - integer(c_int),target :: int_array_3(-1:8,-2:7,-3:6) - ! - integer :: i,j,k,n - - ! - ! PART 2: Interfacing - ! - call hipCheck(gpufort_array_init(int_marr1,& - int_array_1, lbounds=lbound(int_array_1))) - call hipCheck(gpufort_array_init(int_marr2,& - int_array_2, lbounds=lbound(int_array_2))) - call hipCheck(gpufort_array_init(int_marr3,& - int_array_3, lbounds=lbound(int_array_3))) - - ! call C code - call launch_fill_int_array_1(int_marr1) - call launch_fill_int_array_2(int_marr2) - call launch_fill_int_array_3(int_marr3) - - ! copy data to host - call hipCheck(gpufort_array_copy_to_host(int_marr1,c_null_ptr)) - call hipCheck(gpufort_array_copy_to_host(int_marr2,c_null_ptr)) - call hipCheck(gpufort_array_copy_to_host(int_marr3,c_null_ptr)) - - ! check - call hipCheck(hipDeviceSynchronize()) - - n=0 - do i = -1,8 - call assert(int_array_1(i) == n) - n = n +1 - end do - n=0 - do j = -2,7 - do i = -1,8 - call assert(int_array_2(i,j) == n) - n = n +1 - end do - end do - n=0 - do k = -3,6 - do j = -2,7 - do i = -1,8 - call assert(int_array_3(i,j,k) == n) - n = n +1 - end do - end do - end do - - ! destroy - call hipCheck(gpufort_array_destroy(int_marr1,c_null_ptr)) - call hipCheck(gpufort_array_destroy(int_marr2,c_null_ptr)) - call hipCheck(gpufort_array_destroy(int_marr3,c_null_ptr)) - end subroutine -end program \ No newline at end of file diff --git a/test/gpufort_array/test_gpufort_arrays_kernels.hip.cpp b/test/gpufort_array/test_gpufort_arrays_kernels.hip.cpp deleted file mode 100644 index d12df72e..00000000 --- a/test/gpufort_array/test_gpufort_arrays_kernels.hip.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "hip/hip_runtime.h" -#include "hip/hip_runtime_api.h" - -#include "gpufort_array.h" - -__global__ void fill_int_array_1( - gpufort::array1 arr -) { - int i = -1+threadIdx.x + blockDim.x*blockIdx.x; - if ( (i+1) < 10 ) { - arr(i) = arr.linearized_index(i); - //printf("%d\n",arr(i)); - } -} - -__global__ void fill_int_array_2( - gpufort::array2 arr -) { - int i = -1+threadIdx.x + blockDim.x*blockIdx.x; - int j = -2+threadIdx.y + blockDim.y*blockIdx.y; - if ( (i+1) < 10 && (j+2) < 10 ) { - arr(i,j) = arr.linearized_index(i,j); - } -} - -__global__ void fill_int_array_3( - gpufort::array3 arr -) { - int i = -1+threadIdx.x + blockDim.x*blockIdx.x; - int j = -2+threadIdx.y + blockDim.y*blockIdx.y; - int k = -3+threadIdx.z + blockDim.z*blockIdx.z; - if ( (i+1) < 10 && (j+2) < 10 && (k+3) < 10 ) { - arr(i,j,k) = arr.linearized_index(i,j,k); - } -} - -extern "C" { - void launch_fill_int_array_1(gpufort::array1 arr) { - hipLaunchKernelGGL(fill_int_array_1,dim3(1),dim3(10,1,1),0,nullptr,arr); - } - void launch_fill_int_array_2(gpufort::array2 arr) { - hipLaunchKernelGGL(fill_int_array_2,dim3(1),dim3(10,10,1),0,nullptr,arr); - } - void launch_fill_int_array_3(gpufort::array3 arr) { - hipLaunchKernelGGL(fill_int_array_3,dim3(1),dim3(10,10,10),0,nullptr,arr); - } -} \ No newline at end of file From 42077ae27fa327a5b55b075ccea9f877a3cdf42b Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 18 Nov 2021 05:55:04 -0500 Subject: [PATCH 53/67] studies/gf*/interop*: Add c_funptr callback example --- studies/gfortran/interoperability/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/studies/gfortran/interoperability/Makefile b/studies/gfortran/interoperability/Makefile index 4591254d..7604d3ae 100644 --- a/studies/gfortran/interoperability/Makefile +++ b/studies/gfortran/interoperability/Makefile @@ -1,4 +1,4 @@ -TEST ?= nested-types +TEST ?= nested-types callbacks DEPS ?= nested-types.cpp SOURCES ?= $(TEST).f90 $(DEPS) DEPS_OBJ = $(DEPS:.cpp=.o) From dc31f29683ea3d167b8521095ac6df31ffd05302 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 18 Nov 2021 07:24:22 -0500 Subject: [PATCH 54/67] Add previously missing file --- .../gfortran/interoperability/callbacks.f90 | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 studies/gfortran/interoperability/callbacks.f90 diff --git a/studies/gfortran/interoperability/callbacks.f90 b/studies/gfortran/interoperability/callbacks.f90 new file mode 100644 index 00000000..65d14478 --- /dev/null +++ b/studies/gfortran/interoperability/callbacks.f90 @@ -0,0 +1,56 @@ +program callbacks + use iso_c_binding + implicit none + ! + type custom_type_t + integer, allocatable :: buffer(:) + end type + ! + type record_t + type(c_ptr) :: ptr = c_null_ptr + type(c_funptr) :: destructor = c_null_funptr + end type + ! + type(custom_type_t),target :: custom_type + type(record_t) :: record + ! + allocate(custom_type%buffer(10)) + record%ptr=c_loc(custom_type) + record%destructor=c_funloc(destructor) + call call_destructor(record) + + record%destructor = c_null_funptr + call call_destructor(record) +contains + +subroutine destructor(cptr) + use iso_c_binding + implicit none + type(c_ptr),intent(in) :: cptr + type(custom_type_t),pointer :: custom_type + call c_f_pointer(cptr,custom_type) + print *, "destructor of `custom_type_t`" + print *, "deallocate buffer of len ",size(custom_type%buffer) + deallocate(custom_type%buffer) +end subroutine + +subroutine call_destructor(record) + implicit none + type(record_t),intent(inout) :: record + interface + subroutine destroy(cptr) + use iso_c_binding + implicit none + type(c_ptr),intent(in) :: cptr + end subroutine + end interface + procedure(destroy),pointer :: callback + if ( c_associated(record%destructor) ) then + call c_f_procpointer(record%destructor,callback) + call callback(record%ptr) + else + print *, "destructor pointer not c_associated" + endif +end subroutine + +end program From 513ef89114d64d9c51d49c212c3ffac1863ad5bb Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 18 Nov 2021 17:19:42 -0500 Subject: [PATCH 55/67] gpufort_array: Introduce explicit async routines * Refactor init/wrap/destroy/copy_to* routines to have blocking memcpy operations; remove stream argument. * Introduce additional init_async/wrap_async/destroy_async/copy_to*_async routines with non-blocking memcpy operations. --- .../vector-add-hipmalloc/vector-add.f90 | 3 +- .../main-kernels.hip.cpp | 7 +- .../vector-add.f90 | 15 ++- .../gpufort_array/vector-add/vector-add.f90 | 13 +- .../templates/gpufort_array.macros.f03 | 117 ++++++++++-------- .../fort2hip/templates/gpufort_array.macros.h | 61 ++++----- .../templates/gpufort_array.template.h | 86 +++++++------ .../test_compile_headers.hip.cpp | 4 +- 8 files changed, 161 insertions(+), 145 deletions(-) diff --git a/examples/gpufort_array/vector-add-hipmalloc/vector-add.f90 b/examples/gpufort_array/vector-add-hipmalloc/vector-add.f90 index 07ec40a8..67e0a968 100644 --- a/examples/gpufort_array/vector-add-hipmalloc/vector-add.f90 +++ b/examples/gpufort_array/vector-add-hipmalloc/vector-add.f90 @@ -20,10 +20,11 @@ program main call launch_vecadd_kernel(grid,tBlock,0,stream,& gpufort_array_wrap_device_ptr(y_d,lbound(y)),a,& gpufort_array_wrap_device_ptr(x_d)) + call hipCheck(hipStreamSynchronize(stream)) call hipCheck(hipMemcpy(y,y_d,hipMemcpyDeviceToHost)) call hipCheck(hipFree(x_d)) call hipCheck(hipFree(y_d)) write(*,*) 'Max error: ', maxval(abs(y-4.0)) -end program main \ No newline at end of file +end program main diff --git a/examples/gpufort_array/vector-add-non-interoperable-types/main-kernels.hip.cpp b/examples/gpufort_array/vector-add-non-interoperable-types/main-kernels.hip.cpp index 353035ae..b2954d9d 100644 --- a/examples/gpufort_array/vector-add-non-interoperable-types/main-kernels.hip.cpp +++ b/examples/gpufort_array/vector-add-non-interoperable-types/main-kernels.hip.cpp @@ -17,15 +17,13 @@ struct mesh_t { gpufort::array1 y; }; -// BEGIN main_26_e28c45 /* HIP C++ implementation of the function/loop body of: !$cuf kernel do(1) <<>> - do i=1,size(y,1) - y(i) = y(i) + a*xi + do i=1,size(mesh%y,1) + mesh%y(i) = mesh%y(i) + mesh%a*mesh%x(i)%val end do - */ __global__ void vecadd_kernel(mesh_t mesh) { @@ -49,5 +47,4 @@ extern "C" void launch_vecadd_kernel_auto_( // launch kernel hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, mesh); } -// END vecadd_kernel #endif // __KERNELS_HIP_CPP__ diff --git a/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 b/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 index 023e7745..a9f3e873 100644 --- a/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 +++ b/examples/gpufort_array/vector-add-non-interoperable-types/vector-add.f90 @@ -33,13 +33,12 @@ program main ! type(mesh_t) :: mesh_orig type(mesh_t_interop) :: mesh_interop - type(c_ptr) :: stream = c_null_ptr ! call init_orig_type() call init_interop_type() - call launch_vecadd_kernel_auto(0,stream,mesh_interop) + call launch_vecadd_kernel_auto(0,c_null_ptr,mesh_interop) call destroy_interop_type() @@ -75,15 +74,15 @@ subroutine init_interop_type() ! Copy to device; from non-interop type to interop type ! REQ: Need to know mesh_orig for value assignment - call c_f_pointer(mesh_interop%x%data%data_host,mesh_t_interop_x,shape=shape(mesh_orig%x)) + call c_f_pointer(mesh_interop%x%data%data_host,& + mesh_t_interop_x,shape=shape(mesh_orig%x)) mesh_t_interop_x(:)%val = mesh_orig%x(:)%val ! depends on members & rank - call hipCheck(gpufort_array_copy_to_device(mesh_interop%x,stream)) + call hipCheck(gpufort_array_copy_to_device(mesh_interop%x)) ! Init basic datatype array call hipCheck(gpufort_array_init(mesh_interop%y,mesh_orig%y,& alloc_mode=gpufort_array_wrap_host_alloc_device,& - sync_mode=gpufort_array_sync_copy,& - stream=stream)) + sync_mode=gpufort_array_sync_copy)) mesh_interop%a = mesh_orig%a end subroutine @@ -92,7 +91,7 @@ subroutine destroy_interop_type() use gpufort_array use iso_c_binding implicit none - call hipCheck(gpufort_array_destroy(mesh_interop%x,stream)) - call hipCheck(gpufort_array_destroy(mesh_interop%y,stream)) + call hipCheck(gpufort_array_destroy(mesh_interop%x)) + call hipCheck(gpufort_array_destroy(mesh_interop%y)) end subroutine end program main diff --git a/examples/gpufort_array/vector-add/vector-add.f90 b/examples/gpufort_array/vector-add/vector-add.f90 index 6a970a4d..dbe6c10b 100644 --- a/examples/gpufort_array/vector-add/vector-add.f90 +++ b/examples/gpufort_array/vector-add/vector-add.f90 @@ -16,15 +16,16 @@ program main call hipCheck(gpufort_array_init(y_d,y)) x = 1.0; y = 2.0; a = 2.0 - call hipCheck(gpufort_array_copy_to_device(x_d,stream)) - call hipCheck(gpufort_array_copy_to_device(y_d,stream)) + call hipCheck(gpufort_array_copy_to_device(x_d)) + call hipCheck(gpufort_array_copy_to_device(y_d)) call launch_vecadd_kernel(grid,tBlock,0,stream,y_d,a,x_d) + call hipCheck(hipStreamSynchronize(stream)) - call hipCheck(gpufort_array_copy_to_host(y_d,stream)) + call hipCheck(gpufort_array_copy_to_host(y_d)) - call hipCheck(gpufort_array_destroy(x_d,stream)) - call hipCheck(gpufort_array_destroy(y_d,stream)) + call hipCheck(gpufort_array_destroy(x_d)) + call hipCheck(gpufort_array_destroy(y_d)) write(*,*) 'Max error: ', maxval(abs(y-4.0)) -end program main \ No newline at end of file +end program main diff --git a/python/fort2hip/templates/gpufort_array.macros.f03 b/python/fort2hip/templates/gpufort_array.macros.f03 index 455d8e0e..86de0dcd 100644 --- a/python/fort2hip/templates/gpufort_array.macros.f03 +++ b/python/fort2hip/templates/gpufort_array.macros.f03 @@ -89,60 +89,58 @@ {% set routine = "init" %} {% set binding = f_array+"_"+routine %} {% set size_dims = ",dimension("+rank|string+")" %} -function {{binding}}_host(& +{% for async_suffix in ["_async",""] %} +{% set is_async = async_suffix == "_async" %} +function {{binding}}{{async_suffix}}_host(& mapped_array,& bytes_per_element,& sizes,lbounds,& - alloc_mode,sync_mode,stream) result(ierr) + {{"stream," if is_async}}alloc_mode,sync_mode) result(ierr) use iso_c_binding use hipfort_enums implicit none type({{f_array}}),intent(inout) :: mapped_array integer(c_int){{size_dims}},intent(in) :: sizes - integer(c_int){{size_dims}},intent(in),optional :: lbounds + integer(c_int){{size_dims}},intent(in),optional :: lbounds{{" + type(c_ptr),intent(in) :: stream" if is_async}} integer(c_int),intent(in) :: bytes_per_element integer(kind(gpufort_array_wrap_host_wrap_device)),intent(in),optional :: alloc_mode integer(kind(gpufort_array_sync_none)),intent(in),optional :: sync_mode - type(c_ptr),intent(in),optional :: stream ! integer(kind(hipSuccess)) :: ierr ! integer(c_int),dimension({{rank}}) :: opt_lbounds integer(kind(gpufort_array_wrap_host_wrap_device)) :: opt_alloc_mode integer(kind(gpufort_array_sync_none)) :: opt_sync_mode - type(c_ptr) :: opt_stream ! opt_lbounds = 1 opt_alloc_mode = gpufort_array_alloc_host_alloc_device ! allocate both by default opt_sync_mode = gpufort_array_sync_none - opt_stream = c_null_ptr if ( present(lbounds) ) opt_lbounds = lbounds if ( present(alloc_mode) ) opt_alloc_mode = alloc_mode if ( present(sync_mode) ) opt_sync_mode = sync_mode - if ( present(stream) ) opt_stream = stream - ierr = {{binding}}(& + ierr = {{binding}}{{async_suffix}}(& mapped_array,& bytes_per_element,& c_null_ptr,c_null_ptr, & sizes, opt_lbounds,& - opt_alloc_mode, opt_sync_mode, opt_stream) + {{"stream," if is_async}}opt_alloc_mode, opt_sync_mode ) end function {% for tuple in datatypes %} -function {{binding}}_{{tuple.f_kind}}(& +function {{binding}}{{async_suffix}}_{{tuple.f_kind}}(& mapped_array,& data_host,lbounds,& - data_dev,& - alloc_mode,sync_mode,stream) result(ierr) + {{"stream," if is_async}}data_dev,alloc_mode,sync_mode) result(ierr) use iso_c_binding use hipfort_enums implicit none type({{f_array}}),intent(inout) :: mapped_array {{tuple.f_type}},intent(in),target,dimension(:{% for i in range(1,rank) %},:{% endfor %}) :: data_host - integer(c_int){{size_dims}},intent(in),optional :: lbounds + integer(c_int){{size_dims}},intent(in),optional :: lbounds{{" + type(c_ptr),intent(in) :: stream" if is_async}} type(c_ptr),intent(in),optional :: data_dev integer(kind(gpufort_array_wrap_host_wrap_device)),intent(in),optional :: alloc_mode integer(kind(gpufort_array_sync_none)),intent(in),optional :: sync_mode - type(c_ptr),intent(in),optional :: stream ! integer(kind(hipSuccess)) :: ierr ! @@ -150,27 +148,25 @@ type(c_ptr) :: opt_data_dev integer(kind(gpufort_array_wrap_host_wrap_device)) :: opt_alloc_mode integer(kind(gpufort_array_sync_none)) :: opt_sync_mode - type(c_ptr) :: opt_stream ! opt_lbounds = 1 opt_data_dev = c_null_ptr opt_alloc_mode = gpufort_array_wrap_host_alloc_device opt_sync_mode = gpufort_array_sync_none - opt_stream = c_null_ptr if ( present(lbounds) ) opt_lbounds = lbounds if ( present(data_dev) ) opt_data_dev = data_dev if ( present(alloc_mode) ) opt_alloc_mode = alloc_mode if ( present(sync_mode) ) opt_sync_mode = sync_mode - if ( present(stream) ) opt_stream = stream - ierr = {{binding}}(& + ierr = {{binding}}{{async_suffix}}(& mapped_array,& int({{tuple.bytes}}, c_int),& c_loc(data_host),opt_data_dev,& shape(data_host), opt_lbounds,& - opt_alloc_mode, opt_sync_mode, opt_stream) + {{"stream," if is_async}}opt_alloc_mode, opt_sync_mode) end function -{% endfor %} -{% endfor %} +{% endfor %}{# datatypes #} +{% endfor %}{# async_suffix #} +{% endfor %}{# rank #} {%- endmacro -%} {# #} {# #} @@ -185,9 +181,11 @@ {% set size_dims = ",dimension("+rank|string+")" %} {% for tuple in datatypes %} {% for dev in ["","_cptr"] %} -function {{f_array}}_wrap_{{tuple.f_kind}}{{dev}}(& +{% for async_suffix in ["_async",""] %} +{% set is_async = async_suffix == "_async" %} +function {{f_array}}_wrap{{async_suffix}}_{{tuple.f_kind}}{{dev}}(& data_host,data_dev,lbounds,& - sync_mode,stream,ierr) result(mapped_array) + {{"stream," if is_async}}sync_mode,ierr) result(mapped_array) use iso_c_binding use hipfort_enums implicit none @@ -197,38 +195,36 @@ {% else %} {{tuple.f_type}},intent(in),target,dimension(:{% for i in range(1,rank) %},:{% endfor %}) :: data_dev {% endif %} - integer(c_int){{size_dims}},intent(in),optional :: lbounds - integer(kind(gpufort_array_sync_none)),intent(in),optional :: sync_mode - type(c_ptr),intent(in),optional :: stream + integer(c_int){{size_dims}},intent(in),optional :: lbounds{{" + type(c_ptr),intent(in) :: stream" if is_async}} + integer(kind(gpufort_array_sync_none)),intent(in),optional :: sync_mode integer(kind(hipSuccess)),intent(inout),optional :: ierr ! type({{f_array}}) :: mapped_array ! integer(c_int),dimension({{rank}}) :: opt_lbounds integer(kind(gpufort_array_sync_none)) :: opt_sync_mode - type(c_ptr) :: opt_stream integer(kind(hipSuccess)) :: opt_ierr ! opt_lbounds = 1 opt_sync_mode = gpufort_array_sync_none - opt_stream = c_null_ptr if ( present(lbounds) ) opt_lbounds = lbounds if ( present(sync_mode) ) opt_sync_mode = sync_mode - if ( present(stream) ) opt_stream = stream {% if dev == "_cptr" %} {% set data_dev_arg = "data_dev" %} {% else %} {% set data_dev_arg = "c_loc(data_dev)" %} {% endif %} - opt_ierr = {{binding}}(& + opt_ierr = {{binding}}{{async_suffix}}(& mapped_array,& int({{tuple.bytes}}, c_int),& c_loc(data_host),{{data_dev_arg}},& - shape(data_host), opt_lbounds,& + shape(data_host), opt_lbounds {{",stream" if is_async}},& gpufort_array_wrap_host_wrap_device,& - opt_sync_mode,opt_stream) + opt_sync_mode) if ( present(ierr) ) ierr = opt_ierr end function +{% endfor %}{# async #} {% endfor %} {% endfor %} {% set routine = "init" %} @@ -289,7 +285,7 @@ c_null_ptr,c_loc(data_dev),& shape(data_dev), opt_lbounds,& gpufort_array_wrap_host_wrap_device,& - gpufort_array_sync_none,c_null_ptr) + gpufort_array_sync_none) if ( present(ierr) ) ierr = opt_ierr end function {% endfor %} @@ -304,17 +300,19 @@ {% set routine = "init" %} {% set iface = prefix+"_"+routine %} !> Initialize a gpufort_array of a rank that matches that of the input data. -interface {{iface}} +{% for async_suffix in ["_async",""] %} +{% set is_async = async_suffix == "_async" %} +interface {{iface}}{{async_suffix}} {% for rank in range(1,max_rank_ub) %} {% set size_dims = ",dimension("+rank|string+")" %} {% set f_array = prefix+rank|string %} {% set binding = f_array+"_"+routine %} - function {{binding}} (& + function {{binding}}{{async_suffix}} (& mapped_array,& bytes_per_element,& data_host,data_dev,& sizes, lbounds,& - alloc_mode,sync_mode,stream) & + {{"stream," if is_async}}alloc_mode,sync_mode) & bind(c,name="{{binding}}") & result(ierr) use iso_c_binding @@ -328,8 +326,8 @@ type(c_ptr),intent(in),value :: data_host, data_dev integer(c_int){{size_dims}},intent(in) :: sizes, lbounds integer(kind(gpufort_array_wrap_host_wrap_device)),intent(in),value :: alloc_mode - integer(kind(gpufort_array_sync_none)),intent(in),value :: sync_mode - type(c_ptr),intent(in),value :: stream + integer(kind(gpufort_array_sync_none)),intent(in),value :: sync_mode{{" + type(c_ptr),intent(in),value :: stream" if is_async}} ! integer(kind(hipSuccess)) :: ierr end function @@ -338,19 +336,22 @@ {% for rank in range(1,max_rank_ub) %} {% set f_array = prefix+rank|string %} {% set binding = f_array+"_"+routine %} - {{binding}}_host,& + {{binding}}{{async_suffix}}_host,& {% for tuple in datatypes %} - {{binding}}_{{tuple.f_kind}}{{",&\n" if not loop.last}}{% endfor %}{{",&" if not loop.last}} + {{binding}}{{async_suffix}}_{{tuple.f_kind}}{{",&\n" if not loop.last}}{% endfor %}{{",&" if not loop.last}} {% endfor %} end interface +{% endfor %}{# async_suffix #} +{% for async_suffix in ["_async",""] %} +{% set is_async = async_suffix == "_async" %} {% set routine = "wrap" %} {% set iface = prefix+"_"+routine %} !> Wrap a Fortran or type(c_ptr) pointer pair that points to host and device data. !> Only wrap, allocate nothing, !> and do not synchronize at initialization or destruction time. !> \return gpufort_array of a rank that matches that of the input data. -interface {{iface}} +interface {{iface}}{{async_suffix}} module procedure :: &{{"\n"}} {%- for rank in range(1,max_rank_ub) -%} {%- set size_dims = ",dimension("+rank|string+")" -%} @@ -358,11 +359,12 @@ {%- set binding = f_array+"_"+routine -%} {%- for tuple in datatypes -%} {%- for dev in ["","_cptr"] -%} -{{binding | indent(6,True)}}_{{tuple.f_kind}}{{dev}}{{",&\n" if not loop.last}} +{{binding | indent(6,True)}}{{async_suffix}}_{{tuple.f_kind}}{{dev}}{{",&\n" if not loop.last}} {%- endfor -%}{{",&\n" if not loop.last}} {%- endfor -%}{{",&\n" if not loop.last}} {%- endfor %}{{""}} end interface +{% endfor %}{# async_suffix #} {% set routine = "wrap_device_ptr" %} {% set iface = prefix+"_"+routine %} @@ -384,53 +386,60 @@ {% endfor %} end interface +{% for async_suffix in ["_async",""] %} +{% set is_async = async_suffix == "_async" %} {% for routine in ["destroy","copy_to_host","copy_to_device"] %} {% set iface = prefix+"_"+routine %} -interface {{iface}} +interface {{iface}}{{async_suffix}} {% for rank in range(1,max_rank_ub) %} {% set f_array = prefix+rank|string %} {% set binding = f_array+"_"+routine %} - function {{binding}} (mapped_array,stream) & + function {{binding}}{{async_suffix}} (mapped_array{{",stream" if is_async}}) & bind(c,name="{{binding}}") & result(ierr) use iso_c_binding use hipfort_enums import {{f_array}} implicit none - type({{f_array}}),intent(inout) :: mapped_array - type(c_ptr),value,intent(in) :: stream + type({{f_array}}),intent(inout) :: mapped_array{{" + type(c_ptr),value,intent(in) :: stream" if is_async}} integer(kind(hipSuccess)) :: ierr end function {% endfor %} end interface {% endfor %} -{% set routine = "inc_num_refs" %} +{% set routine = "dec_num_refs" %} {% set iface = prefix+"_"+routine %} -interface {{iface}} +interface {{iface}}{{async_suffix}} {% for rank in range(1,max_rank_ub) %} {% set f_array = prefix+rank|string %} {% set binding = f_array+"_"+routine %} - function {{binding}} (mapped_array) & + function {{binding}}{{async_suffix}}(& + mapped_array,destroy_if_zero_refs{{",& + stream" if is_async}}) & bind(c,name="{{binding}}") & result(ierr) use iso_c_binding use hipfort_enums import {{f_array}} implicit none - type({{f_array}}),intent(inout) :: mapped_array + type({{f_array}}),intent(inout) :: mapped_array{{" + type(c_ptr),value,intent(in) :: stream" if is_async}} + logical(c_bool),intent(in),value :: destroy_if_zero_refs integer(kind(hipSuccess)) :: ierr end function {% endfor %} end interface +{% endfor %}{# async_suffix #} -{% set routine = "dec_num_refs" %} +{% set routine = "inc_num_refs" %} {% set iface = prefix+"_"+routine %} interface {{iface}} {% for rank in range(1,max_rank_ub) %} {% set f_array = prefix+rank|string %} {% set binding = f_array+"_"+routine %} - function {{binding}} (mapped_array,destroy_if_zero_refs) & + function {{binding}} (mapped_array) & bind(c,name="{{binding}}") & result(ierr) use iso_c_binding @@ -438,9 +447,9 @@ import {{f_array}} implicit none type({{f_array}}),intent(inout) :: mapped_array - logical(c_bool),intent(in),value :: destroy_if_zero_refs integer(kind(hipSuccess)) :: ierr end function {% endfor %} end interface -{%- endmacro -%} \ No newline at end of file + +{%- endmacro -%} diff --git a/python/fort2hip/templates/gpufort_array.macros.h b/python/fort2hip/templates/gpufort_array.macros.h index 5c1a1473..8da758ee 100644 --- a/python/fort2hip/templates/gpufort_array.macros.h +++ b/python/fort2hip/templates/gpufort_array.macros.h @@ -8,64 +8,67 @@ extern "C" { {% for rank in range(1,max_rank+1) %} {% set c_type = "char" %} {% set c_prefix = "gpufort_array"+rank|string %} - __host__ hipError_t {{c_prefix}}_init ( +{% for async_suffix in ["_async",""] %} +{% set is_async = async_suffix == "_async" %} + __host__ hipError_t {{c_prefix}}_init{{async_suffix}} ( gpufort::array{{rank}}<{{c_type}}>* array, int bytes_per_element, {{c_type}}* data_host, {{c_type}}* data_dev, int* sizes, - int* lower_bounds, + int* lower_bounds,{{" + hipStream_t stream," if is_async}} gpufort::AllocMode alloc_mode, - gpufort::SyncMode sync_mode, - hipStream_t stream + gpufort::SyncMode sync_mode ) { - return array->init( + return array->init{{async_suffix}}( bytes_per_element, data_host, data_dev, sizes, lower_bounds, - alloc_mode, sync_mode, stream + {{"stream," if is_async}}alloc_mode, sync_mode ); } - __host__ hipError_t {{c_prefix}}_destroy( - gpufort::array{{rank}}<{{c_type}}>* array, - hipStream_t stream = nullptr - ) { - return array->destroy(stream); - } - - __host__ hipError_t {{c_prefix}}_copy_to_host ( - gpufort::array{{rank}}<{{c_type}}>* array, - hipStream_t stream = nullptr + __host__ hipError_t {{c_prefix}}_destroy{{async_suffix}}( + gpufort::array{{rank}}<{{c_type}}>* array{{", + hipStream_t stream" if is_async}} ) { - return array->copy_to_host(stream); + return array->destroy{{async_suffix}}({{"stream" if is_async}}); } - __host__ hipError_t {{c_prefix}}_copy_to_device ( - gpufort::array{{rank}}<{{c_type}}>* array, - hipStream_t stream = nullptr + __host__ hipError_t {{c_prefix}}_copy_to_host{{async_suffix}} ( + gpufort::array{{rank}}<{{c_type}}>* array{{", + hipStream_t stream" if is_async}} ) { - return array->copy_to_device(stream); + return array->copy_to_host{{async_suffix}}({{"stream" if is_async}}); } - __host__ void {{c_prefix}}_inc_num_refs( - gpufort::array{{rank}}<{{c_type}}>* array + __host__ hipError_t {{c_prefix}}_copy_to_device{{async_suffix}} ( + gpufort::array{{rank}}<{{c_type}}>* array{{", + hipStream_t stream" if is_async}} ) { - array->num_refs += 1; + return array->copy_to_device{{async_suffix}}({{"stream" if is_async}}); } - __host__ hipError_t {{c_prefix}}_dec_num_refs( + __host__ hipError_t {{c_prefix}}_dec_num_refs{{async_suffix}}( gpufort::array{{rank}}<{{c_type}}>* array, - bool destroy_if_zero_refs, - hipStream_t stream = nullptr + bool destroy_if_zero_refs{{", + hipStream_t stream" if is_async}} ) { array->num_refs -= 1; if ( destroy_if_zero_refs && array->num_refs == 0 ) { - return array->destroy(stream); + return array->destroy{{async_suffix}}({{"stream" if is_async}}); } { return hipSuccess; } } {% endfor %} + + __host__ void {{c_prefix}}_inc_num_refs( + gpufort::array{{rank}}<{{c_type}}>* array + ) { + array->num_refs += 1; + } +{% endfor %} } // extern "C" -{%- endmacro -%} \ No newline at end of file +{%- endmacro -%} diff --git a/python/fort2hip/templates/gpufort_array.template.h b/python/fort2hip/templates/gpufort_array.template.h index 2f55ccb1..1ac07b91 100644 --- a/python/fort2hip/templates/gpufort_array.template.h +++ b/python/fort2hip/templates/gpufort_array.template.h @@ -234,6 +234,8 @@ namespace gpufort { // do nothing } +{% for async_suffix in ["_async",""] %} +{% set is_async = async_suffix == "_async" %} /** * Initialize. * \param[in] data_host host data pointer (may be nullptr; see the note). @@ -245,14 +247,15 @@ namespace gpufort { * the new hostpotr is allocated via hipHostMalloc. * Otherwise, it is allocated via classic malloc. */ - __host__ hipError_t init( + __host__ hipError_t init{{async_suffix}}( int bytes_per_element, T* data_host, T* data_dev, -{{ gm.bound_args_single_line("int ",rank) | indent(8,True) }}, +{{ gm.bound_args_single_line("int ",rank) | indent(8,True) }},{{" + hipStream_t stream," if is_async}} AllocMode alloc_mode = AllocMode::WrapHostAllocDevice, - SyncMode sync_mode = SyncMode::None, - hipStream_t stream = nullptr) { + SyncMode sync_mode = SyncMode::None + ) { this->data.wrap( data_host, data_dev, @@ -285,7 +288,7 @@ namespace gpufort { // do nothing as already set by data.wrap call break; default: - std::cerr << "ERROR: gpufort::Array{{rank}}::init(...): Unexpected value for 'this->alloc_mode': " + std::cerr << "ERROR: gpufort::Array{{rank}}::init{{async_suffix}}(...): Unexpected value for 'this->alloc_mode': " << static_cast(this->alloc_mode) << std::endl; std::terminate(); break; @@ -317,14 +320,14 @@ namespace gpufort { break; case SyncMode::Copy: case SyncMode::Copyin: - ierr = this->copy_to_device(stream); + ierr = this->copy_to_device{{async_suffix}}({{"stream" if is_async}}); break; case SyncMode::InvertedCopy: case SyncMode::InvertedCopyin: - ierr = this->copy_to_host(stream); + ierr = this->copy_to_host{{async_suffix}}({{"stream" if is_async}}); break; default: - std::cerr << "ERROR: gpufort::Array{{rank}}::destroy(...): Unexpected value for 'sync_mode': " + std::cerr << "ERROR: gpufort::Array{{rank}}::init{{async_suffix}}(...): Unexpected value for 'sync_mode': " << static_cast(sync_mode) << std::endl; std::terminate(); break; @@ -332,23 +335,24 @@ namespace gpufort { } return ierr; } - - __host__ hipError_t init( + + __host__ hipError_t init{{async_suffix}}( int bytes_per_element, T* data_host, T* data_dev, int* sizes, - int* lower_bounds, + int* lower_bounds,{{" + hipStream_t stream," if is_async}} AllocMode alloc_mode = AllocMode::WrapHostAllocDevice, - SyncMode sync_mode = SyncMode::None, - hipStream_t stream = nullptr) { - return this->init( + SyncMode sync_mode = SyncMode::None + ) { + return this->init{{async_suffix}}( bytes_per_element, data_host, data_dev, sizes[0],{% for d in range(1,rank) %}sizes[{{d}}],{% endfor %}{{""}} - lower_bounds[0],{% for d in range(1,rank) %}lower_bounds[{{d}}],{% endfor %}{{""}} - alloc_mode,sync_mode,stream); + lower_bounds[0],{% for d in range(1,rank) %}lower_bounds[{{d}}],{% endfor %}{{""}}{{" + stream," if is_async}}alloc_mode,sync_mode); } /** @@ -358,18 +362,18 @@ namespace gpufort { * is used instead of free to deallocate * the host data. */ - __host__ hipError_t destroy(hipStream_t stream) { + __host__ hipError_t destroy{{async_suffix}}({{"hipStream_t stream" if is_async}}) { hipError_t ierr = hipSuccess; if ( bytes_per_element > 0 ) { // synchronize host/device switch (this->sync_mode) { case SyncMode::Copy: case SyncMode::Copyout: - ierr = this->copy_to_host(stream); + ierr = this->copy_to_host{{async_suffix}}({{"stream"if is_async}}); break; case SyncMode::InvertedCopy: case SyncMode::InvertedCopyout: - ierr = this->copy_to_device(stream); + ierr = this->copy_to_device{{async_suffix}}({{"stream"if is_async}}); break; case SyncMode::None: case SyncMode::Copyin: @@ -377,7 +381,7 @@ namespace gpufort { // do nothing break; default: - std::cerr << "ERROR: gpufort::Array{{rank}}::destroy(...): Unexpected value for 'sync_mode': " + std::cerr << "ERROR: gpufort::Array{{rank}}::destroy{{async_suffix}}(...): Unexpected value for 'sync_mode': " << static_cast(sync_mode) << std::endl; std::terminate(); break; @@ -403,7 +407,7 @@ namespace gpufort { case AllocMode::WrapHostAllocDevice: break; default: - std::cerr << "ERROR: gpufort::Array{{rank}}::destroy(...): Unexpected value for 'alloc_mode': " + std::cerr << "ERROR: gpufort::Array{{rank}}::destroy{{async_suffix}}(...): Unexpected value for 'alloc_mode': " << static_cast(alloc_mode) << std::endl; std::terminate(); break; @@ -435,40 +439,36 @@ namespace gpufort { return ierr; } - __host__ size_t num_data_bytes() { - return this->data.num_elements * this->bytes_per_element; - } - /** * Copy host data to the device. * \return Array code returned by the underlying hipMemcpy operation. */ - __host__ hipError_t copy_to_host(hipStream_t stream = nullptr) { + __host__ hipError_t copy_to_host{{async_suffix}}({{"hipStream_t stream" if is_async}}) { #ifndef __HIP_DEVICE_COMPILE__ assert(this->data.data_host!=nullptr); assert(this->data.data_dev!=nullptr); #endif - return hipMemcpyAsync( + return hipMemcpy{{"Async" if is_async}}( (void*) this->data.data_host, (void*) this->data.data_dev, this->num_data_bytes(), - hipMemcpyDeviceToHost, stream); + hipMemcpyDeviceToHost{{", stream" if is_async}}); } /** * Copy device data to the host. * \return Array code returned by the underlying hipMemcpy operation. */ - __host__ hipError_t copy_to_device(hipStream_t stream = nullptr) { + __host__ hipError_t copy_to_device{{async_suffix}}({{"hipStream_t stream" if is_async}}) { #ifndef __HIP_DEVICE_COMPILE__ assert(this->data.data_host!=nullptr); assert(this->data.data_dev!=nullptr); #endif - return hipMemcpyAsync( + return hipMemcpy{{"Async" if is_async}}( (void*) this->data.data_dev, (void*) this->data.data_host, this->num_data_bytes(), - hipMemcpyHostToDevice, stream); + hipMemcpyHostToDevice{{", stream" if is_async}}); } /** @@ -477,16 +477,16 @@ namespace gpufort { * data_dev & data_host (shallow copy). * \param[in] device_struct device memory address to copy to */ - __host__ hipError_t copy_self_to_device( - gpufort::array{{rank}}* device_struct, - hipStream_t stream = nullptr + __host__ hipError_t copy_self_to_device{{async_suffix}}( + gpufort::array{{rank}}* device_struct{{", + hipStream_t stream" if is_async}} ) { const size_t size = sizeof(array{{rank}}); // sizeof(T*) = sizeof(char*) - return hipMemcpyAsync( + return hipMemcpy{{"Async" if is_async}}( (void*) device_struct, (void*) this, size, - hipMemcpyHostToDevice, stream); + hipMemcpyHostToDevice{{", stream" if is_async}}); } /** @@ -495,18 +495,24 @@ namespace gpufort { * data_dev & data_host (shallow copy). * \param[inout] device_copy pointer to device copy pointer */ - __host__ hipError_t create_device_copy( - gpufort::array{{rank}}** device_copy, - hipStream_t stream = nullptr + __host__ hipError_t create_device_copy{{async_suffix}}( + gpufort::array{{rank}}** device_copy{{", + hipStream_t stream" if is_async}} ) { const size_t size = sizeof(array{{rank}}); // sizeof(T*) = sizeof(char*) hipError_t ierr = hipMalloc((void**)device_copy,size); if ( ierr == hipSuccess ) { - return this->copy_self_to_device(*device_copy,stream); + return this->copy_self_to_device{{async_suffix}}(*device_copy{{",stream" if is_async}}); } else { return ierr; } } +{% endfor %} + + __host__ size_t num_data_bytes() { + return this->data.num_elements * this->bytes_per_element; + } + /** * Linearize multi-dimensional index. diff --git a/test/gpufort_array/test_compile_headers.hip.cpp b/test/gpufort_array/test_compile_headers.hip.cpp index d4740abb..d4804826 100644 --- a/test/gpufort_array/test_compile_headers.hip.cpp +++ b/test/gpufort_array/test_compile_headers.hip.cpp @@ -1,7 +1,7 @@ #include "gpufort.h" #include "gpufort_array.h" -#include "gpufort_reductions.h" +#include "gpufort_reduction.h" int main(int argc,char** argv) { return 0; -} \ No newline at end of file +} From a10983badf8b75d2ce6ed84e7d0fe2ef905886ed Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 18 Nov 2021 17:23:23 -0500 Subject: [PATCH 56/67] exam*/gpufort*/vector-add-interop*: Add example showcasing init of interop type --- .../vector-add-interoperable-types/Makefile | 8 ++ .../main-kernels.hip.cpp | 51 ++++++++++++ .../vector-add.f90 | 81 +++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 examples/gpufort_array/vector-add-interoperable-types/Makefile create mode 100644 examples/gpufort_array/vector-add-interoperable-types/main-kernels.hip.cpp create mode 100644 examples/gpufort_array/vector-add-interoperable-types/vector-add.f90 diff --git a/examples/gpufort_array/vector-add-interoperable-types/Makefile b/examples/gpufort_array/vector-add-interoperable-types/Makefile new file mode 100644 index 00000000..2045fdad --- /dev/null +++ b/examples/gpufort_array/vector-add-interoperable-types/Makefile @@ -0,0 +1,8 @@ +CFLAGS = -g -ggdb + +vector-add: + hipcc $(shell gpufort --cpp_config) $(CFLAGS) -c main-kernels.hip.cpp -o main-kernels.hip.o + hipfc $(shell gpufort --gfortran_config) main-kernels.hip.o vector-add.f90 -o vector-add $(shell gpufort --ldflags) + +clean: + rm -f *.mod *.o vector-add diff --git a/examples/gpufort_array/vector-add-interoperable-types/main-kernels.hip.cpp b/examples/gpufort_array/vector-add-interoperable-types/main-kernels.hip.cpp new file mode 100644 index 00000000..be9b798b --- /dev/null +++ b/examples/gpufort_array/vector-add-interoperable-types/main-kernels.hip.cpp @@ -0,0 +1,51 @@ +// This file was generated by gpufort +#ifndef __KERNELS_HIP_CPP__ +#define __KERNELS_HIP_CPP__ +#include "hip/hip_runtime.h" +#include "hip/hip_complex.h" +#include "gpufort.h" +#include "gpufort_array.h" + +// C++ structs with same layout as Fortran interop types +struct node_t { + float val; +}; + +struct mesh_t { + float a; + gpufort::array1 x; + gpufort::array1 y; +}; + +/* + HIP C++ implementation of the function/loop body of: + + !$cuf kernel do(1) <<>> + do i=1,size(mesh%y,1) + mesh%y(i) = mesh%y(i) + mesh%a*mesh%x(i)%val + end do +*/ + +__global__ void vecadd_kernel(mesh_t mesh) { + int i = 1 + (1)*(threadIdx.x + blockIdx.x * blockDim.x); + if (loop_cond(i,mesh.y.size(1),1)) { + mesh.y(i)= mesh.y(i) + mesh.a*mesh.x(i).val; + } +} + +extern "C" void launch_vecadd_kernel_auto_( + const int& sharedmem, + hipStream_t& stream, + mesh_t& mesh +) { + const int vecadd_kernel_blockX = 128; + dim3 block(vecadd_kernel_blockX); + const int vecadd_kernel_NX = (1 + ((mesh.y.size(1)) - (1))); + const int vecadd_kernel_gridX = divideAndRoundUp( vecadd_kernel_NX, vecadd_kernel_blockX ); + dim3 grid(vecadd_kernel_gridX); + + // launch kernel + hipLaunchKernelGGL((vecadd_kernel), grid, block, sharedmem, stream, mesh); + //mesh.y.print_device_data(std::cout,"prefix",gpufort::PrintMode::PrintCValues); +} +#endif // __KERNELS_HIP_CPP__ diff --git a/examples/gpufort_array/vector-add-interoperable-types/vector-add.f90 b/examples/gpufort_array/vector-add-interoperable-types/vector-add.f90 new file mode 100644 index 00000000..7468981b --- /dev/null +++ b/examples/gpufort_array/vector-add-interoperable-types/vector-add.f90 @@ -0,0 +1,81 @@ +module types + use iso_c_binding + use gpufort_array + + ! interoperable types + type,bind(c) :: node_t + real(c_float) :: val + end type + + type,bind(c) :: mesh_t + real(c_float) :: a + type(gpufort_array1) :: x ! array of type `node_t` + type(gpufort_array1) :: y ! array of type `real(c_float)` + end type +end module + +program main + use types + use hipfort + use hipfort_check + implicit none + integer, parameter :: N = 40000 + ! + type(mesh_t) :: mesh + real(c_float),pointer :: mesh_t_y(:) + ! + call init_mesh() + call gpufort_array_hostptr(mesh%y,mesh_t_y) + + call launch_vecadd_kernel_auto(0,c_null_ptr,mesh) + call hipCheck(gpufort_array_copy_to_host(mesh%y)) + + write(*,*) 'Max error: ', maxval(abs(mesh_t_y-4.0)) + + call destroy_mesh() +contains + subroutine init_mesh() + use gpufort_array + use iso_c_binding + implicit none + integer i + type(node_t) :: node_t_dummy + type(node_t),pointer :: mesh_t_x(:) + real(c_float),pointer :: mesh_t_y(:) + + ! Init scalar + mesh%a = 2.0 + + ! Init basic datatype array member + call hipCheck(gpufort_array_init(mesh%y,& + c_float,sizes=[N],lbounds=[1],& + alloc_mode=gpufort_array_alloc_pinned_host_alloc_device)) + call gpufort_array_hostptr(mesh%y,mesh_t_y) ! Get Fortran pointer to host data (overloaded routine exists for basic datatypes. + ! + mesh_t_y(:) = 2.0 ! Also sets lower bounds. + call hipCheck(gpufort_array_copy_to_device(mesh%y)) + + ! Init struct member. + call hipCheck(gpufort_array_init(mesh%x,& + int(c_sizeof(node_t_dummy),c_int),& + sizes=[N],lbounds=[1],& + alloc_mode=gpufort_array_alloc_pinned_host_alloc_device)) + ! + ! Get Fortran pointer to host data. No overloaded routine exists (must be type-specific). + ! In this case, you must/can set lower bounds manually if they are different from 1 and + ! the initial data is depending on the index. + call c_f_pointer(mesh%x%data%data_host,mesh_t_x,shape=[N]) + !mesh_t_x(1:) => mesh_t_x ! Set lower bounds + mesh_t_x(:)%val = 1 + call hipCheck(gpufort_array_copy_to_device(mesh%x)) + end subroutine + + ! (will be) autogenerated by GPUFORT + subroutine destroy_mesh() + use gpufort_array + use iso_c_binding + implicit none + call hipCheck(gpufort_array_destroy(mesh%x)) + call hipCheck(gpufort_array_destroy(mesh%y)) + end subroutine +end program main From 8ca576a46ece2583afd9b854d9ed898c4d13ea3e Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 25 Nov 2021 04:56:20 -0500 Subject: [PATCH 57/67] test/linemapper: Add multiline directive & singline if tests. --- .../linemapper/test.linemapper.linemapper.py | 52 ++++++++++++++++--- python/test/linemapper/test2.f90 | 3 ++ python/test/linemapper/test3.f90 | 18 +++++++ 3 files changed, 65 insertions(+), 8 deletions(-) create mode 100644 python/test/linemapper/test2.f90 create mode 100644 python/test/linemapper/test3.f90 diff --git a/python/test/linemapper/test.linemapper.linemapper.py b/python/test/linemapper/test.linemapper.linemapper.py index d20ffd0c..e2326c8c 100644 --- a/python/test/linemapper/test.linemapper.linemapper.py +++ b/python/test/linemapper/test.linemapper.linemapper.py @@ -16,7 +16,9 @@ index = [] -class TestIndexer(unittest.TestCase): +class TestLinemapper(unittest.TestCase): + def __clean(self,text): + return text.replace(" ","").replace("\t","").replace("\n","").replace("\r","") def setUp(self): global PROFILING_ENABLE if PROFILING_ENABLE: @@ -80,15 +82,49 @@ def test_1_full_test(self): end program main """ #print(result_lines) + #print(result_raw_statements) #print(result_statements) - #print(result_expanded_statements) - def clean_(text): - return text.replace(" ","").replace("\t","").replace("\n","").replace("\r","") - - self.assertEqual(clean_(result_lines),clean_(testdata_lines)) - self.assertEqual(clean_(result_raw_statements),clean_(testdata_raw_statements)) - self.assertEqual(clean_(result_statements),clean_(testdata_statements)) + self.assertEqual(self.__clean(result_lines),self.__clean(testdata_lines)) + self.assertEqual(self.__clean(result_raw_statements),self.__clean(testdata_raw_statements)) + self.assertEqual(self.__clean(result_statements),self.__clean(testdata_statements)) + def test_2_expand_single_line_if(self): + options = "" + linemaps = linemapper.read_file("test2.f90",options) + result_statements = linemapper.render_file(linemaps,stage="statements") + testdata_statements =\ +""" +program main +if( tha(i,j,k).gt. 1.0 ) then + thrad = -1.0/(12.0*3600.0) +endif +end program +""" + self.assertEqual(self.__clean(result_statements),self.__clean(testdata_statements)) + def test_3_collapse_multiline_acc_directive(self): + options = "" + linemaps = linemapper.read_file("test3.f90",options) + result_statements = linemapper.render_file(linemaps,stage="statements") + testdata_statements =\ +""" +program main +!$acc data copyin(a,b) copyout(c_gpu) +!$acc parallel loop collapse(2) reduction(+:tmp) +do j=1,colsB +do i=1,rowsA +tmp = 0.0 +!$acc loop vector reduction(+:tmp) +do k=1,rowsB +tmp = tmp + a(i,k) * b(k,j) +enddo +c_gpu(i,j) = tmp +enddo +enddo +!$acc end parallel +!$acc end data +end program +""" + self.assertEqual(self.__clean(result_statements),self.__clean(testdata_statements)) if __name__ == '__main__': unittest.main() diff --git a/python/test/linemapper/test2.f90 b/python/test/linemapper/test2.f90 new file mode 100644 index 00000000..d725e3f0 --- /dev/null +++ b/python/test/linemapper/test2.f90 @@ -0,0 +1,3 @@ +program main + if( tha(i,j,k).gt. 1.0 ) thrad = -1.0/(12.0*3600.0) +end program diff --git a/python/test/linemapper/test3.f90 b/python/test/linemapper/test3.f90 new file mode 100644 index 00000000..34cd29a9 --- /dev/null +++ b/python/test/linemapper/test3.f90 @@ -0,0 +1,18 @@ +program main +!$acc data copyin(a,b) copyout(c_gpu) +!$acc parallel loop collapse(2) & +!$acc reduction(+:tmp) +do j=1,colsB +do i=1,rowsA +tmp = 0.0 +!$acc loop vector reduction(+:tmp) +do k=1,rowsB +tmp = tmp & ++ a(i,k) * b(k,j) +enddo +c_gpu(i,j) = tmp +enddo +enddo +!$acc end parallel +!$acc end data +end program From 0675bbf700ae29ea6df81466a815e573f2ce5b67 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 25 Nov 2021 05:52:05 -0500 Subject: [PATCH 58/67] Add previously missing test files. --- test/gpufort_array/test_gpufort_array.hip.cpp | 79 +++++++ .../test_gpufort_array_interop.f03 | 194 ++++++++++++++++++ .../test_gpufort_array_kernels.hip.cpp | 47 +++++ 3 files changed, 320 insertions(+) create mode 100644 test/gpufort_array/test_gpufort_array.hip.cpp create mode 100644 test/gpufort_array/test_gpufort_array_interop.f03 create mode 100644 test/gpufort_array/test_gpufort_array_kernels.hip.cpp diff --git a/test/gpufort_array/test_gpufort_array.hip.cpp b/test/gpufort_array/test_gpufort_array.hip.cpp new file mode 100644 index 00000000..06341d21 --- /dev/null +++ b/test/gpufort_array/test_gpufort_array.hip.cpp @@ -0,0 +1,79 @@ +#include "gpufort.h" +#include "gpufort_array.h" + +#include + +#include "test_gpufort_array_kernels.hip.cpp" + +void test1() { + gpufort::array1 int_array1; + gpufort::array2 int_array2; + gpufort::array3 int_array3; + + HIP_CHECK(int_array1.init(sizeof(int),nullptr,nullptr, 10, -1, + gpufort::AllocMode::AllocPinnedHostAllocDevice)); // hostptr,devptr, count, lower bound, alloc_mode + HIP_CHECK(int_array2.init(sizeof(int),nullptr,nullptr, 10,10, -1,-2, + gpufort::AllocMode::AllocHostAllocDevice)); + HIP_CHECK(int_array3.init(sizeof(int),nullptr,nullptr, 10,10,10, -1,-2,-3, + gpufort::AllocMode::AllocPinnedHostAllocDevice)); + + assert( 10==int_array1.data.num_elements); + assert( 100==int_array2.data.num_elements); + assert(1000==int_array3.data.num_elements); + + assert( 1==int_array1.data.index_offset); + assert( 21==int_array2.data.index_offset); + assert(321==int_array3.data.index_offset); + + assert(0==int_array1.linearized_index(-1)); + assert(0==int_array2.linearized_index(-1,-2)); + assert(0==int_array3.linearized_index(-1,-2,-3)); + + assert( 9==int_array1.linearized_index(-1+10-1)); // upper bound + assert( 99==int_array2.linearized_index(-1+10-1,-2+10-1)); + assert(999==int_array3.linearized_index(-1+10-1,-2+10-1,-3+10-1)); + + launch_fill_int_array_1(int_array1); + launch_fill_int_array_2(int_array2); + launch_fill_int_array_3(int_array3); + + HIP_CHECK(int_array1.copy_to_host()); + HIP_CHECK(int_array2.copy_to_host()); + HIP_CHECK(int_array3.copy_to_host()); + + HIP_CHECK(hipDeviceSynchronize()); + + for (int n = 0; n < int_array1.data.num_elements; n++ ) { + //std::cout << int_array1.data.data_host[n] << std::endl; + assert(int_array1.data.data_host[n] == n); + } + for (int n = 0; n < int_array2.data.num_elements; n++ ) { + assert(int_array2.data.data_host[n] == n); + } + for (int n = 0; n < int_array3.data.num_elements; n++ ) { + assert(int_array3.data.data_host[n] == n); + } +} + +void test2() { + gpufort::array3 bool_array; + gpufort::array3 short_array; + gpufort::array3 char_array; + gpufort::array3 int_array; + gpufort::array3 long_array; + gpufort::array3 float_array; + gpufort::array3 double_array; + assert(sizeof(bool_array)==sizeof(short_array)); + assert(sizeof(char_array)==sizeof(short_array)); + assert(sizeof(char_array)==sizeof(int_array)); + assert(sizeof(long_array)==sizeof(int_array)); + assert(sizeof(long_array)==sizeof(float_array)); + assert(sizeof(double_array)==sizeof(float_array)); +} + +int main(int argc,char** argv) { + test1(); + test2(); + std::cout << "PASSED" << std::endl; + return 0; +} diff --git a/test/gpufort_array/test_gpufort_array_interop.f03 b/test/gpufort_array/test_gpufort_array_interop.f03 new file mode 100644 index 00000000..60e09455 --- /dev/null +++ b/test/gpufort_array/test_gpufort_array_interop.f03 @@ -0,0 +1,194 @@ +program test_gpufort_array_interop + call test_array_initialization() + call test_hip_interfacing() + print *, "PASSED" +contains + + subroutine assert(condition) + logical,intent(in) :: condition + ! + if ( .not. condition ) ERROR STOP "assertion failed" + end subroutine + + subroutine test_array_initialization() + use gpufort_array + use hipfort_check + use hipfort + implicit none + ! + type(gpufort_array3) :: gpufort_arr3 + type(gpufort_array4) :: gpufort_arr4 + type(gpufort_array5) :: gpufort_arr5 + ! + real(c_float),target :: host_array_3(-1:8,-2:7,-3:6) + real(c_double_complex),target :: host_array_4(-1:8,-2:7,-3:6,-4:5) + integer(c_int),pointer,dimension(:,:,:,:,:) :: host_array_5, device_array_5 + ! + integer :: i,j,k,n + + ! + ! PART 1: Creating mapped arrays + ! + + ! direct access; set from existing pointer + ! mapped_array,& + ! bytes_per_element,& + ! data_host,data_dev,& + ! sizes, lbounds,& + ! alloc_mode,sync_mode) & + call hipCheck(gpufort_array_init(gpufort_arr3,& + c_float,c_loc(host_array_3),c_null_ptr,& + shape(host_array_3),lbound(host_array_3),& + gpufort_array_wrap_host_alloc_device,& + gpufort_array_sync_none)) + + call assert(gpufort_arr3%data%stride1==1) + call assert(gpufort_arr3%data%stride2==10) + call assert(gpufort_arr3%data%stride3==100) + call assert(gpufort_arr3%data%index_offset==321) + call assert(gpufort_arr3%data%num_elements==1000) + + ! overloaded access; set from existing pointer + call hipCheck(gpufort_array_init(gpufort_arr4,& + host_array_4, lbounds=lbound(host_array_4))) + + call assert(gpufort_arr4%data%stride1==1) + call assert(gpufort_arr4%data%stride2==10) + call assert(gpufort_arr4%data%stride3==100) + call assert(gpufort_arr4%data%stride4==1000) + call assert(gpufort_arr4%data%index_offset==4321) + call assert(gpufort_arr4%data%num_elements==10000) + + ! allocate device AND (pinned) host array + call hipCheck(gpufort_array_init(gpufort_arr5,& + c_int,[4,4,4,4,4],lbounds=[-1,-1,-1,-1,-1],& + alloc_mode=gpufort_array_alloc_pinned_host_alloc_device)) + call assert(gpufort_arr5%data%stride1==1) + call assert(gpufort_arr5%data%stride2==4) + call assert(gpufort_arr5%data%stride3==16) + call assert(gpufort_arr5%data%stride4==64) + call assert(gpufort_arr5%data%stride5==256) + call assert(gpufort_arr5%data%index_offset==1+4+16+64+256) + call assert(gpufort_arr5%data%num_elements==1024) + + ! obtain host data as Fortran pointer + call gpufort_array_hostptr(gpufort_arr5,host_array_5) + do n = 1,5 + call assert(size(host_array_5,n) == 4) + call assert(lbound(host_array_5,n) == -1) + end do + !call assert(c_loc(host_array_5) == gpufort_arr5%data%data_host) + + ! obtain device data as Fortran pointer + call gpufort_array_deviceptr(gpufort_arr5,device_array_5) + do n = 1,5 + call assert(size(device_array_5,n) == 4) + call assert(lbound(device_array_5,n) == -1) + end do + !call assert(c_loc(device_array_5) == gpufort_arr5%data%data_dev) + + ! destroy + call hipCheck(gpufort_array_destroy(gpufort_arr3)) + call hipCheck(gpufort_array_destroy(gpufort_arr4)) + call hipCheck(gpufort_array_destroy(gpufort_arr5)) + end subroutine + + subroutine test_hip_interfacing() + use gpufort_array + use hipfort_check + use hipfort + implicit none + ! + interface + subroutine launch_fill_int_array_1(arr) & + bind(c,name="launch_fill_int_array_1") + use gpufort_array + type(gpufort_array1),intent(inout) :: arr + end subroutine + subroutine launch_fill_int_array_2(arr) & + bind(c,name="launch_fill_int_array_2") + use gpufort_array + type(gpufort_array2),intent(inout) :: arr + end subroutine + subroutine launch_fill_int_array_3(arr) & + bind(c,name="launch_fill_int_array_3") + use gpufort_array + type(gpufort_array3),intent(inout) :: arr + end subroutine + end interface + ! + type(gpufort_array1) :: gpufort_int_arr1 + type(gpufort_array2) :: gpufort_int_arr2 + type(gpufort_array3) :: gpufort_int_arr3 + ! + integer(c_int),target :: int_array_1(-1:8) + integer(c_int),target :: int_array_2(-1:8,-2:7) + integer(c_int),target :: int_array_3(-1:8,-2:7,-3:6) + ! + integer(c_int) :: int_buffer_3(-1:8,-2:7,-3:6) + ! + integer :: i,j,k,n + + ! + ! PART 2: Interfacing + ! + call hipCheck(gpufort_array_init(gpufort_int_arr1,& + int_array_1, lbounds=lbound(int_array_1))) + call hipCheck(gpufort_array_init(gpufort_int_arr2,& + int_array_2, lbounds=lbound(int_array_2))) + call hipCheck(gpufort_array_init(gpufort_int_arr3,& + int_array_3, lbounds=lbound(int_array_3))) + + ! call C code + call launch_fill_int_array_1(gpufort_int_arr1) + call launch_fill_int_array_2(gpufort_int_arr2) + call launch_fill_int_array_3(gpufort_int_arr3) + + ! check + call hipCheck(hipStreamSynchronize(c_null_ptr)) + + ! copy data to host + call hipCheck(gpufort_array_copy_to_host(gpufort_int_arr1)) + call hipCheck(gpufort_array_copy_to_host(gpufort_int_arr2)) + call hipCheck(gpufort_array_copy_to_host(gpufort_int_arr3)) + + n=0 + do i = -1,8 + call assert(int_array_1(i) == n) + n = n +1 + end do + n=0 + do j = -2,7 + do i = -1,8 + call assert(int_array_2(i,j) == n) + n = n +1 + end do + end do + n=0 + do k = -3,6 + do j = -2,7 + do i = -1,8 + call assert(int_array_3(i,j,k) == n) + n = n +1 + end do + end do + end do + + ! copy to a different buffer that is not managed by the gpufort array + call hipCheck(gpufort_array_copy_to_buffer(gpufort_int_arr3,int_buffer_3,hipMemcpyDeviceToHost)) + n=0 + do k = -3,6 + do j = -2,7 + do i = -1,8 + call assert(int_buffer_3(i,j,k) == n) + n = n +1 + end do + end do + end do + + ! destroy + call hipCheck(gpufort_array_destroy(gpufort_int_arr1)) + call hipCheck(gpufort_array_destroy(gpufort_int_arr2)) + call hipCheck(gpufort_array_destroy(gpufort_int_arr3)) + end subroutine +end program diff --git a/test/gpufort_array/test_gpufort_array_kernels.hip.cpp b/test/gpufort_array/test_gpufort_array_kernels.hip.cpp new file mode 100644 index 00000000..d12df72e --- /dev/null +++ b/test/gpufort_array/test_gpufort_array_kernels.hip.cpp @@ -0,0 +1,47 @@ +#include "hip/hip_runtime.h" +#include "hip/hip_runtime_api.h" + +#include "gpufort_array.h" + +__global__ void fill_int_array_1( + gpufort::array1 arr +) { + int i = -1+threadIdx.x + blockDim.x*blockIdx.x; + if ( (i+1) < 10 ) { + arr(i) = arr.linearized_index(i); + //printf("%d\n",arr(i)); + } +} + +__global__ void fill_int_array_2( + gpufort::array2 arr +) { + int i = -1+threadIdx.x + blockDim.x*blockIdx.x; + int j = -2+threadIdx.y + blockDim.y*blockIdx.y; + if ( (i+1) < 10 && (j+2) < 10 ) { + arr(i,j) = arr.linearized_index(i,j); + } +} + +__global__ void fill_int_array_3( + gpufort::array3 arr +) { + int i = -1+threadIdx.x + blockDim.x*blockIdx.x; + int j = -2+threadIdx.y + blockDim.y*blockIdx.y; + int k = -3+threadIdx.z + blockDim.z*blockIdx.z; + if ( (i+1) < 10 && (j+2) < 10 && (k+3) < 10 ) { + arr(i,j,k) = arr.linearized_index(i,j,k); + } +} + +extern "C" { + void launch_fill_int_array_1(gpufort::array1 arr) { + hipLaunchKernelGGL(fill_int_array_1,dim3(1),dim3(10,1,1),0,nullptr,arr); + } + void launch_fill_int_array_2(gpufort::array2 arr) { + hipLaunchKernelGGL(fill_int_array_2,dim3(1),dim3(10,10,1),0,nullptr,arr); + } + void launch_fill_int_array_3(gpufort::array3 arr) { + hipLaunchKernelGGL(fill_int_array_3,dim3(1),dim3(10,10,10),0,nullptr,arr); + } +} \ No newline at end of file From 7d2c2ee84c68c39e1e6c737a7863ad358283bf0b Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 29 Nov 2021 17:52:51 -0500 Subject: [PATCH 59/67] WiP: Update test collection (test3-5 fail) TODO: Improve test parkour for translator to improve declaration parsing. --- test/stability/test3.f90 | 5 +++++ test/stability/test4.f90 | 5 +++++ test/stability/test5.f90 | 3 +++ 3 files changed, 13 insertions(+) create mode 100644 test/stability/test3.f90 create mode 100644 test/stability/test4.f90 create mode 100644 test/stability/test5.f90 diff --git a/test/stability/test3.f90 b/test/stability/test3.f90 new file mode 100644 index 00000000..03b38cbf --- /dev/null +++ b/test/stability/test3.f90 @@ -0,0 +1,5 @@ +program test1 + integer, parameter :: ims = 12,ime=16,jms=1,jme=10 + REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: & ! Does not like a comment here + HEAT2D ! What about here +end program test1 diff --git a/test/stability/test4.f90 b/test/stability/test4.f90 new file mode 100644 index 00000000..830e8d56 --- /dev/null +++ b/test/stability/test4.f90 @@ -0,0 +1,5 @@ +program test1 + ! logical, parameter :: dosfcflx = .true. ! not working + ! logical :: dosfcflx = .true. ! not working + logical,parameter :: dosfcflx ! works! +end program test1 diff --git a/test/stability/test5.f90 b/test/stability/test5.f90 new file mode 100644 index 00000000..bed83f04 --- /dev/null +++ b/test/stability/test5.f90 @@ -0,0 +1,3 @@ +program test1 + real, dimension(:,:,:,:), pointer :: tauaer_sw=>null() +end program test1 From bbded71243152464838cca23d3a5f8b34dbdefb5 Mon Sep 17 00:00:00 2001 From: Dominic Charrier Date: Wed, 1 Dec 2021 17:27:17 +0100 Subject: [PATCH 60/67] Add slides on GPUFORT arrays --- gpufort_slides.pdf | Bin 633613 -> 806469 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gpufort_slides.pdf b/gpufort_slides.pdf index a71a43ba64b1132c2a4b11868133dfd973b576bf..7afa721d32629716d3549490f62d1971f332fcd2 100644 GIT binary patch delta 511421 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 E2Ya384gdfE delta 288795 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Á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

}21dFajP&c| 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%0AcPPyCJgT@T@PjfN}a+p)}Yg9e@@s`)- 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 From ef79dce1052c2a153fd5806c2b62c1cb01065add Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 2 Dec 2021 09:30:09 -0500 Subject: [PATCH 61/67] BUGFIX:translator: logical expr and => expr in decl RHS * Fix issue with parsing expressions that have '=>' in declared variable RHS. * RHS of declared variable can now be logical expression too. * Add more rigorous test for declaration. --- python/grammar/grammar_f03.py.in | 10 +-- .../test.translator.declaration.py | 89 +++++++++++++++++++ python/utils/parsingutils.py | 4 +- 3 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 python/test/grammar_translator/test.translator.declaration.py diff --git a/python/grammar/grammar_f03.py.in b/python/grammar/grammar_f03.py.in index 60bc9cd2..8c339435 100644 --- a/python/grammar/grammar_f03.py.in +++ b/python/grammar/grammar_f03.py.in @@ -62,10 +62,10 @@ power_value2 = LPAR + arithmetic_expression + RPAR power_value = power_value2 | power_value1 power = power_value + Suppress("**") + power_value -lvalue = derived_type_elem | func_call | identifier -lvalueList = Group(delimitedList(lvalue)) +lvalue = derived_type_elem | func_call | identifier +lvalueList = Group(delimitedList(lvalue)) assignment_begin = lvalue + EQ -assignment = lvalue + EQ + arithmetic_expression # ! emits 2 tokens: *,* +assignment = lvalue + EQ + arithmetic_logical_expression # ! emits 2 tokens: *,* MATLPAR = Regex(r"\(\/|\[").suppress() MATRPAR = Regex(r"\/\)|\]").suppress() @@ -206,7 +206,7 @@ dimension_qualifier = Group(DIMENSION + bounds) # emits [*] intent_qualifier = Group(INTENT + LPAR + (INOUT|IN|OUT) + RPAR) # emits * qualifier = intent_qualifier | dimension_qualifier | simple_attribute qualifier_list = Group(delimitedList(qualifier)) -declared_variable = Group( identifier + Optional(bounds,default=None) + Optional(( EQ | PEQ ) + ( matrix_arithmetic_expression | complex_arithmetic_expression | arithmetic_expression ), default=None)) # ! emits [*,[*],*] +declared_variable = Group( identifier + Optional(bounds,default=None) + Optional(( PEQ | EQ ) + ( matrix_arithmetic_expression | complex_arithmetic_expression | arithmetic_logical_expression ), default=None)) # ! emits [*,[*],*] declaration_lhs = datatype + Optional(COMMA + qualifier_list,default=[]) + COLONS fortran_declaration = declaration_lhs + Group(delimitedList(declared_variable)) # ! emits *,[*],[*] #precisiondeclared_variable = identifier + EQ + CASELESS_LITERAL("selected_kind").suppress() + LPAR + integer + COMMA + integer + RPAR # ! emits [*,[*],*] @@ -287,4 +287,4 @@ type_attribute_list = Group(delimitedList(extends_type_attribute | simple_typ type_start = TYPE.suppress() + Optional(COMMA + type_attribute_list,default=[]) + Optional(COLONS) + identifier # ! emits 2 tokens: [[*], *] type_end = Regex(r"\bend\s*type\b",re.IGNORECASE).suppress() + Optional(identifier).suppress() -structure_end = END + ~(NONSTRUCTURE) + Optional(FUNCTION|SUBROUTINE|MODULE).suppress() + Optional(identifier).suppress() \ No newline at end of file +structure_end = END + ~(NONSTRUCTURE) + Optional(FUNCTION|SUBROUTINE|MODULE).suppress() + Optional(identifier).suppress() diff --git a/python/test/grammar_translator/test.translator.declaration.py b/python/test/grammar_translator/test.translator.declaration.py new file mode 100644 index 00000000..bd507947 --- /dev/null +++ b/python/test/grammar_translator/test.translator.declaration.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: MIT +# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +import addtoplevelpath +import os,sys +import time +import unittest +import translator.translator as translator +import utils.logging + +print("Running test '{}'".format(os.path.basename(__file__)),end="",file=sys.stderr) + +log_format = "[%(levelname)s]\tgpufort:%(message)s" +log_level = "debug2" +utils.logging.VERBOSE = False +utils.logging.TRACEBACK = False +utils.logging.init_logging("log.log",log_format,log_level) + +testdata1_types = """ +real +real(c_float) +real(8) +real*8 +integer +logical +""" + +testdata1_pass = """ +{type} test +{type} test(:) +{type} test(:,:,:) +{type} test(5) +{type} test(5,6) +{type} test(n) +{type} test(n,k,c) +{type} :: test +{type},parameter :: test +{type},intent(in) :: test +{type},dimension(:) :: test +{type} :: test(:) +{type},dimension(:,:,:) :: test +{type} :: test(:,:,:) +{type},pointer :: test => null() +{type},pointer :: test(:) => null() +{type},pointer :: test(:,:,:) => null() +""" +testdata1_fail = """ +{type},parameter test +{type},intent(in) test +""" + +testdata2_pass = """ +logical test = .false. +logical :: test = .false. +logical,parameter :: test = .true. +logical,save,parameter :: test = .false. +""" + +class TestDeclaration(unittest.TestCase): + def setUp(self): + global index + self._started_at = time.time() + def tearDown(self): + elapsed = time.time() - self._started_at + print('{} ({}s)'.format(self.id(), round(elapsed, 9))) + def prepare(self,testdata): + return testdata.strip().split("\n") + def test1_pass(self): + testdata = self.prepare(testdata1_pass) + types = self.prepare(testdata1_types) + for statement in testdata: + for typ in types: + translator.parse_declaration(statement.format(type=typ)) + def test1_fail(self): + testdata = self.prepare(testdata1_pass) + types = self.prepare(testdata1_types) + for statement in testdata: + for typ in types: + try: + translator.parse_declaration(statement.format(type=typ)) + self.assertTrue(False) + except Exception as e: + return e + def test2_logicals_pass(self): + testdata = self.prepare(testdata2_pass) + for statement in testdata: + translator.parse_declaration(statement) +if __name__ == '__main__': + unittest.main() diff --git a/python/utils/parsingutils.py b/python/utils/parsingutils.py index 56a9927b..deeda8c4 100644 --- a/python/utils/parsingutils.py +++ b/python/utils/parsingutils.py @@ -9,7 +9,9 @@ def tokenize(statement,padded_size=0): Disable padding by specifying value <= 0. """ TOKENS_REMOVE = r"\s+|\t+" - TOKENS_KEEP = r"(end|else|!\$?|(c|\*)\$|[(),]|::?|=>?|<<<|>>>|(<|>)=?|(/|=)=|\+|-|\*|/|(\.\w+\.))" + TOKENS_KEEP = r"(end|else|!\$?|[c\*]\$|[(),]|::?|=>?|<<<|>>>|[<>]=?|[/=]=|\+|-|\*|/|\.\w+\.)" + # IMPORTANT: Use non-capturing groups (?:) to ensure that an inner group in TOKENS_KEEP + # is not captured. tokens1 = re.split(TOKENS_REMOVE,statement) tokens = [] From ab6788722d1dbf8886524f1e177497dd54a1f3ae Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Thu, 2 Dec 2021 18:19:10 -0500 Subject: [PATCH 62/67] WiP: Try to support comments in multi-line statements GPUFORT tries to preserve comments. Unfortunately, this becomes difficult when a comment begins after a line continuation character. GPUFORT will move these comments to the before the statement that contains them. --- python/Makefile | 2 +- python/linemapper/linemapper.py | 34 +++++++++++++++------- python/linemapper/linemapper_options.py.in | 3 +- python/scanner/scanner_tree.py.in | 4 +-- python/translator/translator_api.py.in | 2 +- python/utils/parsingutils.py | 28 ++++++++++++++++++ 6 files changed, 58 insertions(+), 15 deletions(-) diff --git a/python/Makefile b/python/Makefile index 0cb34c8d..638ca480 100644 --- a/python/Makefile +++ b/python/Makefile @@ -1,5 +1,5 @@ GRAMMAR_TRANSLATOR_TEST_COLLECTIONS_PREFIXES := test.grammar_translator.openacc test.grammar_translator.cudafortran \ - test.grammar_translator.linemapper + test.grammar_translator.linemapper test.grammar_translator GRAMMAR_TEST_COLLECTIONS := $(addsuffix .grammar,$(GRAMMAR_TRANSLATOR_TEST_COLLECTIONS_PREFIXES)) TRANSLATOR_TEST_COLLECTIONS := $(addsuffix .translator,$(GRAMMAR_TRANSLATOR_TEST_COLLECTIONS_PREFIXES)) diff --git a/python/linemapper/linemapper.py b/python/linemapper/linemapper.py index bbd2c51e..52b4ca09 100644 --- a/python/linemapper/linemapper.py +++ b/python/linemapper/linemapper.py @@ -6,6 +6,7 @@ import addtoplevelpath import utils.logging +import utils.parsingutils ERR_LINEMAPPER_MACRO_DEFINITION_NOT_FOUND = 11001 @@ -192,7 +193,7 @@ def _intrnl_convert_lines_to_statements(lines): """ global PATTERN_LINE_CONTINUATION - p_continuation = re.compile(PATTERN_LINE_CONTINUATION) + p_continuation = re.compile(r"\&\s*([!c\*]\$\w+)?|([!c\*]\$\w+\&)",re.IGNORECASE) # we look for a sequence ") " were word != "then". p_single_line_if = re.compile(r"^(?P[\s\t]*)(?Pif\s*\(.+\))\s*\b(?!then)(?P\w.+)",re.IGNORECASE) @@ -209,10 +210,22 @@ def _intrnl_convert_lines_to_statements(lines): indent_offset = num_indent_chars * indent_char # replace line continuation by whitespace, split at ";" - lines_content = " ".join(lines) - if "&" in lines_content: - lines_content = p_continuation.sub(" ",lines_content) - single_line_statements=lines_content.split(";") + statement_parts = [] + comment_parts = [] + for line in lines: + indent,stmt_or_dir_part,comment,_ = \ + utils.parsingutils.split_fortran_line(line) + if len(stmt_or_dir_part): + statement_parts.append(stmt_or_dir_part) + if len(comment): + comment_parts.append(comment) + single_line_statements = [] + if len(statement_parts): + combined_statements = "".join(statement_parts) + single_line_statements +=\ + p_continuation.sub(" ",combined_statements).split(";") + if len(comment_parts): + single_line_statements = comment_parts + single_line_statements # unroll single-line if unrolled_statements = [] for stmt in single_line_statements: @@ -233,23 +246,24 @@ def _intrnl_convert_lines_to_statements(lines): def _intrnl_detect_line_starts(lines): """Fortran statements can be broken into multiple lines - via the '&'. This routine linemaps in which line a statement + via the '&' characters. This routine detects in which line a statement (or multiple statements per line) begins. The difference between the line numbers of consecutive entries is the number of lines the first statement occupies. """ - p_directive_continuation = re.compile(r"\n[!c\*]\$\w+\&") + p_directive_continuation = re.compile(r"[!c\*]\$\w+\&") # 1. save multi-line statements (&) in buffer buffering = False line_starts = [] for lineno,line in enumerate(lines,start=0): # Continue buffering if multiline CUF/ACC/OMP statement - buffering |= p_directive_continuation.match(line) != None + _,stmt_or_dir,comment,_ = \ + utils.parsingutils.split_fortran_line(line) + buffering |= p_directive_continuation.match(stmt_or_dir) != None if not buffering: line_starts.append(lineno) - stripped_line = line.rstrip(" \t\n") - if len(stripped_line) and stripped_line[-1] in ['&','\\']: + if len(stmt_or_dir) and stmt_or_dir[-1] in ['&','\\']: buffering = True else: buffering = False diff --git a/python/linemapper/linemapper_options.py.in b/python/linemapper/linemapper_options.py.in index 857f9061..ec481d65 100644 --- a/python/linemapper/linemapper_options.py.in +++ b/python/linemapper/linemapper_options.py.in @@ -1,7 +1,8 @@ LOG_PREFIX="linemapper.linemapper" # prefix for logging PRETTY_PRINT_LINEMAPS_DUMP = False # Prettify linemaps JSON files. -PATTERN_LINE_CONTINUATION=r"(\&\s*\n\s*([!c\*]\$\w+)?)|(^\s*[!c\*]\$\w+\&\s*)" +#PATTERN_LINE_CONTINUATION=r"(\&\s*\n\s*([!c\*]\$\w+)?)|(^\s*[!c\*]\$\w+\&\s*)" +PATTERN_LINE_CONTINUATION=r"\&([!c\*]\$\w+)?|([!c\*]\$\w+\&)" # line continuation pattern. The linemapper's preprocessor removes them. ERROR_HANDLING="strict" diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index 8190f15c..70abbc72 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -117,9 +117,9 @@ class STNode: return first_line[0:num_indent_chars] def first_statement(self): """ - :return: First line in first linemap. + :return: First statement in first linemap that belongs to this node. """ - return self._linemaps[0]["statements"][0]["body"] + return self._linemaps[0]["statements"][self._first_statement_index]["body"] def append(self,child): self.children.append(child) def list_of_parents(self): diff --git a/python/translator/translator_api.py.in b/python/translator/translator_api.py.in index 09989fd7..f8741fb2 100644 --- a/python/translator/translator_api.py.in +++ b/python/translator/translator_api.py.in @@ -218,4 +218,4 @@ def parse_procedure_body(fortran_statements,scope=None,result_name=""): ttprocedurebody.scope = scope ttprocedurebody.result_name = result_name - return ttprocedurebody \ No newline at end of file + return ttprocedurebody diff --git a/python/utils/parsingutils.py b/python/utils/parsingutils.py index deeda8c4..21a79c8a 100644 --- a/python/utils/parsingutils.py +++ b/python/utils/parsingutils.py @@ -1,5 +1,33 @@ import re +def split_fortran_line(line): + """Decomposes a Fortran line into preceding whitespace, + statement part, comment part, and trailing whitespace (including newline char). + """ + len_line = len(line) + len_preceding_ws = len_line-len(line.lstrip(" \n\t")) + len_trailing_ws = len_line-len(line.rstrip(" \n\t")) + content = line[len_preceding_ws:len_line-len_trailing_ws] + + statement = "" + comment = "" + if len(content): + if len_preceding_ws == 0 and content[0] in "!cC*" or\ + content[0] == "!": + if content[1] == "$": + statement = content + else: + comment = content + else: + content_parts = content.split("!",maxsplit=1) + if len(content_parts) > 0: + statement = content_parts[0] + if len(content_parts) == 2: + comment = "!"+content_parts[1] + preceding_ws = line[0:len_preceding_ws] + trailing_ws = line[len_line-len_trailing_ws:] + return preceding_ws, statement.rstrip(" \t"), comment, trailing_ws + def tokenize(statement,padded_size=0): """Splits string at whitespaces and substrings such as 'end', '$', '!', '(', ')', '=>', '=', ',' and "::". From 4ed0827a0e675e9fe8729766a0f4548ca09c77af Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Fri, 3 Dec 2021 14:21:45 -0500 Subject: [PATCH 63/67] WiP --- python/utils/parsingutils.py | 49 +++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/python/utils/parsingutils.py b/python/utils/parsingutils.py index 21a79c8a..b84c46d7 100644 --- a/python/utils/parsingutils.py +++ b/python/utils/parsingutils.py @@ -1,6 +1,10 @@ import re +COMMENT_CHARS="!cCdD*" + def split_fortran_line(line): + global COMMENT_CHARS + """Decomposes a Fortran line into preceding whitespace, statement part, comment part, and trailing whitespace (including newline char). """ @@ -12,7 +16,7 @@ def split_fortran_line(line): statement = "" comment = "" if len(content): - if len_preceding_ws == 0 and content[0] in "!cC*" or\ + if len_preceding_ws == 0 and content[0] in COMMENT_CHARS or\ content[0] == "!": if content[1] == "$": statement = content @@ -28,6 +32,49 @@ def split_fortran_line(line): trailing_ws = line[len_line-len_trailing_ws:] return preceding_ws, statement.rstrip(" \t"), comment, trailing_ws +def relocate_inline_comments(lines): + """Move comments that follow after a line continuation char ('&') + before the + Example. Input: + + ``` + call myroutine( & ! comment 1 + arg1,& + ! comment 2 + + + arg2) ! comment 3 + ``` + Output: + ``` + call myroutine( & + arg1,& + arg2) + ! comment 1 + ! comment 2 + ! comment 3 + ``` + """ + result = [] + comment_buffer = [] + in_multiline_statement = False + for line in lines: + indent,stmt_or_dir,comment,trailing_ws = \ + split_fortran_line(line) + if len(stmt_or_dir) and stmt_or_dir[-1] == "&": + in_multiline_statement = True + if in_multiline_statement and len(comment): + if len(stmt_or_dir): + result.append("".join([indent,stmt_or_dir,trailing_ws])) + comment_buffer.append("".join([indent,comment,trailing_ws])) + else: + result.append(line) + if len(stmt_or_dir) and stmt_or_dir[-1] != "&": + result += comment_buffer + comment_buffer.clear() + in_multiline_statement = False + return result + def tokenize(statement,padded_size=0): """Splits string at whitespaces and substrings such as 'end', '$', '!', '(', ')', '=>', '=', ',' and "::". From 4ea4fc65d1f3bac0c7fc758e7299dbea2497c61e Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 6 Dec 2021 03:41:27 -0500 Subject: [PATCH 64/67] Finalise inline comment reloc * Add test to folder python/test/utils --- python/scanner/scanner_tree.py.in | 5 +- python/test/Makefile.in | 20 ++-- python/test/utils/Makefile | 6 ++ python/test/utils/addtoplevelpath.py | 4 + python/test/utils/test.utils.parsingutils.py | 96 ++++++++++++++++++++ 5 files changed, 118 insertions(+), 13 deletions(-) create mode 100644 python/test/utils/Makefile create mode 100644 python/test/utils/addtoplevelpath.py create mode 100644 python/test/utils/test.utils.parsingutils.py diff --git a/python/scanner/scanner_tree.py.in b/python/scanner/scanner_tree.py.in index 70abbc72..12e0b191 100644 --- a/python/scanner/scanner_tree.py.in +++ b/python/scanner/scanner_tree.py.in @@ -77,7 +77,8 @@ class STNode: for i,line in enumerate(lines): lines[i] = line.replace(" ","").replace("\t","").replace("\n","").replace("&","") def lines(self): - return self.__get_linemap_content("lines") + original_lines = self.__get_linemap_content("lines") + return utils.parsingutils.relocate_inline_comments(original_lines) def statements(self,include_none_entries=False): """ Extract the statements associated with this node from the linemaps associated with this node. @@ -270,9 +271,9 @@ class STNode: have_first_in_first_linemap = self._first_statement_index == 0 have_last_in_last_linemap = self._last_statement_index == -1 or\ self._last_statement_index == len(self._linemaps[-1]["statements"])-1 - statements_fully_cover_lines = have_first_in_first_linemap and have_last_in_last_linemap joined_statements = "\n".join(self.statements()) joined_lines = "".join(self.lines()) + statements_fully_cover_lines = have_first_in_first_linemap and have_last_in_last_linemap transformed_code, transformed = \ self.transform(joined_lines,joined_statements,statements_fully_cover_lines,index) if transformed: diff --git a/python/test/Makefile.in b/python/test/Makefile.in index adde049e..2b9498e9 100644 --- a/python/test/Makefile.in +++ b/python/test/Makefile.in @@ -2,24 +2,22 @@ GRAMMAR_TESTS = $(shell find . -maxdepth 1 -name "test.grammar.*.py" -execd TRANSLATOR_TESTS = $(shell find . -maxdepth 1 -name "test.translator.*.py" -execdir basename {} ';') INDEXER_TESTS = $(shell find . -maxdepth 1 -name "test.indexer.*.py" -execdir basename {} ';') LINEMAPPER_TESTS = $(shell find . -maxdepth 1 -name "test.linemapper.*.py" -execdir basename {} ';') +UTILS_TESTS = $(shell find . -maxdepth 1 -name "test.utils.*.py" -execdir basename {} ';') CUSTOM_TESTS = $(shell find . -maxdepth 1 -name "test.custom.*.py" -execdir basename {} ';') -.PHONY: $(GRAMMAR_TESTS) $(TRANSLATOR_TESTS) $(INDEXER_TESTS) $(LINEMAPPER_TESTS) $(CUSTOM_TESTS)\ - test.grammar test.translator test.indexer test.linemapper test.custom +TEST_COLLECTION_TARGETS = test.grammar test.translator test.indexer test.linemapper test.utils test.custom +TESTS = $(GRAMMAR_TESTS) $(TRANSLATOR_TESTS) $(INDEXER_TESTS) $(LINEMAPPER_TESTS) $(UTILS_TESTS) $(CUSTOM_TESTS) -all: test.grammar test.translator test.indexer test.linemapper test.custom +all: $(TEST_COLLECTION_TARGETS) -TESTS = $(GRAMMAR_TESTS) $(TRANSLATOR_TESTS) $(INDEXER_TESTS) $(LINEMAPPER_TESTS) $(CUSTOM_TESTS) +.PHONY: $(TESTS) $(TEST_COLLECTION_TARGETS) $(TESTS): %: python3 $@ -test.grammar: $(GRAMMAR_TESTS) - +test.grammar: $(GRAMMAR_TESTS) test.translator: $(TRANSLATOR_TESTS) - -test.indexer: $(INDEXER_TESTS) - +test.indexer: $(INDEXER_TESTS) test.linemapper: $(LINEMAPPER_TESTS) - -test.custom: $(CUSTOM_TESTS) +test.utils: $(UTILS_TESTS) +test.custom: $(CUSTOM_TESTS) diff --git a/python/test/utils/Makefile b/python/test/utils/Makefile new file mode 100644 index 00000000..170a88d2 --- /dev/null +++ b/python/test/utils/Makefile @@ -0,0 +1,6 @@ +include ../Makefile.in + +.PHONY: clean + +clean: + rm -rf *.gpufort_mod *.log __pycache__ diff --git a/python/test/utils/addtoplevelpath.py b/python/test/utils/addtoplevelpath.py new file mode 100644 index 00000000..781b0f55 --- /dev/null +++ b/python/test/utils/addtoplevelpath.py @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: MIT +# Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +import os,sys +sys.path.insert(1, os.path.join(os.path.dirname(os.path.abspath(__file__)), "../"*2)) \ No newline at end of file diff --git a/python/test/utils/test.utils.parsingutils.py b/python/test/utils/test.utils.parsingutils.py new file mode 100644 index 00000000..2b878fdd --- /dev/null +++ b/python/test/utils/test.utils.parsingutils.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +import time +import unittest +import cProfile,pstats,io +import json + +import addtoplevelpath +import utils.logging +import utils.parsingutils + +LOG_FORMAT = "[%(levelname)s]\tgpufort:%(message)s" +utils.logging.VERBOSE = False +utils.logging.init_logging("log.log",LOG_FORMAT,"warning") + +PROFILING_ENABLE = False + +index = [] + +testdata1 = \ +""" +! comment + ! comment +stmt_or_dir ! comment +!$acc stmt_or_dir +*$acc stmt_or_dir +c$acc stmt_or_dir +C$acc stmt_or_dir +!$ acc stmt_or_dir +! $acc comment + !a$acc comment +""" + +# whitespace at begin is important to +# as [cC] in first column indicates a comment +# line in Fortran 77. +testdata2 = \ +""" call myroutine( & ! comment 1 + arg1,& + ! comment 2 + + + arg2) ! comment 3 +""" + +testdata2_result = \ +""" call myroutine( & + arg1,& + + + arg2) + ! comment 1 + ! comment 2 + ! comment 3 +""" + +class TestParsingUtils(unittest.TestCase): + def prepare(self,text): + return text.strip().split("\n") + def clean(self,text): + return text.replace(" ","").replace("\t","").replace("\n","").replace("\r","") + def setUp(self): + global PROFILING_ENABLE + if PROFILING_ENABLE: + self._profiler = cProfile.Profile() + self._profiler.enable() + self._started_at = time.time() + def tearDown(self): + global PROFILING_ENABLE + if PROFILING_ENABLE: + self._profiler.disable() + s = io.StringIO() + sortby = 'cumulative' + stats = pstats.Stats(self._profiler, stream=s).sort_stats(sortby) + stats.print_stats(10) + print(s.getvalue()) + elapsed = time.time() - self._started_at + print('{} ({}s)'.format(self.id(), round(elapsed, 6))) + def test_1_split_fortran_line(self): + for line in self.prepare(testdata1): + indent,stmt_or_dir,comment,trailing_ws =\ + utils.parsingutils.split_fortran_line(line) + if "stmt_or_dir" in line: + self.assertTrue(len(stmt_or_dir)) + else: + self.assertFalse(len(stmt_or_dir)) + if "comment" in line: + self.assertTrue(len(comment)) + else: + self.assertFalse(len(comment)) + # + def test_2_relocate_inline_comments(self): + result = utils.parsingutils.relocate_inline_comments(\ + testdata2.split("\n")) + self.assertEqual(self.clean("\n".join(result)),self.clean(testdata2_result)) +if __name__ == '__main__': + unittest.main() From f79e47d7f384bfdbc72a7f90bf7f386ff32209c2 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 6 Dec 2021 03:51:59 -0500 Subject: [PATCH 65/67] Add index entry for CUDA builtin variables --- include/cudafor.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/cudafor.f90 b/include/cudafor.f90 index 5532a120..b6ee2dde 100644 --- a/include/cudafor.f90 +++ b/include/cudafor.f90 @@ -2,4 +2,6 @@ module cudafor type,bind(c) :: dim3 integer(c_int) :: x,y,z end type dim3 + + type(dim3) :: blockdim, griddim, threadidx, blockidx end module cudafor From d319b1cc89c85265a4fc77dd804c882e40a30975 Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 6 Dec 2021 07:50:40 -0500 Subject: [PATCH 66/67] linemapper: Put inline comments behind statements --- python/linemapper/linemapper.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/linemapper/linemapper.py b/python/linemapper/linemapper.py index 52b4ca09..a9c39f69 100644 --- a/python/linemapper/linemapper.py +++ b/python/linemapper/linemapper.py @@ -225,7 +225,9 @@ def _intrnl_convert_lines_to_statements(lines): single_line_statements +=\ p_continuation.sub(" ",combined_statements).split(";") if len(comment_parts): - single_line_statements = comment_parts + single_line_statements + if len(single_line_statements): + single_line_statements[-1] = single_line_statements[-1].rstrip("\n") + "\n" + single_line_statements += comment_parts # unroll single-line if unrolled_statements = [] for stmt in single_line_statements: From ad5d85b887ba689f6a73bdabaaeffc08b5c8ff1b Mon Sep 17 00:00:00 2001 From: Dominic Etienne Charrier Date: Mon, 6 Dec 2021 11:30:26 -0500 Subject: [PATCH 67/67] BUGFIX/parsingutils: Check string length before checking char --- python/utils/parsingutils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/utils/parsingutils.py b/python/utils/parsingutils.py index b84c46d7..f6c84435 100644 --- a/python/utils/parsingutils.py +++ b/python/utils/parsingutils.py @@ -18,7 +18,7 @@ def split_fortran_line(line): if len(content): if len_preceding_ws == 0 and content[0] in COMMENT_CHARS or\ content[0] == "!": - if content[1] == "$": + if len(content) > 1 and content[1] == "$": statement = content else: comment = content

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%0D8A;ppBnofsW%^Xae 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%0D^S54gHDHMv{soqwEpzmuOPb0;c#e>r9* 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