annotate openmp/libomptarget/src/rtl.h @ 180:680fa57a2f20

fix compile errors.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 30 May 2020 17:44:06 +0900
parents 0572611fdcc8
children 2e18cbf3894f
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
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
16 #include "omptarget.h"
150
anatofuz
parents:
diff changeset
17 #include <list>
anatofuz
parents:
diff changeset
18 #include <map>
anatofuz
parents:
diff changeset
19 #include <mutex>
anatofuz
parents:
diff changeset
20 #include <string>
anatofuz
parents:
diff changeset
21 #include <vector>
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 // Forward declarations.
anatofuz
parents:
diff changeset
24 struct DeviceTy;
anatofuz
parents:
diff changeset
25 struct __tgt_bin_desc;
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 struct RTLInfoTy {
anatofuz
parents:
diff changeset
28 typedef int32_t(is_valid_binary_ty)(void *);
anatofuz
parents:
diff changeset
29 typedef int32_t(number_of_devices_ty)();
anatofuz
parents:
diff changeset
30 typedef int32_t(init_device_ty)(int32_t);
anatofuz
parents:
diff changeset
31 typedef __tgt_target_table *(load_binary_ty)(int32_t, void *);
anatofuz
parents:
diff changeset
32 typedef void *(data_alloc_ty)(int32_t, int64_t, void *);
anatofuz
parents:
diff changeset
33 typedef int32_t(data_submit_ty)(int32_t, void *, void *, int64_t);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
34 typedef int32_t(data_submit_async_ty)(int32_t, void *, void *, int64_t,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
35 __tgt_async_info *);
150
anatofuz
parents:
diff changeset
36 typedef int32_t(data_retrieve_ty)(int32_t, void *, void *, int64_t);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
37 typedef int32_t(data_retrieve_async_ty)(int32_t, void *, void *, int64_t,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
38 __tgt_async_info *);
150
anatofuz
parents:
diff changeset
39 typedef int32_t(data_delete_ty)(int32_t, void *);
anatofuz
parents:
diff changeset
40 typedef int32_t(run_region_ty)(int32_t, void *, void **, ptrdiff_t *,
anatofuz
parents:
diff changeset
41 int32_t);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
42 typedef int32_t(run_region_async_ty)(int32_t, void *, void **, ptrdiff_t *,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
43 int32_t, __tgt_async_info *);
150
anatofuz
parents:
diff changeset
44 typedef int32_t(run_team_region_ty)(int32_t, void *, void **, ptrdiff_t *,
anatofuz
parents:
diff changeset
45 int32_t, int32_t, int32_t, uint64_t);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
46 typedef int32_t(run_team_region_async_ty)(int32_t, void *, void **,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
47 ptrdiff_t *, int32_t, int32_t,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
48 int32_t, uint64_t,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
49 __tgt_async_info *);
150
anatofuz
parents:
diff changeset
50 typedef int64_t(init_requires_ty)(int64_t);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
51 typedef int64_t(synchronize_ty)(int64_t, __tgt_async_info *);
150
anatofuz
parents:
diff changeset
52
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
53 int32_t Idx = -1; // RTL index, index is the number of devices
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
54 // of other RTLs that were registered before,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
55 // i.e. the OpenMP index of the first device
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
56 // to be registered with this RTL.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
57 int32_t NumberOfDevices = -1; // Number of devices this RTL deals with.
150
anatofuz
parents:
diff changeset
58
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
59 void *LibraryHandler = nullptr;
150
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 #ifdef OMPTARGET_DEBUG
anatofuz
parents:
diff changeset
62 std::string RTLName;
anatofuz
parents:
diff changeset
63 #endif
anatofuz
parents:
diff changeset
64
anatofuz
parents:
diff changeset
65 // Functions implemented in the RTL.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
66 is_valid_binary_ty *is_valid_binary = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
67 number_of_devices_ty *number_of_devices = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
68 init_device_ty *init_device = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
69 load_binary_ty *load_binary = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
70 data_alloc_ty *data_alloc = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
71 data_submit_ty *data_submit = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
72 data_submit_async_ty *data_submit_async = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
73 data_retrieve_ty *data_retrieve = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
74 data_retrieve_async_ty *data_retrieve_async = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
75 data_delete_ty *data_delete = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
76 run_region_ty *run_region = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
77 run_region_async_ty *run_region_async = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
78 run_team_region_ty *run_team_region = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
79 run_team_region_async_ty *run_team_region_async = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
80 init_requires_ty *init_requires = nullptr;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
81 synchronize_ty *synchronize = nullptr;
150
anatofuz
parents:
diff changeset
82
anatofuz
parents:
diff changeset
83 // Are there images associated with this RTL.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
84 bool isUsed = false;
150
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 // Mutex for thread-safety when calling RTL interface functions.
anatofuz
parents:
diff changeset
87 // It is easier to enforce thread-safety at the libomptarget level,
anatofuz
parents:
diff changeset
88 // so that developers of new RTLs do not have to worry about it.
anatofuz
parents:
diff changeset
89 std::mutex Mtx;
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 // The existence of the mutex above makes RTLInfoTy non-copyable.
anatofuz
parents:
diff changeset
92 // We need to provide a copy constructor explicitly.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
93 RTLInfoTy() = default;
150
anatofuz
parents:
diff changeset
94
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
95 RTLInfoTy(const RTLInfoTy &r) {
150
anatofuz
parents:
diff changeset
96 Idx = r.Idx;
anatofuz
parents:
diff changeset
97 NumberOfDevices = r.NumberOfDevices;
anatofuz
parents:
diff changeset
98 LibraryHandler = r.LibraryHandler;
anatofuz
parents:
diff changeset
99 #ifdef OMPTARGET_DEBUG
anatofuz
parents:
diff changeset
100 RTLName = r.RTLName;
anatofuz
parents:
diff changeset
101 #endif
anatofuz
parents:
diff changeset
102 is_valid_binary = r.is_valid_binary;
anatofuz
parents:
diff changeset
103 number_of_devices = r.number_of_devices;
anatofuz
parents:
diff changeset
104 init_device = r.init_device;
anatofuz
parents:
diff changeset
105 load_binary = r.load_binary;
anatofuz
parents:
diff changeset
106 data_alloc = r.data_alloc;
anatofuz
parents:
diff changeset
107 data_submit = r.data_submit;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
108 data_submit_async = r.data_submit_async;
150
anatofuz
parents:
diff changeset
109 data_retrieve = r.data_retrieve;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
110 data_retrieve_async = r.data_retrieve_async;
150
anatofuz
parents:
diff changeset
111 data_delete = r.data_delete;
anatofuz
parents:
diff changeset
112 run_region = r.run_region;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
113 run_region_async = r.run_region_async;
150
anatofuz
parents:
diff changeset
114 run_team_region = r.run_team_region;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
115 run_team_region_async = r.run_team_region_async;
150
anatofuz
parents:
diff changeset
116 init_requires = r.init_requires;
anatofuz
parents:
diff changeset
117 isUsed = r.isUsed;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
118 synchronize = r.synchronize;
150
anatofuz
parents:
diff changeset
119 }
anatofuz
parents:
diff changeset
120 };
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 /// RTLs identified in the system.
anatofuz
parents:
diff changeset
123 class RTLsTy {
anatofuz
parents:
diff changeset
124 private:
anatofuz
parents:
diff changeset
125 // Mutex-like object to guarantee thread-safety and unique initialization
anatofuz
parents:
diff changeset
126 // (i.e. the library attempts to load the RTLs (plugins) only once).
anatofuz
parents:
diff changeset
127 std::once_flag initFlag;
anatofuz
parents:
diff changeset
128 void LoadRTLs(); // not thread-safe
anatofuz
parents:
diff changeset
129
anatofuz
parents:
diff changeset
130 public:
anatofuz
parents:
diff changeset
131 // List of the detected runtime libraries.
anatofuz
parents:
diff changeset
132 std::list<RTLInfoTy> AllRTLs;
anatofuz
parents:
diff changeset
133
anatofuz
parents:
diff changeset
134 // Array of pointers to the detected runtime libraries that have compatible
anatofuz
parents:
diff changeset
135 // binaries.
anatofuz
parents:
diff changeset
136 std::vector<RTLInfoTy *> UsedRTLs;
anatofuz
parents:
diff changeset
137
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
138 int64_t RequiresFlags = OMP_REQ_UNDEFINED;
150
anatofuz
parents:
diff changeset
139
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
140 explicit RTLsTy() = default;
150
anatofuz
parents:
diff changeset
141
anatofuz
parents:
diff changeset
142 // Register the clauses of the requires directive.
anatofuz
parents:
diff changeset
143 void RegisterRequires(int64_t flags);
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 // Register a shared library with all (compatible) RTLs.
anatofuz
parents:
diff changeset
146 void RegisterLib(__tgt_bin_desc *desc);
anatofuz
parents:
diff changeset
147
anatofuz
parents:
diff changeset
148 // Unregister a shared library from all RTLs.
anatofuz
parents:
diff changeset
149 void UnregisterLib(__tgt_bin_desc *desc);
anatofuz
parents:
diff changeset
150 };
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
151 extern RTLsTy *RTLs;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
152 extern std::mutex *RTLsMtx;
150
anatofuz
parents:
diff changeset
153
anatofuz
parents:
diff changeset
154
anatofuz
parents:
diff changeset
155 /// Map between the host entry begin and the translation table. Each
anatofuz
parents:
diff changeset
156 /// registered library gets one TranslationTable. Use the map from
anatofuz
parents:
diff changeset
157 /// __tgt_offload_entry so that we may quickly determine whether we
anatofuz
parents:
diff changeset
158 /// are trying to (re)register an existing lib or really have a new one.
anatofuz
parents:
diff changeset
159 struct TranslationTable {
anatofuz
parents:
diff changeset
160 __tgt_target_table HostTable;
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 // Image assigned to a given device.
anatofuz
parents:
diff changeset
163 std::vector<__tgt_device_image *> TargetsImages; // One image per device ID.
anatofuz
parents:
diff changeset
164
anatofuz
parents:
diff changeset
165 // Table of entry points or NULL if it was not already computed.
anatofuz
parents:
diff changeset
166 std::vector<__tgt_target_table *> TargetsTable; // One table per device ID.
anatofuz
parents:
diff changeset
167 };
anatofuz
parents:
diff changeset
168 typedef std::map<__tgt_offload_entry *, TranslationTable>
anatofuz
parents:
diff changeset
169 HostEntriesBeginToTransTableTy;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
170 extern HostEntriesBeginToTransTableTy *HostEntriesBeginToTransTable;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
171 extern std::mutex *TrlTblMtx;
150
anatofuz
parents:
diff changeset
172
anatofuz
parents:
diff changeset
173 /// Map between the host ptr and a table index
anatofuz
parents:
diff changeset
174 struct TableMap {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
175 TranslationTable *Table = nullptr; // table associated with the host ptr.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
176 uint32_t Index = 0; // index in which the host ptr translated entry is found.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
177 TableMap() = default;
150
anatofuz
parents:
diff changeset
178 TableMap(TranslationTable *table, uint32_t index)
anatofuz
parents:
diff changeset
179 : Table(table), Index(index) {}
anatofuz
parents:
diff changeset
180 };
anatofuz
parents:
diff changeset
181 typedef std::map<void *, TableMap> HostPtrToTableMapTy;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
182 extern HostPtrToTableMapTy *HostPtrToTableMap;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
183 extern std::mutex *TblMapMtx;
150
anatofuz
parents:
diff changeset
184
anatofuz
parents:
diff changeset
185 #endif