2015-07-31 4 views
1

Я прочитал пару вопросов по SO для этой темы (режим SIMD), но все же небольшое уточнение/подтверждение того, как все работает.SIMD-8, SIMD-16 или SIMD-32 в opencl на gpgpu

Why use SIMD if we have GPGPU?

SIMD intrinsics - are they usable on gpus?

CPU SIMD vs GPU SIMD?

Подписчиков точки правильно, если я компиляции кода в режиме SIMD-8? 1) это означает, что выполнение 8 команд разных рабочих элементов выполняется параллельно.

2) Означает ли это, что все рабочие элементы выполняют одну и ту же инструкцию?

3) если каждый код элемента wrok содержит нагрузку vload16, затем float16, а затем только операции vstore16. Режим SIMD-8 по-прежнему будет работать. Я хочу сказать, верно ли, что GPU до выполнения той же инструкции (либо vload16/float16/vstore16) для всех 8 рабочих элементов?

Как я должен понимать эту концепцию?

+0

Интересный вопрос. Я никогда не слышал, чтобы кто-нибудь делал оптимизацию SIMD на GPU. – user3528438

+1

Графические процессоры используют (почти) тот же SIMD, что и у процессоров - только модель программирования отличается, демонстрируя скалярные потоки на графическом процессоре и векторные потоки на процессоре. –

+0

Любые комментарии к пункту 3) –

ответ

0

В прошлом многие поставщики OpenCL требовали использовать векторные типы для использования SIMD. В настоящее время поставщики OpenCL упаковывают рабочие элементы в SIMD, поэтому нет необходимости использовать типы векторов. Можно ли использовать векторные типы, можно проверить, запросив: CL_DEVICE_PREFERRED_VECTOR_WIDTH_<CHAR, SHORT, INT, LONG, FLOAT, DOUBLE>.

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

+0

Так что, если я использую инструкции, такие как vload16 или float16 в коде ядра. Я увеличиваю избыточную работу за элемент. Разве вы не думаете, что если я последую этому, это аннулирует существование инструкций типа vload16 или float16. –

+0

Проблема в том, что это действительно настраиваемый фактор. Это может сделать это, с другой стороны, вы можете обнаружить, что ваше ядро ​​извлекает из упаковки больше операций ALU в каждый рабочий элемент. Посмотрите на это скорее как оптимизация цикла. Вам может не понадобиться, чтобы получить сопоставление SIMD, но вы можете получить дополнительную информацию о независимых операциях ALU. В этот момент вам просто нужно поэкспериментировать, чтобы найти наилучшую комбинацию всех этих факторов или полагаться на эвристику, которую использует компилятор. – Lee

+0

Ребята, я совершенно смущен концепцией здесь. Я думаю, что я даже не знаю, как отображать SIMD-движок в ALU. Я работаю над архитектурой Intel. Не могли бы вы отобразить это первым? Вот ссылка на его документ: https://software.intel.com/sites/default/files/managed/71/a2/Compute%20Architecture%20of%20Intel%20Processor%20Graphics%20Gen8.pdf –