如何声明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示例代码,但无法弄清楚如何执行此操作。 任何建议都会很棒!
答案 0 :(得分:1)
不幸的是,这不是那么直接的端口。虽然我不完全确定你是否能在OpenCL程序中至少定义和使用(读/写)这样的全局变量(但我不这么认为),绝对没有办法访问(读/写)来自主机的这个变量。
您需要做的是将其作为额外的内核参数放入内核。如果它只由主机写入并由内核读取,则普通的int
变量就足够了(因此每个内核都有一个副本)。但在你的情况下,因为它也写在内核中并从主机读取,它必须是一个__global
指针,绑定适当的缓冲区:
__kernel void func(..., __global int *d_var) { ... }
然后,您可以使用通常的缓冲区功能在主机上读取和写入(当然,在内核中通过经典指针解除引用*d_var
,但请记住,对此变量的并发写入未指定如果不是原子的结果)。
答案 1 :(得分:0)
对于适合变量的小项目,将它们作为参数传递。
对于较大的常量项,请使用OpenCL“常量”地址空间。它针对广播使用进行了优化。
在您的CUDA示例中,您将数据退回。在OpenCL中,您需要使用常规缓冲区对象,因为参数不会被读回主机,而常量内存是只读的。