当许多线程同时读取全局内存中的某个位置时,有多少个事务?

时间:2015-05-17 15:35:56

标签: multithreading opencl

我正在编写一个内核,其中所有线程都将被启动并同时读取全局内存中的相同位置。 我想知道此时会发生什么? 全局内存中的值是否广播到所有线程或是否存在 任何类型的序列化?

我知道当一半的warp线程访问适合全局内存的同一段时,访问将合并为更少的事务。 但是在阅读完全相同的位置时会发生什么? 如果是广播,是否意味着这里不再需要进行任何优化?

我在这里使用AMD 7470。我写了一个迭代,其中所有线程在每次迭代中读取全局内存中相同的4个字节。

2 个答案:

答案 0 :(得分:0)

理想情况下,您希望将每个工作组的可用时间读取为全局内存位置。这意味着您应该将其复制到本地内存中,并且应该针对本地缓存的数据进行进一步的读取。

我发现这通常用大于4个字节的数据块来完成,但只要你避免许多全局读取,就应该节省时间。

local int sharedInt;
int id = get_local_id(0);
if(id == 0){
sharedInt = globalVar;
}
barrier(); //or barrier(CLK_LOCAL_MEM_FENCE) if the compiler complains

现在您了解到每个工作组只读取一次全局数据。

此方法适用于所有设备类型。我相信它会强制CPU上的最低缓存级别,但这将取决于实现。

答案 1 :(得分:0)

大多数GPU将相同位置的读取广播到所有工作项。它在优化指南中有具体提及。