OpenCL for循环中的慢速内存访问

时间:2018-12-16 13:08:29

标签: memory opencl

我有一个内置于OpenCL中的程序,其中每个内核都访问位于全局内存中的只读缓冲区。在某些时候,每个内核都需要将某些数据从全局内存复制到临时缓冲区中。我做了一个for循环,将一个全局内存的一个字节一个字节地复制到临时缓冲区中。我使用clEnqueueNDRangeKernel命令执行上述内核,该命令位于while循环内。为了测量clEnqueueNDRangeKernel命令的速度,我添加了一个称为ups(每秒更新)的计数器,该计数器在每个while循环结束时增加。我每隔一秒钟打印一次计数器的值并将其设置为零。

我注意到我的程序运行缓慢,大约运行了53次。经过一番调查,我发现问题出在上述的内存复制循环上。这是代码:

typedef uchar byte;

byte tempBuffer[128]

byte* destPtr = (byte*)&tempBuffer0];
__global const byte* srcPtr = (__global const byte*)globalMemPtr;

for(size_t k = 0; k < regionSize; ++k)
{
    destPtr[k] = srcPtr[k];
}

变量globalMemPtr中的指针指向需要复制到临时缓冲区和tempBuffer临时缓冲区中的全局内存区域。变量regionSize保留要复制的区域的大小(以字节为单位)。在这种情况下,其值为12。

我注意到的是,如果我将regionSize替换为12,则内核的运行速度要快得多,大约90秒钟。我的假设是,使用12时,OpenCL编译器可以优化for循环以更快地复制内存,但是使用regionSize时,则不能。

有人知道发生了什么吗?有人可以帮我吗?

0 个答案:

没有答案