全局设备变量OpenCL

时间:2013-05-14 15:04:40

标签: cuda opencl

如何声明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示例代码,但无法弄清楚如何执行此操作。 任何建议都会很棒!

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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

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