了解OpenCL中的合并

时间:2018-04-26 16:26:40

标签: opencl

我正在努力了解合并内存。经过一些研究,我了解到合并内存是为了确保线程正在访问顺序内存,以便它可以读取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导致离散内存访问。我对吗?那么改进这个功能的方法是什么,以便能够实现更好的合并?

1 个答案:

答案 0 :(得分:2)

是的,你是对的,因为x * count导致每个工作项读取与附近其他工作项不相邻的内存。内存中的宽读取被部分使用(其余的被丢弃,最终会为每个工作项进行序列化读取)。 x是代码中“更快移动”的global_id,所以请尝试将其设为id(1)并使y id(0)(然后交换宽度和高度,以便将内核排入队列)。这将使y对于相邻工作项更改1的id,这将使您的内存访问也相邻,这是获得合并内存访问的方式(一个宽读取可以满足多个工作项;即并行阅读)。