OpenCL getDeviceInfo: как получить информацию о ядрах процессора?

С помощью getDeviceInfo OpenCL можно получить количество доступных вычислительных единиц (CL_DEVICE_MAX_COMPUTE_UNITS). На моем nVidia Geforce 8600GTS у меня есть 4 вычислительных блока с 8 ядрами на блок. С помощью getDeviceInfo(...CL_DEVICE_MAX_COMPUTE_UNITS...) я получаю 4 в качестве ответа для вычислительных единиц. Но как я могу получить информацию о количестве ядер на вычислительную единицу?

Спецификация OpenCL не дает никаких указаний на этот счет. Кто-нибудь знает, как стандартным способом получить количество ядер на вычислительную единицу?


person Rick-Rainer Ludwig    schedule 01.05.2011    source источник


Ответы (1)


Я не знаю, как это сделать - даже базовые API-интерфейсы CUDA в настоящее время не раскрывают внутреннюю конфигурацию многопроцессорной системы. В контексте OpenCL, где вычислительная единица вполне может быть ядром ЦП, раскрытие внутренней конфигурации SIMD через API не имеет особого смысла и в любом случае не так уж и полезно.

NVIDIA предоставляет расширение cl_nv_device_attribute_query, которое предоставит вам вычислительные возможности CUDA устройства. Затем это сопоставляется с ядрами на вычислительную единицу как:

1.0, 1.1, 1.2, 1.3: 8 cores per execution unit
2.0: 32 cores per execution unit
2.1: 48 cores per execution unit

Вы должны закодировать это в подпрограмму и поддерживать ее в актуальном состоянии по мере изменения оборудования. Основываясь на специфике аппаратного обеспечения NVIDIA и опираясь на расширение NVIDIA OpenCL, все вышеперечисленное полностью непереносимо на другие платформы.

person talonmies    schedule 02.05.2011
comment
Спасибо за ответ. Я считаю, что было бы целесообразно раскрыть внутреннюю конфигурацию SIMD. Для размеров локальной рабочей группы с локальной памятью было бы неплохо знать количество ядер для оптимизации рабочих пакетов. - person Rick-Rainer Ludwig; 02.05.2011
comment
@ Рик-Райнер Людвиг: Проблема в том, что количество ядер в исполнительном блоке NVIDIA или AMD напрямую не связано с конфигурацией SIMD. В оборудовании NVIDIA ширина SIMD всегда равна 32, независимо от того, имеет ли исполнительный блок 8, 32 или 48 ядер. Параметр оптимизации, который вы должны использовать, — это размер локальной группы, и вы не устанавливаете его в соответствии с количеством ядер в исполнительной единице — вы устанавливаете его так, чтобы получить оптимальное количество варпов/волновых фронтов на исполнительную единицу. - person talonmies; 02.05.2011
comment
@talonmies: Кажется, я что-то здесь упускаю. Я делаю своего рода умножение матриц с подматрицами общей памяти для оптимизации производительности. Он очень похож на образец nVidia oclMatrixMul. Общая память, насколько я понимаю, находится на ЦП, и все ядра ЦП имеют к ней доступ (8 ядер на моей карте) и поэтому могут ими использоваться. Поэтому каждая подматрица должна рассчитываться процессором с их 8 ядрами. Разные рабочие группы распределены по разным ЦП, но одна рабочая группа находится на ЦП. (Я так понимаю руководство по программированию OpenCL.) Я ошибаюсь? - person Rick-Rainer Ludwig; 02.05.2011
comment
@ Рик-Райнер Людвиг: Одним словом, да, вы не правы. Я не могу дать вам полный ответ в длине комментария, но базовая модель исполнения всего оборудования с поддержкой NVIDIA CUDA/OpenCL заключается в том, что деформации 32 потоков выполняются в стиле SIMD на каждом мультипроцессоре. В 8-ядерном MP каждая инструкция для варпа выполняется 4 раза на 8 ядрах, чтобы удалиться для 32-поточного варпа. Количество ядер не имеет отношения к модели программирования — каждому MP требуется много деформаций, чтобы покрыть задержку конвейера, и они могут поступать из более чем одной рабочей группы (или блока CUDA). - person talonmies; 02.05.2011
comment
Спасибо. Понятно. Деформации не так хорошо задокументированы. Даже в официальных книгах. ;-) Благодаря вашим подсказкам я нашел дополнительную информацию по этой теме и функцию clGetKernelWorkGroupInfo, которая помогает мне в дальнейшем. - person Rick-Rainer Ludwig; 03.05.2011
comment
Ага. В настоящее время эмпирическим правилом является деформация размера 32 для NVIDIA и деформация размера 64 для AMD. - person Chad Brewbaker; 10.05.2011