17 #include <shared_mutex>
24 template <
class To,
class From> To
ur_cast(From Value) {
26 assert(
sizeof(From) ==
sizeof(To));
30 template <> uint32_t
inline ur_cast(uint64_t Value) {
32 uint32_t CastedValue = (uint32_t)(Value);
33 assert((uint64_t)CastedValue == Value);
40 (ur_device_info_t)0x103D;
43 (ur_command_t)((uint32_t)UR_COMMAND_FORCE_UINT32 - 1);
47 #define __SYCL_UR_PROGRAM_METADATA_TAG_REQD_WORK_GROUP_SIZE \
48 "@reqd_work_group_size"
49 #define __SYCL_UR_PROGRAM_METADATA_GLOBAL_ID_MAPPING "@global_id_mapping"
52 [[noreturn]]
inline void die(
const char *Message) {
53 std::cerr <<
"die: " << Message << std::endl;
61 const char *UrRet = std::getenv(
"UR_L0_SINGLE_THREAD_MODE");
62 const char *PiRet = std::getenv(
"SYCL_PI_LEVEL_ZERO_SINGLE_THREAD_MODE");
63 const bool RetVal = UrRet ? std::stoi(UrRet) : (PiRet ? std::stoi(PiRet) : 0);
71 std::shared_mutex Mutex;
93 Mutex.unlock_shared();
127 std::this_thread::yield();
132 std::atomic_flag MLock = ATOMIC_FLAG_INIT;
140 template <
class T>
struct ZeCache :
private T {
159 #define UR_ASSERT(condition, error) \
182 template <
typename T,
typename Assign>
183 ur_result_t
getInfoImpl(
size_t param_value_size,
void *param_value,
184 size_t *param_value_size_ret,
T value,
185 size_t value_size, Assign &&assign_func) {
186 if (!param_value && !param_value_size_ret) {
187 return UR_RESULT_ERROR_INVALID_NULL_POINTER;
190 if (param_value !=
nullptr) {
192 if (param_value_size < value_size) {
193 return UR_RESULT_ERROR_INVALID_SIZE;
196 assign_func(param_value, value, value_size);
199 if (param_value_size_ret !=
nullptr) {
200 *param_value_size_ret = value_size;
203 return UR_RESULT_SUCCESS;
206 template <
typename T>
207 ur_result_t
getInfo(
size_t param_value_size,
void *param_value,
208 size_t *param_value_size_ret,
T value) {
210 auto assignment = [](
void *param_value,
T value,
size_t value_size) {
211 std::ignore = value_size;
212 *
static_cast<T *
>(param_value) = value;
215 return getInfoImpl(param_value_size, param_value, param_value_size_ret, value,
216 sizeof(
T), assignment);
219 template <
typename T>
221 void *param_value,
size_t *param_value_size_ret,
223 return getInfoImpl(param_value_size, param_value, param_value_size_ret, value,
224 array_length *
sizeof(
T),
memcpy);
227 template <
typename T,
typename RetType>
229 void *param_value,
size_t *param_value_size_ret,
232 memset(param_value, 0, param_value_size);
233 for (uint32_t I = 0; I < array_length; I++)
234 ((RetType *)param_value)[I] = (RetType)value[I];
236 if (param_value_size_ret)
237 *param_value_size_ret = array_length *
sizeof(RetType);
238 return UR_RESULT_SUCCESS;
244 size_t *param_value_size_ret,
const char *value) {
245 return getInfoArray(strlen(value) + 1, param_value_size, param_value,
246 param_value_size_ret, value);
275 template <
class RetType,
class T>