Есть ли ограничение на локальную память OpenCL?

Сегодня я добавил еще четыре __local переменных в свое ядро ​​для вывода промежуточных результатов. Но просто добавление еще четырех переменных в сигнатуру ядра и добавление соответствующих аргументов ядра рендерит весь вывод ядра в «0». Ни одна из функций cl не возвращает код ошибки.

Далее я попытался добавить только одну из двух меньших переменных. Если я добавлю только один из них, это сработает, но если я добавлю их обоих, он сломается.

Так может ли такое поведение OpenCL означать, что я выделил много __local памяти? Как мне узнать, сколько __local памяти я могу использовать?


person Framester    schedule 08.03.2011    source источник


Ответы (3)


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

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

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

person Kyle Lutz    schedule 08.03.2011
comment
@einpoklum stackoverflow.com/questions / 31197564 / - person Ciro Santilli 新疆再教育营六四事件ۍ 25.03.2017
comment
@CiroSantilli 烏坎 事件 2016 事件 法轮功: Обновил этот ответ соответственно, спасибо. Пожалуйста, рассмотрите возможность удаления комментария сейчас. - person einpoklum; 25.03.2017
comment
clinfo сообщает об этом как о размере локальной памяти. - person user2580621; 16.05.2020

Конечно, есть, поскольку локальная память является физической, а не виртуальной.

Мы привыкли, начиная с работы с виртуальным адресным пространством на процессорах, чтобы теоретически иметь столько памяти, сколько мы хотим - потенциально сбой при очень больших размерах из-за исчерпания файла подкачки / раздела подкачки, или, возможно, даже не этого, пока мы действительно не попробуем использовать слишком много памяти, чтобы ее нельзя было сопоставить с физической RAM и диском.

Это не относится к таким вещам, как ядро ​​операционной системы компьютера (или его части более низкого уровня), которым требуется доступ к определенным областям в реальной оперативной памяти.

Это также не относится к глобальной и локальной памяти GPU. Отсутствует * подкачка памяти (переназначение воспринимаемых адресов потоков на адреса физической памяти); и никакой подкачки. В частности, что касается локальной памяти, каждый вычислительный блок (= каждый симметричный мультипроцессор на графическом процессоре) имеет группу ОЗУ, используемую в качестве локальной памяти; зеленые плиты здесь:

введите описание изображения здесь

размер каждой такой плиты - это то, что вы получаете с

clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·).

Для иллюстрации, на графических процессорах nVIDIA Kepler размер локальной памяти составляет либо 16 КБайт. или 48 КБ (а дополнение до 64 КБ используется для кэширования доступа к глобальной памяти). Итак, на сегодняшний день локальная память графического процессора очень мала по сравнению с глобальной памятью устройства.


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

person einpoklum    schedule 22.11.2013

Я не уверен, но я чувствовал, что это нужно видеть.

Просто пройдите по следующим ссылкам. Прочтите это.

Замечательное чтение: OpenCL - пространства памяти.

Немного по теме:

person Saurabh Gokhale    schedule 08.03.2011