我有一个使用 enqueue_event 的简单设备端内核。一切都按预期工作,直到我定义了一个 clk_event_t,我想用它来排队几个相互等待的内核。问题:在定义 clk_event_t 时,“buffer”数组在每个坐标中自动取值 0.0。如果我删除带有 clk_event_t 定义的行,代码将按预期工作,ScalarMultHelp 完全符合我的要求。似乎缓冲区指针以某种方式被更改,因为设置缓冲区 [0] 和缓冲区 [1] 的行根本没有效果。我的代码(简化):
kernel void ScalarMultiply(global double* A, global double* B, global double* buffer,
global double* buffer_small, int n) {
const size_t gid = get_global_id(0);
buffer[gid] = A[gid] * B[gid];
if (gid == 0) {
const int subthread_size = 256;
ndrange_t ndr = ndrange_1D(n, subthread_size);
clk_event_t marker_event01; // ERROR: sets buffer to {0,0,0,...} !!!!!!!!
if (enqueue_kernel(get_default_queue(), CLK_ENQUEUE_FLAGS_NO_WAIT,
ndr, 0, NULL, NULL, // here, instead of NULL, I will use marker_event01 as returning event
^(local void* target){
scalarMultHelp(buffer, buffer_small, (local double*)target);
}, subthread_size*sizeof(double) ) != CLK_SUCCESS) {
buffer[0] = -1;// not doing anything
release_event(&marker_event01);
return;
}
buffer[0] = 3.0; // not doing anything
release_event(&marker_event01);
buffer[1] = 4.0;// not doing anything
}
内核在 NVIDIA Geforce GTX Ti 1050 上运行,内核程序使用 -cl-std=CL2.0 标志构建,以便使用 NVIDIA 驱动程序启用 opencl 2.0 功能。
我已经尝试找到解决方案很长一段时间了,但我在网上找不到任何东西。