10
10
#include < stdio.h>
11
11
#include < cuda.h>
12
12
typedef unsigned int dataType;
13
- #define ArraySize 10
13
+ #define ArraySize 11
14
14
#define numThreads 256
15
15
#define numBlocks 64
16
16
17
+ const dataType Limit = 139 ;
18
+
19
+
17
20
__global__ void atomic_test_kernel (dataType *ddata) {
18
21
19
22
unsigned int tid = blockDim .x * blockIdx .x + threadIdx .x ;
@@ -38,7 +41,8 @@ __global__ void atomic_test_kernel(dataType *ddata) {
38
41
atomicXor (&ddata[8 ], tid);
39
42
// Inc test
40
43
atomicInc (&ddata[9 ], 0 );
41
-
44
+ // Dec test
45
+ atomicDec (&ddata[10 ], Limit);
42
46
}
43
47
44
48
int main (int argc, char **argv) {
@@ -60,7 +64,7 @@ int main(int argc, char **argv) {
60
64
Hdata[7 ] = 0 ; // or
61
65
Hdata[8 ] = 0xff ; // xor
62
66
Hdata[9 ] = 10 ; // inc
63
-
67
+ Hdata[ 10 ] = 0 ; // dec
64
68
65
69
// allocate device memory for result
66
70
dataType *Ddata;
@@ -116,12 +120,21 @@ int main(int argc, char **argv) {
116
120
err = -1 ;
117
121
printf (" atomicXor test failed , %d \n " , Hdata2[8 ]);
118
122
}
119
- // check Xor Hdata2[9]
123
+ // check Inc Hdata2[9]
120
124
if (Hdata2[9 ] != 0 ) {
121
125
err = -1 ;
122
- printf (" atomicInc test failed , %d \n " , Hdata2[8 ]);
126
+ printf (" atomicInc test failed , %d \n " , Hdata2[9 ]);
123
127
}
124
128
129
+ dataType val = 0 ;
130
+ for (int i = 0 ; i < 256 * 64 ; ++i) {
131
+ val = ((val == 0 ) || (val > Limit)) ? Limit : val - 1 ;
132
+ }
133
+ // check dec Hdata2[10]
134
+ if (Hdata2[10 ] != val) {
135
+ err = -1 ;
136
+ printf (" atomicDec test failed , %d \n " , Hdata2[10 ]);
137
+ }
125
138
126
139
cudaFree (Ddata);
127
140
printf (" atomic test completed, returned %s\n " , err == 0 ? " OK" : " ERROR" );
0 commit comments