Author: Hansang Bae
Date: 2021-01-04T08:12:57-06:00
New Revision: 82a29a62aba52d68d37309cd3025370ba98e37e4

URL: 
https://github.com/llvm/llvm-project/commit/82a29a62aba52d68d37309cd3025370ba98e37e4
DIFF: 
https://github.com/llvm/llvm-project/commit/82a29a62aba52d68d37309cd3025370ba98e37e4.diff

LOG: [OpenMP] Add definition/interface for target memory routines

The change includes new routines introduced in 5.1 and Fortran
interface.

Differential Revision: https://reviews.llvm.org/D93505

Added: 
    

Modified: 
    openmp/runtime/src/include/omp.h.var
    openmp/runtime/src/include/omp_lib.f90.var
    openmp/runtime/src/include/omp_lib.h.var

Removed: 
    


################################################################################
diff  --git a/openmp/runtime/src/include/omp.h.var 
b/openmp/runtime/src/include/omp.h.var
index b687ff16eaeb..8821377e29d8 100644
--- a/openmp/runtime/src/include/omp.h.var
+++ b/openmp/runtime/src/include/omp.h.var
@@ -213,6 +213,24 @@
      */
     extern const char * __KAI_KMPC_CONVENTION  omp_get_interop_rc_desc(const 
omp_interop_rc_t, omp_interop_rc_t);
 
+    /* OpenMP 5.1 device memory routines */
+
+    /*!
+     * The `omp_target_memcpy_async` routine asynchronously performs a copy 
between any combination of host and device pointers.
+     */
+    extern int    __KAI_KMPC_CONVENTION  omp_target_memcpy_async(void *, const 
void *, size_t, size_t, size_t, int,
+                                             int, int, omp_depend_t *);
+    /*!
+     * The `omp_target_memcpy_rect_async` routine asynchronously performs a 
copy between any combination of host and device pointers.
+     */
+    extern int    __KAI_KMPC_CONVENTION  omp_target_memcpy_rect_async(void *, 
const void *, size_t, int, const size_t *,
+                                             const size_t *, const size_t *, 
const size_t *, const size_t *, int, int,
+                                             int, omp_depend_t *);
+    /*!
+     * The `omp_get_mapped_ptr` routine returns the device pointer that is 
associated with a host pointer for a given device.
+     */
+    extern void * __KAI_KMPC_CONVENTION  omp_get_mapped_ptr(const void *, int);
+
     /* kmp API functions */
     extern int    __KAI_KMPC_CONVENTION  kmp_get_stacksize          (void);
     extern void   __KAI_KMPC_CONVENTION  kmp_set_stacksize          (int);

diff  --git a/openmp/runtime/src/include/omp_lib.f90.var 
b/openmp/runtime/src/include/omp_lib.f90.var
index fbbb7b9df94d..1bde868a505b 100644
--- a/openmp/runtime/src/include/omp_lib.f90.var
+++ b/openmp/runtime/src/include/omp_lib.f90.var
@@ -509,6 +509,103 @@
           end subroutine omp_display_env
 
 
+          function omp_target_alloc(size, device_num) bind(c)
+            use omp_lib_kinds
+            type(c_ptr) omp_target_alloc
+            integer (kind=kmp_size_t_kind), value :: size
+            integer (kind=omp_integer_kind), value :: device_num
+          end function omp_target_alloc
+
+          subroutine omp_target_free(device_ptr, device_num) bind(c)
+            use omp_lib_kinds
+            type(c_ptr), value :: device_ptr
+            integer (kind=omp_integer_kind), value :: device_num
+          end subroutine omp_target_free
+
+          function omp_target_is_present(ptr, device_num) bind(c)
+            use omp_lib_kinds
+            integer (kind=omp_integer_kind) omp_target_is_present
+            type(c_ptr), value :: ptr
+            integer (kind=omp_integer_kind), value :: device_num
+          end function omp_target_is_present
+
+          function omp_target_memcpy(dst, src, length, dst_offset, src_offset, 
&
+              dst_device_num, src_device_num) bind(c)
+            use omp_lib_kinds
+            integer (kind=omp_integer_kind) omp_target_memcpy
+            type(c_ptr), value :: dst, src
+            integer (kind=kmp_size_t_kind), value :: length, dst_offset,       
&
+                src_offset
+            integer (kind=omp_integer_kind), value :: dst_device_num,          
&
+                src_device_num
+          end function omp_target_memcpy
+
+          function omp_target_memcpy_rect(dst, src, element_size, num_dims,    
&
+              volume, dst_offsets, src_offsets, dst_dimensions,                
&
+              src_dimensions, dst_device_num, src_device_num) bind(c)
+            use omp_lib_kinds
+            integer (kind=omp_integer_kind) omp_target_memcpy_rect
+            type(c_ptr), value :: dst, src
+            integer (kind=kmp_size_t_kind), value :: element_size
+            integer (kind=omp_integer_kind), value :: num_dims,                
&
+                dst_device_num, src_device_num
+            integer (kind=kmp_size_t_kind), intent(in) :: volume(*),           
&
+                dst_offsets(*), src_offsets(*), dst_dimensions(*),             
&
+                src_dimensions(*)
+          end function omp_target_memcpy_rect
+
+          function omp_target_memcpy_async(dst, src, length, dst_offset,       
&
+              src_offset, dst_device_num, src_device_num, depobj_count,        
&
+              depobj_list) bind(c)
+            use omp_lib_kinds
+            integer (kind=omp_integer_kind) omp_target_memcpy_async
+            type(c_ptr), value :: dst, src
+            integer (kind=kmp_size_t_kind), value :: length, dst_offset,       
&
+                src_offset
+            integer (kind=omp_integer_kind), value :: dst_device_num,          
&
+                src_device_num, depobj_count
+            integer (kind=omp_depend_kind), optional :: depobj_list(*)
+          end function omp_target_memcpy_async
+
+          function omp_target_memcpy_rect_async(dst, src, element_size,        
&
+              num_dims, volume, dst_offsets, src_offsets, dst_dimensions,      
&
+              src_dimensions, dst_device_num, src_device_num, depobj_count,    
&
+              depobj_list) bind(c)
+            use omp_lib_kinds
+            integer (kind=omp_integer_kind) omp_target_memcpy_rect_async
+            type(c_ptr), value :: dst, src
+            integer (kind=kmp_size_t_kind), value :: element_size
+            integer (kind=omp_integer_kind), value :: num_dims,                
&
+                dst_device_num, src_device_num, depobj_count
+            integer (kind=kmp_size_t_kind), intent(in) :: volume(*),           
&
+                dst_offsets(*), src_offsets(*), dst_dimensions(*),             
&
+                src_dimensions(*)
+            integer (kind=omp_depend_kind), optional :: depobj_list(*)
+          end function omp_target_memcpy_rect_async
+
+          function omp_target_associate_ptr(host_ptr, device_ptr, size,        
&
+              device_offset, device_num) bind(c)
+            use omp_lib_kinds
+            integer (kind=omp_integer_kind) omp_target_associate_ptr
+            type(c_ptr), value :: host_ptr, device_ptr
+            integer (kind=kmp_size_t_kind), value :: size, device_offset
+            integer (kind=omp_integer_kind), value :: device_num
+          end function omp_target_associate_ptr
+
+          function omp_get_mapped_ptr(ptr, device_num) bind(c)
+            use omp_lib_kinds
+            type(c_ptr) omp_get_mapped_ptr
+            type(c_ptr), value :: ptr
+            integer (kind=omp_integer_kind), value :: device_num
+          end function omp_get_mapped_ptr
+
+          function omp_target_disassociate_ptr(ptr, device_num) bind(c)
+            use omp_lib_kinds
+            integer (kind=omp_integer_kind) omp_target_disassociate_ptr
+            type(c_ptr), value :: ptr
+            integer (kind=omp_integer_kind), value :: device_num
+          end function omp_target_disassociate_ptr
+
 !         ***
 !         *** kmp_* entry points
 !         ***

diff  --git a/openmp/runtime/src/include/omp_lib.h.var 
b/openmp/runtime/src/include/omp_lib.h.var
index f1b6b03f7725..b649a8071e6f 100644
--- a/openmp/runtime/src/include/omp_lib.h.var
+++ b/openmp/runtime/src/include/omp_lib.h.var
@@ -585,6 +585,113 @@
           logical (kind=omp_logical_kind), value :: verbose
         end subroutine omp_display_env
 
+        function omp_target_alloc(size, device_num) bind(c)
+          use, intrinsic :: iso_c_binding, only : c_ptr
+          import
+          type(c_ptr) omp_target_alloc
+          integer (kind=kmp_size_t_kind), value :: size
+          integer (kind=omp_integer_kind), value :: device_num
+        end function omp_target_alloc
+
+        subroutine omp_target_free(device_ptr, device_num) bind(c)
+          use, intrinsic :: iso_c_binding, only : c_ptr
+          import
+          type(c_ptr), value :: device_ptr
+          integer (kind=omp_integer_kind), value :: device_num
+        end subroutine omp_target_free
+
+        function omp_target_is_present(ptr, device_num) bind(c)
+          use, intrinsic :: iso_c_binding, only : c_ptr
+          import
+          integer (kind=omp_integer_kind) omp_target_is_present
+          type(c_ptr), value :: ptr
+          integer (kind=omp_integer_kind), value :: device_num
+        end function omp_target_is_present
+
+        function omp_target_memcpy(dst, src, length, dst_offset,               
                                                     &
+     &      src_offset, dst_device_num, src_device_num) bind(c)
+          use, intrinsic :: iso_c_binding, only : c_ptr
+          import
+          integer (kind=omp_integer_kind) omp_target_memcpy
+          type(c_ptr), value :: dst, src
+          integer (kind=kmp_size_t_kind), value :: length, dst_offset,         
                                                     &
+     &        src_offset
+          integer (kind=omp_integer_kind), value :: dst_device_num,            
                                                     &
+     &        src_device_num
+        end function omp_target_memcpy
+
+        function omp_target_memcpy_rect(dst, src, element_size,                
                                                     &
+     &      num_dims, volume, dst_offsets, src_offsets, dst_dimensions,        
                                                     &
+     &      src_dimensions, dst_device_num, src_device_num) bind(c)
+          use, intrinsic :: iso_c_binding, only : c_ptr
+          import
+          integer (kind=omp_integer_kind) omp_target_memcpy_rect
+          type(c_ptr), value :: dst, src
+          integer (kind=kmp_size_t_kind), value :: element_size
+          integer (kind=omp_integer_kind), value :: num_dims,                  
                                                     &
+     &        dst_device_num, src_device_num
+          integer (kind=kmp_size_t_kind), intent(in) :: volume(*),             
                                                     &
+     &        dst_offsets(*), src_offsets(*), dst_dimensions(*),               
                                                     &
+     &        src_dimensions(*)
+        end function omp_target_memcpy_rect
+
+        function omp_target_memcpy_async(dst, src, length, dst_offset,         
                                                     &
+     &      src_offset, dst_device_num, src_device_num, depobj_count,          
                                                     &
+     &      depobj_list) bind(c)
+          use, intrinsic :: iso_c_binding, only : c_ptr
+          import
+          integer (kind=omp_integer_kind) omp_target_memcpy_async
+          type(c_ptr), value :: dst, src
+          integer (kind=kmp_size_t_kind), value :: length, dst_offset,         
                                                     &
+     &        src_offset
+          integer (kind=omp_integer_kind), value :: dst_device_num,            
                                                     &
+     &        src_device_num, depobj_count
+          integer (kind=omp_depend_kind), optional :: depobj_list(*)
+        end function omp_target_memcpy_async
+
+        function omp_target_memcpy_rect_async(dst, src, element_size,          
                                                     &
+     &      num_dims, volume, dst_offsets, src_offsets, dst_dimensions,        
                                                     &
+     &      src_dimensions, dst_device_num, src_device_num,                    
                                                     &
+     &      depobj_count, depobj_list) bind(c)
+          use, intrinsic :: iso_c_binding, only : c_ptr
+          import
+          integer (kind=omp_integer_kind) omp_target_memcpy_rect_async
+          type(c_ptr), value :: dst, src
+          integer (kind=kmp_size_t_kind), value :: element_size
+          integer (kind=omp_integer_kind), value :: num_dims,                  
                                                     &
+     &        dst_device_num, src_device_num, depobj_count
+          integer (kind=kmp_size_t_kind), intent(in) :: volume(*),             
                                                     &
+     &        dst_offsets(*), src_offsets(*), dst_dimensions(*),               
                                                     &
+     &        src_dimensions(*)
+          integer (kind=omp_depend_kind), optional :: depobj_list(*)
+        end function omp_target_memcpy_rect_async
+
+        function omp_target_associate_ptr(host_ptr, device_ptr, size,          
                                                     &
+     &      device_offset, device_num) bind(c)
+          use, intrinsic :: iso_c_binding, only : c_ptr
+          import
+          integer (kind=omp_integer_kind) omp_target_associate_ptr
+          type(c_ptr), value :: host_ptr, device_ptr
+          integer (kind=kmp_size_t_kind), value :: size, device_offset
+          integer (kind=omp_integer_kind), value :: device_num
+        end function omp_target_associate_ptr
+
+        function omp_get_mapped_ptr(ptr, device_num) bind(c)
+          use, intrinsic :: iso_c_binding, only : c_ptr
+          import
+          type(c_ptr) omp_get_mapped_ptr
+          type(c_ptr), value :: ptr
+          integer (kind=omp_integer_kind), value :: device_num
+        end function omp_get_mapped_ptr
+
+        function omp_target_disassociate_ptr(ptr, device_num) bind(c)
+          use, intrinsic :: iso_c_binding, only : c_ptr
+          import
+          integer (kind=omp_integer_kind) omp_target_disassociate_ptr
+          type(c_ptr), value :: ptr
+          integer (kind=omp_integer_kind), value :: device_num
+        end function omp_target_disassociate_ptr
+
 !       ***
 !       *** kmp_* entry points
 !       ***


        
_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to