annotate openmp/libomptarget/src/rtl.h @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children 0572611fdcc8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===------------ rtl.h - Target independent OpenMP target RTL ------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // Declarations for handling RTL plugins.
anatofuz
parents:
diff changeset
10 //
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 #ifndef _OMPTARGET_RTL_H
anatofuz
parents:
diff changeset
14 #define _OMPTARGET_RTL_H
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 #include <list>
anatofuz
parents:
diff changeset
17 #include <map>
anatofuz
parents:
diff changeset
18 #include <mutex>
anatofuz
parents:
diff changeset
19 #include <string>
anatofuz
parents:
diff changeset
20 #include <vector>
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 // Forward declarations.
anatofuz
parents:
diff changeset
23 struct DeviceTy;
anatofuz
parents:
diff changeset
24 struct __tgt_bin_desc;
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 struct RTLInfoTy {
anatofuz
parents:
diff changeset
27 typedef int32_t(is_valid_binary_ty)(void *);
anatofuz
parents:
diff changeset
28 typedef int32_t(number_of_devices_ty)();
anatofuz
parents:
diff changeset
29 typedef int32_t(init_device_ty)(int32_t);
anatofuz
parents:
diff changeset
30 typedef __tgt_target_table *(load_binary_ty)(int32_t, void *);
anatofuz
parents:
diff changeset
31 typedef void *(data_alloc_ty)(int32_t, int64_t, void *);
anatofuz
parents:
diff changeset
32 typedef int32_t(data_submit_ty)(int32_t, void *, void *, int64_t);
anatofuz
parents:
diff changeset
33 typedef int32_t(data_retrieve_ty)(int32_t, void *, void *, int64_t);
anatofuz
parents:
diff changeset
34 typedef int32_t(data_delete_ty)(int32_t, void *);
anatofuz
parents:
diff changeset
35 typedef int32_t(run_region_ty)(int32_t, void *, void **, ptrdiff_t *,
anatofuz
parents:
diff changeset
36 int32_t);
anatofuz
parents:
diff changeset
37 typedef int32_t(run_team_region_ty)(int32_t, void *, void **, ptrdiff_t *,
anatofuz
parents:
diff changeset
38 int32_t, int32_t, int32_t, uint64_t);
anatofuz
parents:
diff changeset
39 typedef int64_t(init_requires_ty)(int64_t);
anatofuz
parents:
diff changeset
40
anatofuz
parents:
diff changeset
41 int32_t Idx; // RTL index, index is the number of devices
anatofuz
parents:
diff changeset
42 // of other RTLs that were registered before,
anatofuz
parents:
diff changeset
43 // i.e. the OpenMP index of the first device
anatofuz
parents:
diff changeset
44 // to be registered with this RTL.
anatofuz
parents:
diff changeset
45 int32_t NumberOfDevices; // Number of devices this RTL deals with.
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 void *LibraryHandler;
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 #ifdef OMPTARGET_DEBUG
anatofuz
parents:
diff changeset
50 std::string RTLName;
anatofuz
parents:
diff changeset
51 #endif
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 // Functions implemented in the RTL.
anatofuz
parents:
diff changeset
54 is_valid_binary_ty *is_valid_binary;
anatofuz
parents:
diff changeset
55 number_of_devices_ty *number_of_devices;
anatofuz
parents:
diff changeset
56 init_device_ty *init_device;
anatofuz
parents:
diff changeset
57 load_binary_ty *load_binary;
anatofuz
parents:
diff changeset
58 data_alloc_ty *data_alloc;
anatofuz
parents:
diff changeset
59 data_submit_ty *data_submit;
anatofuz
parents:
diff changeset
60 data_retrieve_ty *data_retrieve;
anatofuz
parents:
diff changeset
61 data_delete_ty *data_delete;
anatofuz
parents:
diff changeset
62 run_region_ty *run_region;
anatofuz
parents:
diff changeset
63 run_team_region_ty *run_team_region;
anatofuz
parents:
diff changeset
64 init_requires_ty *init_requires;
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66 // Are there images associated with this RTL.
anatofuz
parents:
diff changeset
67 bool isUsed;
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 // Mutex for thread-safety when calling RTL interface functions.
anatofuz
parents:
diff changeset
70 // It is easier to enforce thread-safety at the libomptarget level,
anatofuz
parents:
diff changeset
71 // so that developers of new RTLs do not have to worry about it.
anatofuz
parents:
diff changeset
72 std::mutex Mtx;
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 // The existence of the mutex above makes RTLInfoTy non-copyable.
anatofuz
parents:
diff changeset
75 // We need to provide a copy constructor explicitly.
anatofuz
parents:
diff changeset
76 RTLInfoTy()
anatofuz
parents:
diff changeset
77 : Idx(-1), NumberOfDevices(-1), LibraryHandler(0),
anatofuz
parents:
diff changeset
78 #ifdef OMPTARGET_DEBUG
anatofuz
parents:
diff changeset
79 RTLName(),
anatofuz
parents:
diff changeset
80 #endif
anatofuz
parents:
diff changeset
81 is_valid_binary(0), number_of_devices(0), init_device(0),
anatofuz
parents:
diff changeset
82 load_binary(0), data_alloc(0), data_submit(0), data_retrieve(0),
anatofuz
parents:
diff changeset
83 data_delete(0), run_region(0), run_team_region(0),
anatofuz
parents:
diff changeset
84 init_requires(0), isUsed(false), Mtx() {}
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 RTLInfoTy(const RTLInfoTy &r) : Mtx() {
anatofuz
parents:
diff changeset
87 Idx = r.Idx;
anatofuz
parents:
diff changeset
88 NumberOfDevices = r.NumberOfDevices;
anatofuz
parents:
diff changeset
89 LibraryHandler = r.LibraryHandler;
anatofuz
parents:
diff changeset
90 #ifdef OMPTARGET_DEBUG
anatofuz
parents:
diff changeset
91 RTLName = r.RTLName;
anatofuz
parents:
diff changeset
92 #endif
anatofuz
parents:
diff changeset
93 is_valid_binary = r.is_valid_binary;
anatofuz
parents:
diff changeset
94 number_of_devices = r.number_of_devices;
anatofuz
parents:
diff changeset
95 init_device = r.init_device;
anatofuz
parents:
diff changeset
96 load_binary = r.load_binary;
anatofuz
parents:
diff changeset
97 data_alloc = r.data_alloc;
anatofuz
parents:
diff changeset
98 data_submit = r.data_submit;
anatofuz
parents:
diff changeset
99 data_retrieve = r.data_retrieve;
anatofuz
parents:
diff changeset
100 data_delete = r.data_delete;
anatofuz
parents:
diff changeset
101 run_region = r.run_region;
anatofuz
parents:
diff changeset
102 run_team_region = r.run_team_region;
anatofuz
parents:
diff changeset
103 init_requires = r.init_requires;
anatofuz
parents:
diff changeset
104 isUsed = r.isUsed;
anatofuz
parents:
diff changeset
105 }
anatofuz
parents:
diff changeset
106 };
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 /// RTLs identified in the system.
anatofuz
parents:
diff changeset
109 class RTLsTy {
anatofuz
parents:
diff changeset
110 private:
anatofuz
parents:
diff changeset
111 // Mutex-like object to guarantee thread-safety and unique initialization
anatofuz
parents:
diff changeset
112 // (i.e. the library attempts to load the RTLs (plugins) only once).
anatofuz
parents:
diff changeset
113 std::once_flag initFlag;
anatofuz
parents:
diff changeset
114 void LoadRTLs(); // not thread-safe
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 public:
anatofuz
parents:
diff changeset
117 // List of the detected runtime libraries.
anatofuz
parents:
diff changeset
118 std::list<RTLInfoTy> AllRTLs;
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 // Array of pointers to the detected runtime libraries that have compatible
anatofuz
parents:
diff changeset
121 // binaries.
anatofuz
parents:
diff changeset
122 std::vector<RTLInfoTy *> UsedRTLs;
anatofuz
parents:
diff changeset
123
anatofuz
parents:
diff changeset
124 int64_t RequiresFlags;
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126 explicit RTLsTy() {}
anatofuz
parents:
diff changeset
127
anatofuz
parents:
diff changeset
128 // Register the clauses of the requires directive.
anatofuz
parents:
diff changeset
129 void RegisterRequires(int64_t flags);
anatofuz
parents:
diff changeset
130
anatofuz
parents:
diff changeset
131 // Register a shared library with all (compatible) RTLs.
anatofuz
parents:
diff changeset
132 void RegisterLib(__tgt_bin_desc *desc);
anatofuz
parents:
diff changeset
133
anatofuz
parents:
diff changeset
134 // Unregister a shared library from all RTLs.
anatofuz
parents:
diff changeset
135 void UnregisterLib(__tgt_bin_desc *desc);
anatofuz
parents:
diff changeset
136 };
anatofuz
parents:
diff changeset
137 extern RTLsTy RTLs;
anatofuz
parents:
diff changeset
138 extern std::mutex RTLsMtx;
anatofuz
parents:
diff changeset
139
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 /// Map between the host entry begin and the translation table. Each
anatofuz
parents:
diff changeset
142 /// registered library gets one TranslationTable. Use the map from
anatofuz
parents:
diff changeset
143 /// __tgt_offload_entry so that we may quickly determine whether we
anatofuz
parents:
diff changeset
144 /// are trying to (re)register an existing lib or really have a new one.
anatofuz
parents:
diff changeset
145 struct TranslationTable {
anatofuz
parents:
diff changeset
146 __tgt_target_table HostTable;
anatofuz
parents:
diff changeset
147
anatofuz
parents:
diff changeset
148 // Image assigned to a given device.
anatofuz
parents:
diff changeset
149 std::vector<__tgt_device_image *> TargetsImages; // One image per device ID.
anatofuz
parents:
diff changeset
150
anatofuz
parents:
diff changeset
151 // Table of entry points or NULL if it was not already computed.
anatofuz
parents:
diff changeset
152 std::vector<__tgt_target_table *> TargetsTable; // One table per device ID.
anatofuz
parents:
diff changeset
153 };
anatofuz
parents:
diff changeset
154 typedef std::map<__tgt_offload_entry *, TranslationTable>
anatofuz
parents:
diff changeset
155 HostEntriesBeginToTransTableTy;
anatofuz
parents:
diff changeset
156 extern HostEntriesBeginToTransTableTy HostEntriesBeginToTransTable;
anatofuz
parents:
diff changeset
157 extern std::mutex TrlTblMtx;
anatofuz
parents:
diff changeset
158
anatofuz
parents:
diff changeset
159 /// Map between the host ptr and a table index
anatofuz
parents:
diff changeset
160 struct TableMap {
anatofuz
parents:
diff changeset
161 TranslationTable *Table; // table associated with the host ptr.
anatofuz
parents:
diff changeset
162 uint32_t Index; // index in which the host ptr translated entry is found.
anatofuz
parents:
diff changeset
163 TableMap() : Table(0), Index(0) {}
anatofuz
parents:
diff changeset
164 TableMap(TranslationTable *table, uint32_t index)
anatofuz
parents:
diff changeset
165 : Table(table), Index(index) {}
anatofuz
parents:
diff changeset
166 };
anatofuz
parents:
diff changeset
167 typedef std::map<void *, TableMap> HostPtrToTableMapTy;
anatofuz
parents:
diff changeset
168 extern HostPtrToTableMapTy HostPtrToTableMap;
anatofuz
parents:
diff changeset
169 extern std::mutex TblMapMtx;
anatofuz
parents:
diff changeset
170
anatofuz
parents:
diff changeset
171 #endif