Размер локальной памяти OpenCL и количество вычислительных единиц

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

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

  • (a) как я могу знаете количество мультипроцессоров на устройстве? Это то же самое, что CL_DEVICE_MAX_COMPUTE_UNITS? Могу ли я вывести его из спецификаций, таких какhttp://en.wikipedia.org/wiki/Comparison_of_AMD_graphics_processing_units?
  • (b) как я могу знать, сколько __local память на MP есть на 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? Цена на самом деле не имеет значения, но 64KB (или больше) даст явное преимущество для приложения, которое я пишу, так как мой алгоритм полностью распараллеливается, но также очень интенсивен для памяти с шаблоном случайного доступа в каждом MP (итерация по краям графиков).

1 ответов


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

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

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