Есть ли предел для локальной памяти OpenCL? - PullRequest
10 голосов
/ 08 марта 2011

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

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

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

Ответы [ 3 ]

20 голосов
/ 08 марта 2011

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

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

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

6 голосов
/ 22 ноября 2013

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

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

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

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

enter image description here

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

clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·).

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


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

4 голосов
/ 08 марта 2011

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

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

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

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

...