1

如何声明一个对 OpenCL 中的所有线程都是全局的设备变量?我正在将一些代码从 CUDA 移植到 OpenCL。在我的 CUDA 实现中,我有类似的东西

...
...

__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 示例代码,但无法弄清楚如何做到这一点。任何建议都会很棒!

4

2 回答 2

1

不幸的是,这并不是直接移植。虽然我不完全确定您是否至少可以在 OpenCL 程序中定义和使用(读/写)这样一个全局变量(但我不这么认为),但绝对没有办法访问(读/写)这个变量来自主机。

你要做的就是把它作为一个额外的内核参数放入内核。如果它仅由主机写入并由内核读取,则普通int变量就足够了(因此每个内核都有一个副本)。但在您的情况下,因为它也写入内核并从主机读取,它必须是一个__global指针,一个适当的缓冲区绑定到该指针:

__kernel void func(..., __global int *d_var) { ... }

然后,您可以使用通常的缓冲区功能在主机上对其进行读取和写入(*d_var当然,在内核中通过经典的指针取消引用,但请记住,如果不是原子的,并发写入此变量会产生未指定的结果)。

于 2013-05-14T15:40:49.477 回答
0

对于适合变量的小项目,将它们作为参数传递。

对于较大的常量项,使用 OpenCL“常量”地址空间。它针对广播使用进行了优化。

在您的 CUDA 示例中,您将数据读回。在 OpenCL 中,您需要为此使用常规缓冲区对象,因为参数不会读回主机,并且常量内存是只读的。

于 2013-05-15T02:25:39.207 回答