I'm writing a kernel which calculates a cumulative histogram using a Hillis-Steele Scan pattern. It didn't seem to be working properly - outputting numbers way too high and in the wrong order.
During debugging though, I added a simple printf() function which just prints out the global size for each work item that's run:
kernel void cumulative(global const int *hist, global int *c_hist) {
int id = get_global_id(0);
int size = get_global_size(0);
printf("%d\n", size); //MAKES THE CUMULATIVE HISTOGRAM CORRECT
for (int step = 1; step < size; step *= 2) {
c_hist[id] = hist[id];
if (id >= step) c_hist[id] += hist[id - step];
barrier(CLK_GLOBAL_MEM_FENCE);
global int* tmp = hist; hist = c_hist; c_hist = tmp;
}
}
Is someone able to tell me what's happening here? And is there anything that will also fix this code while not printing 1024 over and over to the console?
Using OpenCL 2 with RTX 2060 - if any other info is needed let me know and I'll find it out!
When your code:
kernel void cumulative(global const int *hist, global int *c_hist) {
int id = get_global_id(0);
int size = get_global_size(0);
for (int step = 1; step < size; step *= 2) {
c_hist[id] = hist[id];
if (id >= step) c_hist[id] += hist[id - step];
barrier(CLK_GLOBAL_MEM_FENCE);
global int* tmp = hist; hist = c_hist; c_hist = tmp;
}
}
is feed to this site it finds following problems:
10:17: warning: initializing '__global int *' with an expression of type 'const __global int *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]
global int* tmp = hist; hist = c_hist; c_hist = tmp;
^ ~~~~
1 warning generated.
00d8ad302736fae9192e5f1d4027e53e.opt.bc: warning: Assuming the arguments 'hist', 'c_hist' of 'cumulative' on line 1 of to be non-aliased; please consider adding a restrict qualifier to these arguments
6:18: error: possible null pointer access for work item (1, 1) in work group (4, 4)
c_hist[id] = hist[id];
6:16: error: possible null pointer access for work item (5, 1) in work group (4, 4)
c_hist[id] = hist[id];
error: possible read-write race on c_hist[1008]:
Write by work item (0, 0) in work group (0, 0), 6:16:
c_hist[id] = hist[id];
Read by work item (20, 1) in work group (4, 4), possible sources are:
6:18:
c_hist[id] = hist[id];
7:32:
if (id >= step) c_hist[id] += hist[id - step];
7:35:
if (id >= step) c_hist[id] += hist[id - step];
error: possible write-write race on hist[1008]:
Write by work item (0, 0) in work group (0, 0), 6:16:
c_hist[id] = hist[id];
Write by work item (20, 1) in work group (4, 4), possible sources are:
6:16:
c_hist[id] = hist[id];
7:32:
if (id >= step) c_hist[id] += hist[id - step];
error: possible write-read race on hist[128]:
Read by work item (0, 0) in work group (4, 0), 6:18:
c_hist[id] = hist[id];
Write by work item (5, 1) in work group (4, 4), possible sources are:
6:16:
c_hist[id] = hist[id];
7:32:
if (id >= step) c_hist[id] += hist[id - step];
GPUVerify kernel analyser finished with 0 verified, 5 errors
Note it reports: error: possible write-read race on hist[128]:
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.