OpenCL主机可读“线程本地”内存

时间:2015-08-30 06:08:05

标签: opencl

我的OpenCL内核需要(主机可读)线程本地内存。我们来看一个例子:

//Assume #threads is known to be 8
double threadLocalScalar[8] = {}; //1 scalar per thread
for(some range in parallel)
    threadLocalScalar[getThreadId()] += 1;

这是一个基本的“线程本地内存”解决方案。一个长度为#threads的向量和函数getThreadId()的用法。

现在,我需要在OpenCL中执行相同的操作(或任何相同的操作)。到目前为止,我的研究是使用函数get_group_id(0)来获取工作组ID(为简单起见,可能使用工作组大小= 1)。这样我知道“线程”正在执行什么,并且可以修改全局存储器向量的正确部分。

但是,我不知道将创建多少“线程”。所以我无法确定threadLocalScalar向量需要多少全局内存。我怎么知道这个?或者,您知道更好的解决方案吗?我的研究是否正确?

注意: 使用本地内存的问题是我无法从主机读取它。否则我可以轻松使用本地内存和work_grop_size = 1(每个work_group只有1个“线程”,这意味着本地内存是“本地线程”。

1 个答案:

答案 0 :(得分:0)

如果相邻工作项需要访问相同的全局内存位置,则只需要共享本地内存;使用共享本地内存意味着您只需要为每个工作组读取一次全局值,而不是多次。

您的代码示例(threadLocalScalar[getThreadId()] += 1)没有这样做,它只是增加每个工作项的内存位置(独立工作),因此您不需要共享本地内存。只需根据global_id(0)增加全局内存。