diff --git a/libdevice/crt_wrapper.cpp b/libdevice/crt_wrapper.cpp index 9c3e1c84a539b..c3786c1453e24 100644 --- a/libdevice/crt_wrapper.cpp +++ b/libdevice/crt_wrapper.cpp @@ -51,13 +51,24 @@ int memcmp(const void *s1, const void *s2, size_t n) { DEVICE_EXTERN_C_INLINE int rand() { size_t gid = +#if defined(__NVPTX__) || defined(__AMDGCN__) + (__spirv_GlobalInvocationId_x() * __spirv_GlobalSize_y() * + __spirv_GlobalSize_z()) + + (__spirv_GlobalInvocationId_y() * __spirv_GlobalSize_z()) + + __spirv_GlobalInvocationId_z(); +#else (__spirv_BuiltInGlobalInvocationId.x * __spirv_BuiltInGlobalSize.y * __spirv_BuiltInGlobalSize.z) + (__spirv_BuiltInGlobalInvocationId.y * __spirv_BuiltInGlobalSize.z) + __spirv_BuiltInGlobalInvocationId.z; - size_t global_size = __spirv_BuiltInGlobalSize.x * - __spirv_BuiltInGlobalSize.y * - __spirv_BuiltInGlobalSize.z; +#endif + size_t global_size = +#if defined(__NVPTX__) || defined(__AMDGCN__) + __spirv_GlobalSize_x() * __spirv_GlobalSize_y() * __spirv_GlobalSize_z(); +#else + __spirv_BuiltInGlobalSize.x * __spirv_BuiltInGlobalSize.y * + __spirv_BuiltInGlobalSize.z; +#endif size_t gid1 = (global_size > RAND_NEXT_LEN) ? (gid & (RAND_NEXT_LEN - 1)) : gid; if (RAND_NEXT_ACC[gid1] == 0) @@ -73,13 +84,24 @@ int rand() { DEVICE_EXTERN_C_INLINE void srand(unsigned int seed) { size_t gid = +#if defined(__NVPTX__) || defined(__AMDGCN__) + (__spirv_GlobalInvocationId_x() * __spirv_GlobalSize_y() * + __spirv_GlobalSize_z()) + + (__spirv_GlobalInvocationId_y() * __spirv_GlobalSize_z()) + + __spirv_GlobalInvocationId_z(); +#else (__spirv_BuiltInGlobalInvocationId.x * __spirv_BuiltInGlobalSize.y * __spirv_BuiltInGlobalSize.z) + (__spirv_BuiltInGlobalInvocationId.y * __spirv_BuiltInGlobalSize.z) + __spirv_BuiltInGlobalInvocationId.z; - size_t global_size = __spirv_BuiltInGlobalSize.x * - __spirv_BuiltInGlobalSize.y * - __spirv_BuiltInGlobalSize.z; +#endif + size_t global_size = +#if defined(__NVPTX__) || defined(__AMDGCN__) + __spirv_GlobalSize_x() * __spirv_GlobalSize_y() * __spirv_GlobalSize_z(); +#else + __spirv_BuiltInGlobalSize.x * __spirv_BuiltInGlobalSize.y * + __spirv_BuiltInGlobalSize.z; +#endif size_t gid1 = (global_size > RAND_NEXT_LEN) ? (gid & (RAND_NEXT_LEN - 1)) : gid; RAND_NEXT_ACC[gid1] = seed; diff --git a/libdevice/spirv_vars.h b/libdevice/spirv_vars.h index dca38c8645457..fbeb82e4901e5 100644 --- a/libdevice/spirv_vars.h +++ b/libdevice/spirv_vars.h @@ -10,11 +10,23 @@ #define __LIBDEVICE_SPIRV_VARS_H #include "device.h" +#include -#if defined(__SPIR__) || defined(__SPIRV__) || defined(__NVPTX__) || \ - defined(__AMDGCN__) +#if defined(__NVPTX__) || defined(__AMDGCN__) +// For AMD/Cuda those symbols will be provided by libclc. +DEVICE_EXTERNAL size_t __spirv_GlobalInvocationId_x(); +DEVICE_EXTERNAL size_t __spirv_GlobalInvocationId_y(); +DEVICE_EXTERNAL size_t __spirv_GlobalInvocationId_z(); +DEVICE_EXTERNAL size_t __spirv_LocalInvocationId_x(); +DEVICE_EXTERNAL size_t __spirv_LocalInvocationId_y(); +DEVICE_EXTERNAL size_t __spirv_LocalInvocationId_z(); +DEVICE_EXTERNAL size_t __spirv_GlobalSize_x(); +DEVICE_EXTERNAL size_t __spirv_GlobalSize_y(); +DEVICE_EXTERNAL size_t __spirv_GlobalSize_z(); +#endif // __NVPTX__ || __AMDGCN__ + +#if defined(__SPIR__) || defined(__SPIRV__) -#include #include #define __SPIRV_VAR_QUALIFIERS EXTERN_C const @@ -63,5 +75,5 @@ const size_t_vec __spirv_BuiltInGlobalInvocationId{}; const size_t_vec __spirv_BuiltInLocalInvocationId{}; #endif // !__SPIR__ && !__SPIRV__ -#endif // __SPIR__ || __SPIRV__ || __NVPTX__ || __AMDGCN__ +#endif // __SPIR__ || __SPIRV__ #endif // __LIBDEVICE_SPIRV_VARS_H