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

сегодня я добавил еще четыре!--0--> переменные для моего ядра, чтобы сбросить промежуточные результаты. Но просто добавление еще четырех переменных к сигнатуре ядра и добавление соответствующих аргументов ядра выводит все выходные данные ядра на "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. Нет* подкачка памяти (переназначение воспринимаемых адресов потоков на адреса физической памяти); и нет подкачки. В частности, что касается локальной памяти, каждый вычислительный блок (= каждый симметричный мультипроцессор на GPU) имеет кучу оперативной памяти, используемой в качестве локальной памяти; зеленые плиты здесь:

enter image description here

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

clGetDeviceInfo( · , CL_DEVICE_LOCAL_MEM_SIZE, · , ·).

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


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


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

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

больше читать : OpenCL-Пространства Памяти.

немного связанные вещи :