OpenCL медленный доступ к памяти в течение цикла - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть программа, которую я построил в 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 ups.Я предполагаю, что компилятор OpenCL может оптимизировать цикл for для копирования памяти намного быстрее, когда используется 12, но не может, когда используется regionSize.

Кто-нибудь знает, что происходит?Кто-нибудь может мне помочь?

...