Размер локальной памяти OpenCL и количество вычислительных блоков - PullRequest
7 голосов
/ 15 января 2012

Каждое устройство с графическим процессором (AMD, NVidea или любое другое) разделено на несколько вычислительных блоков (мультипроцессоров), каждое из которых имеет фиксированное количество ядер (VertexShaders / StreamProcessors).Таким образом, у каждого есть (Compute Units) x (VertexShaders/compute unit) одновременных процессоров для вычисления, но для MultiProcessor доступно только небольшое фиксированное количество __local памяти (обычно 16 КБ или 32 КБ).Следовательно, точное число этих мультипроцессоров имеет значение.

Теперь мои вопросы:

  • (а) Как узнать количество мультипроцессоров на устройстве?Это так же, как CL_DEVICE_MAX_COMPUTE_UNITS?Могу ли я вывести его из спецификаций, таких как http://en.wikipedia.org/wiki/Comparison_of_AMD_graphics_processing_units?
  • (б) Как я могу узнать, сколько __local памяти на МП доступно на GPU, прежде чем покупать его?Конечно, я могу запросить CL_DEVICE_LOCAL_MEM_SIZE на компьютере, на котором он работает, но я не понимаю, как я могу вывести его даже из отдельного подробного листа спецификаций, такого как http://www.amd.com/us/products/desktop/graphics/7000/7970/Pages/radeon-7970.aspx#3?
  • (c)Какая карта на данный момент самая большая CL_DEVICE_LOCAL_MEM_SIZE?Цена на самом деле не имеет значения, но 64 КБ (или больше) дадут явное преимущество для приложения, которое я пишу, так как мой алгоритм полностью распараллеливаем, но также сильно потребляет память с шаблоном произвольного доступа в каждом MP (итерация по краям)графиков).

1 Ответ

7 голосов
/ 16 января 2012
  1. CL_DEVICE_MAX_COMPUTE_UNITS должно дать вам количество ComputeUnits, в противном случае вы можете посмотреть его из соответствующих руководств ( Руководство по программированию AMD Opencl и Руководство по программированию Nvidia OpenCL )
  2. Связанное руководство для AMD содержит информацию о доступной локальной памяти на вычислительную единицу (обычно 32 КБ / CU).Для NVIDIA быстрый поиск в Google показал этот документ , который дает размер локальной памяти в 16 КБ / CU для графических процессоров на базе G80 и G200.Для карт на основе Fermi (GF100) доступно 64 КБ встроенной памяти, которую можно настроить как локальную память 48 КБ и кэш-память L1 16 КБ, так и локальную память 16 КБ и кэш-память L1 48 КБ.Кроме того, карты на основе Fermi имеют кэш-память второго уровня размером до 768 КБ (768 КБ для GF100 и GF110, 512 КБ для GF104 и GF114 и 384 КБ для GF106 и GF116, но не для GF108 и GF118 согласно Википедии).
  3. Из приведенной выше информации.Казалось бы, у современных видеокарт nvidia больше всего локальной памяти на вычислительную единицу.Более того, он единственный, с моим общим кэшем L2.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...