我正在努力了解合并内存。经过一些研究,我了解到合并内存是为了确保线程正在访问顺序内存,以便它可以读取1个单个事务中的所有数据。并且这些数据可以被同一组中的其他线程重用。
然而,当我看一个真实的例子时,我不知道为什么以下函数的合并性差:
__kernel void mapSin(
__global float* input,
__global float* input,
const unsigned int cout)
{
int x = get_global_id(0);
int y = get_global_id(1);
output[x * count + y] = sin(input[x * count + y]);
}
我的猜测是乘法x * count
导致离散内存访问。我对吗?那么改进这个功能的方法是什么,以便能够实现更好的合并?
答案 0 :(得分:2)
是的,你是对的,因为x * count
导致每个工作项读取与附近其他工作项不相邻的内存。内存中的宽读取被部分使用(其余的被丢弃,最终会为每个工作项进行序列化读取)。 x
是代码中“更快移动”的global_id,所以请尝试将其设为id(1)并使y id(0)(然后交换宽度和高度,以便将内核排入队列)。这将使y
对于相邻工作项更改1的id,这将使您的内存访问也相邻,这是获得合并内存访问的方式(一个宽读取可以满足多个工作项;即并行阅读)。