/ / Има ли ограничение за OpenCL локалната памет? - opencl, gpgpu, gpu-shared-memory

Има ли ограничение за локалната памет на OpenCL? - opencl, gpgpu, gpu-споделена памет

Днес добавих още четири __local променливи на ядрото ми за изхвърляне на междинен продуктНо само добавяне на още четири променливи към подпис на ядрото и добавяне на съответните аргументи на ядрото прави целия изход на ядрото на "0" s.

Освен това се опитах да добавя само една от двете по-малки променливи. Ако добавя само един от тях, той работи, но ако добавя и двете, той се разпада.

Така можеше това поведение на OpenCL да означава, че аз съм отделил много __local памет? Как да разбера колко __local паметта е използваема от мен?

Отговори:

19 за отговор № 1

Размерът на локалната памет, която устройството предлага за всяко от своите изчислителни единици, може да бъде запитан с помощта на CL_DEVICE_LOCAL_MEM_SIZE с флаг clGetDeviceInfo функция:

cl_ulong size;
clGetDeviceInfo(deviceID, CL_DEVICE_LOCAL_MEM_SIZE, sizeof(cl_ulong), &size, 0);

Върнатият размер е в байтове. Всяка работна група може да разпредели тази памет точно за себе си. Обърнете внимание обаче, че ако не разпредели максимум, това може да попречи на планирането на други работни групи едновременно на същото изчислително устройство.


6 за отговор № 2

Разбира се, има и локална памет физически отколкото виртуален.

Използваме се от работа с виртуален адреспространство на процесори, за да има теоретично толкова памет, колкото искаме - потенциално пропадане при много големи размери, поради изтичане на файл за виртуална памет / размяна на дялове, или може би дори не, докато всъщност не се опитаме да използваме прекалено много памет, така че да може “ t да се картографира към физическата RAM и диска.

Това не е така за неща като компютърното ядро ​​на OS (или части от него от по-ниско ниво), които имат нужда от достъп до конкретни области в действителната RAM.

Също така не е случаят с GPU глобалната и локалната памет. Няма* пейджинг на паметта (преначертаване на възприеманата нишкаадреси към адреси на физическа памет); и без размяна. Конкретно по отношение на локалната памет, всяка изчислителна единица (= всеки симетричен мултипроцесор на GPU) има куп RAM, използван като локална памет; зелените плочи тук:

въведете описанието на изображението тук

размерът на всяка такава плоча е това, което получавате

clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·).

За да илюстрирам, на nVIDIA Kepler GPUs, размерът на локалната памет е или 16 KBytes или 48 KBytes (и допълнението към 64 KBytes се използва за кеширане на достъп до Global Memory). И така, от днес Местната памет на GPU е много малка в сравнение с глобалната памет на устройството.


1 - На nVIDIA графичните процесори, започващи с архитектурата Pascal, се поддържа пейджинг; но това не е обичайният начин за използване на паметта на устройството.


4 за отговор № 3

Не съм сигурен, но усещах, че това трябва да се види.

Просто преминете през следните връзки. Прочети го.

Чудесно четиво: OpenCL - пространства с памет.

Малко свързани неща: