Есть ли предел для локальной памяти OpenCL?

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·),

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


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

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

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

Отличное чтение: OpenCL - Memory Spaces.

Немного связанных вещей:

Другие вопросы по тегам