У меня есть программа, которую я построил в 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
.
Кто-нибудь знает, что происходит?Кто-нибудь может мне помочь?