“OpenCL主机可读”;“线程本地”;记忆

“OpenCL主机可读”;“线程本地”;记忆,opencl,Opencl,我的OpenCL内核需要(主机可读的)线程本地内存。让我们看一个例子: //Assume #threads is known to be 8 double threadLocalScalar[8] = {}; //1 scalar per thread for(some range in parallel) threadLocalScalar[getThreadId()] += 1; 这是一个基本的“线程本地内存”解决方案。长度#线程的向量和函数getThreadId()的用法 现在,

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

//Assume #threads is known to be 8
double threadLocalScalar[8] = {}; //1 scalar per thread
for(some range in parallel)
    threadLocalScalar[getThreadId()] += 1;
这是一个基本的“线程本地内存”解决方案。长度#线程的向量和函数getThreadId()的用法

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

然而,我不知道要创建多少“线程”。所以我无法确定threadLocalScalar向量需要多少全局内存。我怎么知道?或者,你知道更好的解决办法吗?我的研究是正确的吗

注:
使用本地内存的问题是我无法从主机读取它。否则,我可以很容易地使用本地内存和work\u grop\u size=1(每个work\u组只有1个“线程”,这意味着本地内存是“线程本地的”.

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


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

get\u num\u Group(dim)似乎告诉我有多少个“线程”将被使用,但此函数是一个内核函数,我需要在宿主代码中提前了解这一点。感谢您的参与。问题是,我的内核会将较大的输入数据缩减为#线程标量。因此,当我的范围为100万时,我应该以#线程或#内核结束主机随后以串行方式求和的标量。因此,对于每个全局_id,我需要知道此项正在使用的“线程id”。我需要知道这一点,以便我可以将结果添加到正确的标量中(不使用同步或数据争用).好吧,我想我现在有点明白了。当你使用OpenCL进行缩减时,并没有很好地定义将使用多少“线程”。因此,与其询问“线程的完美数量是多少”你可以自己决定。如果我有100万个项目要减少,我可以自己决定要使用多少段。在CPU上,这可能是#线程*一些标量,但在GPU上,什么是“线程”并不清楚也不是。所以你只需要根据一些设备的上限进行猜测/调整。这并不完美,但会奏效。