我正在开发一个 OpenCL 程序,但每次执行的输出都不同。我认为这与将参数传递给内核有关,因为当我对特定执行的值进行硬编码时,每次执行后的输出都是相似的。
我的内核看起来像这样:
__kernel void sample_kernel(__global double *BufferA, int scalar1, int scalar2, int scalar3, ...) {
for(int i = -1*scalar1; i < scalar1; i++) {
for(int j = -1*scalar1; j < scalar1, j++) {
if(scalar2 > 0 && scalar3 > 0) // do something.
}
}
}
这就是我设置内核参数的方式:
int scalar1 = 1;
int scalar2 = 2;
int scalar3 = 3;
Samplekernel.setArg(0, d_BufferA);
Samplekernel.setArg(1, sizeof(int), &scalar1);
Samplekernel.setArg(2, sizeof(int), &scalar2);
Samplekernel.setArg(3, sizeof(int), &scalar3);
奇怪的是,当我添加...
if(scalar1 != 1) scalar1 = 1;
if(scalar2 != 2) scalar2 = 2;
if(scalar3 != 3) scalar3 = 3;
...在双 for 循环之前的内核中,输出是正确的。
我在 Nvidia K20m GPU、OpenCL 1.1 版上运行我的程序。当我在 Nvidia C2075 上运行我的代码时,一切似乎都运行良好......
有人知道问题可能是什么吗?看起来该值未正确复制或被覆盖,但我没有在 for 循环之前访问该值...
提前致谢!