【发布时间】:2013-02-18 16:09:49
【问题描述】:
我正在开发一个 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 循环之前访问该值...
提前致谢!
【问题讨论】:
-
您是否在不同的线程中使用相同的 Samplekernel?
-
是的。我为尽可能多的线程启动内核。
-
我的意思是宿主程序中的线程。 clSetKernelArg 不是线程安全的。
-
啊。不,我没有在不同的线程中使用它...
标签: opencl kernel argument-passing