физическая память на устройствах AMD: локальная или частная

Я пишу алгоритм на OpenCL, в котором мне нужно, чтобы каждая рабочая единица запоминала изрядную часть данных, скажем, что-то между long[70] и long[200] или около того для каждого ядра.

Последние устройства AMD имеют 32 КиБ __local памяти, что (для данного количества данных на ядро) достаточно для хранения информации для 20-58 единиц работы. Однако, насколько я понимаю из архитектуры (и особенно из этого рисунка), каждое ядро ​​шейдера также имеет выделенный объем собственной памяти. Однако я не могу найти его размер.

Может ли кто-нибудь сказать мне, как узнать, сколько личной памяти имеет каждое ядро?

Меня особенно интересует HD7970, так как я планирую купить некоторые из них в ближайшее время.

Изменить: проблема решена, ответ здесь в приложении D.


person user1111929    schedule 17.02.2012    source источник
comment
Я не верю, что личная память выделяется для каждого ядра — она отображается в регистровый файл, который относится к ресурсу вычислительной единицы. Каждый рабочий элемент получает регистры, выделенные из файла регистров вычислительного блока, требуемое количество которых определяет количество волновых фронтов в полете в любой момент времени.   -  person talonmies    schedule 17.02.2012
comment
Из известного вездесущего рисунка codeproject.com/KB/showcase/Memory -Spaces/image001.jpg Я пришел к выводу, что частная память физически отличается от __local памяти, не так ли?   -  person user1111929    schedule 18.02.2012
comment
Да, они физически разные. Частная память сопоставляется с регистровым файлом вычислительного блока, локальная память — с общей памятью уровня вычислительного блока в большинстве современных устройств AMD. Некоторые ранние графические процессоры, совместимые с OpenCL, не имели встроенной общей памяти, а локальная память представляла собой просто SDRAM. Ни то, ни другое не зависит от ядра, и то, сколько вы используете на рабочий элемент для частного и на рабочую группу для локального, влияет на количество одновременных волновых фронтов, работающих на вычислительную единицу.   -  person talonmies    schedule 18.02.2012
comment
В порядке. Тогда я должен переформулировать свой вопрос: насколько велик этот регистровый файл? Как узнать его размер, либо вообще, либо конкретно для HD7970.   -  person user1111929    schedule 18.02.2012
comment
Я думаю, вы не поняли - частная память (как следует из названия) является частной для каждого рабочего элемента. Но он выделяется каждому рабочему элементу из регистрового файла (файлов) вычислительной единицы, который действует как общий пул ресурсов для всех рабочих элементов, работающих на данной вычислительной единице. И я почти уверен, что компилятор AMD устанавливает жесткое ограничение в 256 регистров на рабочую единицу, независимо от размера регистрового файла (файлов) на графическом процессоре.   -  person talonmies    schedule 18.02.2012
comment
И какой размер 1 регистра? 64 бита? Если да, то это жесткое ограничение в 2 КБ на рабочий элемент, что довольно много, не так ли? Я предполагаю, что он должен быть намного меньше (иначе моя проблема решается тривиально, поскольку она может содержать long[200] чисто в регистре).   -  person user1111929    schedule 18.02.2012
comment
Я думаю, что каждый регистр представляет собой 32-битное слово. Но помните, что все остальные переменные в вашем коде также используют регистры. Кажется, я помню, что типичные графические процессоры AMD имеют регистровый файл размером 64 КБ на вычислительную единицу, который должен совместно использоваться как минимум 4 или 8 волновыми фронтами по 64 рабочих элемента в каждом. Но я мало пользуюсь их оборудованием, так что это может быть неправильно. Проверьте текущие примечания к выпуску в их OpenCL SDK.   -  person talonmies    schedule 18.02.2012
comment
Действительно, есть, спасибо! Он находится в Приложении D Руководства по программированию OpenCL для приложений AMD developer.amd.com/sdks /amdappsdk/assets/. Судя по всему, регистр имеет размер 128 бит (4x32), а для всех современных высокопроизводительных устройств их 16384, так что это замечательные 256 КБ на вычислительную единицу. Ницца! Если вы можете поместить это в новый ответ, я могу принять его и закрыть тему.   -  person user1111929    schedule 19.02.2012


Ответы (3)


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

Эти значения можно найти в Приложении D Руководства по программированию AMD APP OpenCL http://developer.amd.com/sdks/amdappsdk/assets/amd_accelerated_parallel_processing_opencl_programming_guide.pdf (аналогичный документ существует для nVidia). Судя по всему, регистр для устройств AMD составляет 128 бит (4x32), а для всех современных высокопроизводительных устройств существует 16384 регистра, так что это замечательные 256 КБ на вычислительную единицу.

person user1111929    schedule 01.03.2012

Я думаю, вы ищете __local memory. Это то, что имеет в виду 32 КБ локального хранилища данных. Я не думаю, что вы можете опросить устройство, чтобы получить объем частной памяти.

Вы можете передать ссылку NULL long* cl_mem для выделения памяти. Я думаю, что лучше всего использовать статический объем памяти на WI. Предполагая, что long[200] потребуется для каждого рабочего элемента, вы должны использовать приведенный ниже код. Также было бы неплохо разделить работу на группы с одинаковыми (или похожими) требованиями к памяти, чтобы максимально эффективно использовать память LDS.

void __kernel(__local long* localMem, const int localMemPerItem
       //more args...
       )
{
  //host has 'passed' localMemPerItem*get_local_size() long values in as locamMem
  //this work item has access to all of it, but can choose to restrict
  //itself to only the portion it needs.
  //work group size will be limited to CL_DEVICE_LOCAL_MEM_SIZE/(8*localMemPerItem)
  int startIndex=localMemPerItem*get_local_id(0);
  //use localMem[startIndex+ ... ]
}
person mfa    schedule 17.02.2012
comment
Вы не можете его опросить, но существует ли он? Из известного вездесущего рисунка codeproject.com/KB/showcase/Memory -Spaces/image001.jpg Я предположил, что на каждой рабочей единице существует физически отдельный набор частных регистров. Нет? Я надеялся каким-то образом превзойти ограничение CL_DEVICE_LOCAL_MEM_SIZE/(8*localMemPerItem), так как примерно половина ядер остается неиспользованной. Доступ к глобальной памяти, вероятно, будет слишком медленным, даже если он только увеличивает счетчик. - person user1111929; 18.02.2012
comment
Я нашел дополнительную информацию о размерах регистров кипариса, каймана и ферми здесь: realworldtech. com/page.cfm?ArticleID=RWT121410213827&p=11 Вы должны быть в состоянии настроить некоторые приватные переменные приличного размера до этого размера. Я думаю, что LDS по-прежнему будет вашим лучшим выбором. - person mfa; 19.02.2012

Чтобы ответить, насколько велик регистровый файл на карте серии 79xx, поскольку он основан на архитектуре GCN, он составляет 64 КБ, как показано на изображении в anandtech: http://www.anandtech.com/print/5261

Чтобы ответить на ваш вопрос, как узнать, сколько памяти использует каждое ядро... вы можете посмотреть, как запустить AMD APP Profiler на вашем ядре, он расскажет вам в разделе занятости ядра, сколько места используется ядром.

person kiranputtur    schedule 20.02.2012
comment
Да неужели? Это странно. Я думал, что нашел ответ, но он другой. В руководстве по программированию AMD OpenCL developer.amd.com/sdks/amdappsdk/assets/ в Приложении D указан общий размер файла реестра, и он указан как 256 КБ для всех современных устройств. Что сейчас правильно? :С - person user1111929; 20.02.2012
comment
Я считаю, что оба правильны. Насколько я понимаю, в архитектуре GCN на один модуль SIMD приходится 64 КБ регистрового файла, и на каждый вычислительный модуль приходится 4 модуля SIMD, т.е. 4 * 64 КБ = 256 КБ всего регистрового файла на вычислительную единицу. - person talonmies; 20.02.2012