Есть ли предел для локальной памяти 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.
Немного связанных вещей: