1 //===----------- device.h - Target independent OpenMP target RTL ----------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // Declarations for managing devices that are handled by RTL plugins.
11 //===----------------------------------------------------------------------===//
13 #ifndef _OMPTARGET_DEVICE_H
14 #define _OMPTARGET_DEVICE_H
26 #include "ExclusiveAccess.h"
27 #include "OffloadEntry.h"
28 #include "omptarget.h"
31 #include "OpenMP/Mapping.h"
33 #include "llvm/ADT/DenseMap.h"
34 #include "llvm/ADT/SmallVector.h"
36 #include "PluginInterface.h"
37 using GenericPluginTy
= llvm::omp::target::plugin::GenericPluginTy
;
39 // Forward declarations.
40 struct __tgt_bin_desc
;
41 struct __tgt_target_table
;
48 DeviceTy(GenericPluginTy
*RTL
, int32_t DeviceID
, int32_t RTLDeviceID
);
49 // DeviceTy is not copyable
50 DeviceTy(const DeviceTy
&D
) = delete;
51 DeviceTy
&operator=(const DeviceTy
&D
) = delete;
55 /// Try to initialize the device and return any failure.
58 /// Provide access to the mapping handler.
59 MappingInfoTy
&getMappingInfo() { return MappingInfo
; }
61 llvm::Expected
<__tgt_device_binary
> loadBinary(__tgt_device_image
*Img
);
63 // device memory allocation/deallocation routines
64 /// Allocates \p Size bytes on the device, host or shared memory space
65 /// (depending on \p Kind) and returns the address/nullptr when
66 /// succeeds/fails. \p HstPtr is an address of the host data which the
67 /// allocated target data will be associated with. If it is unknown, the
68 /// default value of \p HstPtr is nullptr. Note: this function doesn't do
69 /// pointer association. Actually, all the __tgt_rtl_data_alloc
70 /// implementations ignore \p HstPtr. \p Kind dictates what allocator should
71 /// be used (host, shared, device).
72 void *allocData(int64_t Size
, void *HstPtr
= nullptr,
73 int32_t Kind
= TARGET_ALLOC_DEFAULT
);
75 /// Deallocates memory which \p TgtPtrBegin points at and returns
76 /// OFFLOAD_SUCCESS/OFFLOAD_FAIL when succeeds/fails. p Kind dictates what
77 /// allocator should be used (host, shared, device).
78 int32_t deleteData(void *TgtPtrBegin
, int32_t Kind
= TARGET_ALLOC_DEFAULT
);
80 // Data transfer. When AsyncInfo is nullptr, the transfer will be
82 // Copy data from host to device
83 int32_t submitData(void *TgtPtrBegin
, void *HstPtrBegin
, int64_t Size
,
84 AsyncInfoTy
&AsyncInfo
,
85 HostDataToTargetTy
*Entry
= nullptr,
86 MappingInfoTy::HDTTMapAccessorTy
*HDTTMapPtr
= nullptr);
88 // Copy data from device back to host
89 int32_t retrieveData(void *HstPtrBegin
, void *TgtPtrBegin
, int64_t Size
,
90 AsyncInfoTy
&AsyncInfo
,
91 HostDataToTargetTy
*Entry
= nullptr,
92 MappingInfoTy::HDTTMapAccessorTy
*HDTTMapPtr
= nullptr);
94 // Return true if data can be copied to DstDevice directly
95 bool isDataExchangable(const DeviceTy
&DstDevice
);
97 // Copy data from current device to destination device directly
98 int32_t dataExchange(void *SrcPtr
, DeviceTy
&DstDev
, void *DstPtr
,
99 int64_t Size
, AsyncInfoTy
&AsyncInfo
);
101 /// Notify the plugin about a new mapping starting at the host address
102 /// \p HstPtr and \p Size bytes.
103 int32_t notifyDataMapped(void *HstPtr
, int64_t Size
);
105 /// Notify the plugin about an existing mapping being unmapped starting at
106 /// the host address \p HstPtr.
107 int32_t notifyDataUnmapped(void *HstPtr
);
109 // Launch the kernel identified by \p TgtEntryPtr with the given arguments.
110 int32_t launchKernel(void *TgtEntryPtr
, void **TgtVarsPtr
,
111 ptrdiff_t *TgtOffsets
, KernelArgsTy
&KernelArgs
,
112 AsyncInfoTy
&AsyncInfo
);
114 /// Synchronize device/queue/event based on \p AsyncInfo and return
115 /// OFFLOAD_SUCCESS/OFFLOAD_FAIL when succeeds/fails.
116 int32_t synchronize(AsyncInfoTy
&AsyncInfo
);
118 /// Query for device/queue/event based completion on \p AsyncInfo in a
119 /// non-blocking manner and return OFFLOAD_SUCCESS/OFFLOAD_FAIL when
120 /// succeeds/fails. Must be called multiple times until AsyncInfo is
121 /// completed and AsyncInfo.isDone() returns true.
122 int32_t queryAsync(AsyncInfoTy
&AsyncInfo
);
124 /// Calls the corresponding print device info function in the plugin.
125 bool printDeviceInfo();
127 /// Event related interfaces.
130 int32_t createEvent(void **Event
);
132 /// Record the event based on status in AsyncInfo->Queue at the moment the
133 /// function is called.
134 int32_t recordEvent(void *Event
, AsyncInfoTy
&AsyncInfo
);
136 /// Wait for an event. This function can be blocking or non-blocking,
137 /// depending on the implmentation. It is expected to set a dependence on the
138 /// event such that corresponding operations shall only start once the event
140 int32_t waitEvent(void *Event
, AsyncInfoTy
&AsyncInfo
);
142 /// Synchronize the event. It is expected to block the thread.
143 int32_t syncEvent(void *Event
);
145 /// Destroy the event.
146 int32_t destroyEvent(void *Event
);
149 /// Print all offload entries to stderr.
150 void dumpOffloadEntries();
152 /// Ask the device whether the runtime should use auto zero-copy.
153 bool useAutoZeroCopy();
155 /// Check if there are pending images for this device.
156 bool hasPendingImages() const { return HasPendingImages
; }
158 /// Indicate that there are pending images for this device or not.
159 void setHasPendingImages(bool V
) { HasPendingImages
= V
; }
162 /// Deinitialize the device (and plugin).
165 /// All offload entries available on this device.
166 using DeviceOffloadEntriesMapTy
=
167 llvm::DenseMap
<llvm::StringRef
, OffloadEntryTy
>;
168 ProtectedObj
<DeviceOffloadEntriesMapTy
> DeviceOffloadEntries
;
170 /// Handler to collect and organize host-2-device mapping information.
171 MappingInfoTy MappingInfo
;
173 /// Flag to indicate pending images (true after construction).
174 bool HasPendingImages
= true;