如何为OpenCL中的所有线程声明一个全局设备变量? 我正在将一些代码从CUDA移植到OpenCL。在我的CUDA实现我有类似全局设备变量OpenCL
...
...
__device__ int d_var;
...
...
void foo() {
int h_var = 0
cudaMemcpyToSymbol(d_var, h_var, sizeof(int));
do{
//launch kernel, inside kernel d_var is modified
cudaMemcpyFromSymbol(h_var, d_var, sizeof(int));
}while(h_var != 0);
}
我一直在读通过OpenCL的例子代码,但无法弄清楚如何做到这一点。 任何建议将是伟大的!
对不起,我在我的代码中犯了一个错误。有一个主机** h_var **和一个设备** d_var **,然后我从device2host来回复制。我想我将不得不按照你的建议创建另一个缓冲区。我试着用'__kernel void foo(...,__constant int d_var)',但是我得到一个错误,是因为d_var不是指针吗? – BRabbit27 2013-05-14 17:12:09
@ BRabbit27 *“是否因为d_var不是指针?” - 是的。我了解你的代码示例,答案仍然适用。你必须为你的'd_var'(仅仅是一个'int'或者一个更大的缓冲区的子缓冲区)创建一个缓冲区,并使用通常的缓冲区读/写从那里复制到'h_var',反之亦然操作。然后像往常一样将此缓冲区作为'* d_var'参数的内核参数传递。顺便说一下,如果你想在内核中写入'd_var',就像你在问题中写的那样,你需要'__global'而不是'__constant'。 – 2013-05-14 17:16:12
哦,是的,我的错误,我会马上尝试。 – BRabbit27 2013-05-14 18:42:23