@@ -34,6 +34,19 @@ int memcmp(const void *s1, const void *s2, size_t n) {
34
34
return __devicelib_memcmp (s1, s2, n);
35
35
}
36
36
37
+ #if defined(__NVPTX__) || defined(__AMDGCN__)
38
+ // For AMD/Cuda those symbols will be provided by libclc.
39
+ DEVICE_EXTERNAL size_t __spirv_GlobalInvocationId_x ();
40
+ DEVICE_EXTERNAL size_t __spirv_GlobalInvocationId_y ();
41
+ DEVICE_EXTERNAL size_t __spirv_GlobalInvocationId_z ();
42
+ DEVICE_EXTERNAL size_t __spirv_LocalInvocationId_x ();
43
+ DEVICE_EXTERNAL size_t __spirv_LocalInvocationId_y ();
44
+ DEVICE_EXTERNAL size_t __spirv_LocalInvocationId_z ();
45
+ DEVICE_EXTERNAL size_t __spirv_GlobalSize_x ();
46
+ DEVICE_EXTERNAL size_t __spirv_GlobalSize_y ();
47
+ DEVICE_EXTERNAL size_t __spirv_GlobalSize_z ();
48
+ #endif // __NVPTX__ || __AMDGCN__
49
+
37
50
#ifndef __NVPTX__
38
51
39
52
// This simple rand is for ease of use only, the implementation aligns with
@@ -51,13 +64,24 @@ int memcmp(const void *s1, const void *s2, size_t n) {
51
64
DEVICE_EXTERN_C_INLINE
52
65
int rand () {
53
66
size_t gid =
67
+ #if defined(__NVPTX__) || defined(__AMDGCN__)
68
+ (__spirv_GlobalInvocationId_x () * __spirv_GlobalSize_y () *
69
+ __spirv_GlobalSize_z ()) +
70
+ (__spirv_GlobalInvocationId_y () * __spirv_GlobalSize_z ()) +
71
+ __spirv_GlobalInvocationId_z ();
72
+ #else
54
73
(__spirv_BuiltInGlobalInvocationId.x * __spirv_BuiltInGlobalSize.y *
55
74
__spirv_BuiltInGlobalSize.z ) +
56
75
(__spirv_BuiltInGlobalInvocationId.y * __spirv_BuiltInGlobalSize.z ) +
57
76
__spirv_BuiltInGlobalInvocationId.z ;
58
- size_t global_size = __spirv_BuiltInGlobalSize.x *
59
- __spirv_BuiltInGlobalSize.y *
60
- __spirv_BuiltInGlobalSize.z ;
77
+ #endif
78
+ size_t global_size =
79
+ #if defined(__NVPTX__) || defined(__AMDGCN__)
80
+ __spirv_GlobalSize_x () * __spirv_GlobalSize_y () * __spirv_GlobalSize_z ();
81
+ #else
82
+ __spirv_BuiltInGlobalSize.x * __spirv_BuiltInGlobalSize.y *
83
+ __spirv_BuiltInGlobalSize.z ;
84
+ #endif
61
85
size_t gid1 =
62
86
(global_size > RAND_NEXT_LEN) ? (gid & (RAND_NEXT_LEN - 1 )) : gid;
63
87
if (RAND_NEXT_ACC[gid1] == 0 )
@@ -73,13 +97,24 @@ int rand() {
73
97
DEVICE_EXTERN_C_INLINE
74
98
void srand (unsigned int seed) {
75
99
size_t gid =
100
+ #if defined(__NVPTX__) || defined(__AMDGCN__)
101
+ (__spirv_GlobalInvocationId_x () * __spirv_GlobalSize_y () *
102
+ __spirv_GlobalSize_z ()) +
103
+ (__spirv_GlobalInvocationId_y () * __spirv_GlobalSize_z ()) +
104
+ __spirv_GlobalInvocationId_z ();
105
+ #else
76
106
(__spirv_BuiltInGlobalInvocationId.x * __spirv_BuiltInGlobalSize.y *
77
107
__spirv_BuiltInGlobalSize.z ) +
78
108
(__spirv_BuiltInGlobalInvocationId.y * __spirv_BuiltInGlobalSize.z ) +
79
109
__spirv_BuiltInGlobalInvocationId.z ;
80
- size_t global_size = __spirv_BuiltInGlobalSize.x *
81
- __spirv_BuiltInGlobalSize.y *
82
- __spirv_BuiltInGlobalSize.z ;
110
+ #endif
111
+ size_t global_size =
112
+ #if defined(__NVPTX__) || defined(__AMDGCN__)
113
+ __spirv_GlobalSize_x () * __spirv_GlobalSize_y () * __spirv_GlobalSize_z ();
114
+ #else
115
+ __spirv_BuiltInGlobalSize.x * __spirv_BuiltInGlobalSize.y *
116
+ __spirv_BuiltInGlobalSize.z ;
117
+ #endif
83
118
size_t gid1 =
84
119
(global_size > RAND_NEXT_LEN) ? (gid & (RAND_NEXT_LEN - 1 )) : gid;
85
120
RAND_NEXT_ACC[gid1] = seed;
0 commit comments