OpenCL - Как запросить ширину SIMD устройства? - PullRequest
23 голосов
/ 17 августа 2011

В CUDA существует концепция деформации , которая определяется как максимальное количество потоков, которые могут выполнять одну и ту же инструкцию одновременно в одном элементе обработки.Для NVIDIA этот размер деформации составляет 32 для всех их карт, которые в настоящее время представлены на рынке.

В картах ATI есть аналогичная концепция, но терминология в этом контексте - wavefront .После некоторой охоты я обнаружил, что у моей карты ATI есть размер волнового фронта 64.

Мой вопрос: что я могу сделать, чтобы запросить эту ширину SIMD во время выполнения для OpenCL?

Ответы [ 6 ]

14 голосов
/ 17 августа 2011

Я нашел ответ, который искал. Оказывается, вы не запрашиваете у устройства эту информацию, вы запрашиваете объект ядра (в OpenCL). Мой источник:

http://www.hpc.lsu.edu/training/tutorials/sc10/tutorials/SC10Tutorials/docs/M13/M13.pdf

(стр. 108)

что говорит:

Наиболее эффективные размеры рабочей группы, вероятно, будут кратны собственной ширине выполнения оборудования

  • Размер волнового фронта в AMD говорит / размер деформации в Nvidia говорят
  • Запрос устройства для CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE

Итак, короче говоря, ответ, по-видимому, заключается в вызове метода clGetKernelWorkGroupInfo () с именем параметра CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE. Смотрите эту ссылку для получения дополнительной информации об этом методе:

http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html

6 голосов
/ 23 февраля 2013

В AMD вы можете запросить CL_DEVICE_WAVEFRONT_WIDTH_AMD. Это отличается от CL_DEVICE_SIMD_WIDTH_AMD, который возвращает количество потоков, которые он выполняет в каждом тактовом цикле. Последний может быть меньше размера волнового фронта, и в этом случае для выполнения одной инструкции для всех потоков в волновом фронте требуется несколько тактов.

4 голосов
/ 06 сентября 2011

В NVIDIA вы можете запросить ширину размера деформации, используя clGetDeviceInfo с CL_DEVICE_WARP_SIZE_NV (хотя это всегда 32 для текущих графических процессоров), однако это расширение, поскольку OpenCL не определяет ничего, как деформации или волновые фронты. Я не знаю ни одного расширения AMD, которое позволяло бы запрашивать размер волнового фронта.

2 голосов
/ 22 февраля 2017

Для AMD: clGetDeviceInfo (..., CL_DEVICE_WAVEFRONT_WIDTH_AMD , ...) (если cl_amd_device_attribute_query расширение поддерживается)

Для Nvidia: clGetDeviceInfo (..., CL_DEVICE_WARP_SIZE_NV , ...) (если cl_nv_device_attribute_query расширение поддерживается)

Но нет единого пути . Способ, предложенный Джонатаном ДеКарло, не работает, я использовал его для графических процессоров, если эти два расширения не поддерживаются - например, Intel iGPU, но недавно я столкнулся с неверными результатами на Intel HD 4600 :

Intel HD 4600 говорит CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE = 32 , хотя на самом деле графические процессоры Intel, кажется, имеют волновой фронт, равный 16, поэтому я столкнулся с неверными результатами, все работает нормально, если для волнового фронта использовались барьеры = 16

P.S. У меня недостаточно репутации, чтобы комментировать. Джонатан ДеКарло (Jonathan DeCarlo) ответит по этому поводу. Буду рад, если кто-нибудь добавит комментарий.

0 голосов
/ 17 августа 2011

Для CUDA (с использованием NVIDIA), пожалуйста, посмотрите B.4.5 Руководство по программированию Cuda от NVIDIA. Существует переменная для хранения этой информации. Вы можете запросить эту переменную во время выполнения. Для AMD я не уверен, есть ли такая переменная.

0 голосов
/ 17 августа 2011

Вы можете использовать clGetDeviceInfo, чтобы получить максимальное количество рабочих элементов, которое вы можете иметь в своем локальном рабочем наборе для каждого измерения. Скорее всего, это кратно размеру вашего волнового фронта.

См .: http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html

...