2015-10-31 2 views
8

В группе Размер optimization guide of Beignet, an open source implementation of OpenCL targeting Intel GPUsКак максимально использовать SIMD в OpenCL?

Работа должна быть больше, чем 16 и быть кратным 16.

Как два возможных SIMD полос на Gen 8 или 16. Для того, чтобы не тратить SIMD полосы, мы должны следовать этому правилу.

Также упоминается в Compute Architecture of Intel Processor Graphics Gen7.5:

для продуктов на основе Gen7.5, каждый ЕС имеет семь темы в общей сложности 28 Кбайт файла регистров общего назначения (GRF).

...

На Gen7.5 архитектуры вычислительных, большинство моделей программирования SPMD используют этот стиль генерации кода и выполнения процессор ЕС. Фактически, каждый Ядро ядра SPMD, как представляется, выполняется серийно и независимо в пределах собственной SIMD-полосы.

В действительности каждый поток выполняет число SIMD-Width экземпляров ядра> одновременно. Таким образом, для SIMD-16 компиляции из вычислительного ядра, это возможно для SIMD-16 х 7 нитей = 112 экземпляров ядра , чтобы быть выполняется параллельно на одном ЕС. Аналогично, для SIMD-32 x 7 потоков = 224 экземпляров ядра, выполняющихся одновременно на одном ЕС.

Если я правильно понимаю, используя SIMD-16 x 7 threads = 112 kernel instances в качестве примера для того, чтобы запустить 224 потоков на одном ЕС, размер рабочей группы должны быть 16. Затем компилятор OpenCL сбросит 16 экземпляров ядра в 16 lane SIMD thread, и делать это 7 раз на 7 рабочих группах и запускать их в одном ЕС?

Вопрос 1: Я исправлю, пока здесь?

Однако OpenCL spec также предоставляет векторные типы данных. Таким образом, возможно полностью использовать вычислительные ресурсы SIMD-16 в ЕС с помощью обычного программирования SIMD (как в NEON и SSE).

Вопрос 2: Если это так, то использование типа данных типа 16 явно использует ресурсы SIMD-16, поэтому устраняет ограничения по крайней мере на 16 элементов на рабочую группу. Это так?

Вопрос 3: Если все выше верно, то каким образом два подхода сравнить друг с другом: 1) 112 нитей сгиб в 7-SIMD-16 потоков по OpenCL компилятором; 2) 7 собственных потоков, закодированных для явного использования типов данных Vector-16 и операций SIMD-16?

ответ

1
  1. Практически. Вы делаете предположения, что есть один поток на рабочую группу (поток N.B. в этом контексте - это то, что CUDA называет «волной».В Intel GPU говорят, что рабочий элемент является SIMD-каналом потока GPU). Без подгрупп невозможно заставить размер рабочей группы быть точно потоком. Например, если вы выберете размер WG 16, компилятор по-прежнему будет иметь возможность компилировать SIMD8 и распространять его среди двух потоков SIMD8. Имейте в виду, что компилятор выбирает ширину SIMD до того, как ему будет известен размер WG (clCompileProgram предшествует clEnqueueNDRange). subgroups extension может позволить вам принудительно увеличить ширину SIMD, но определенно не реализован в GEN7.5.

  2. Открытые векторные типы OpenCL являются необязательным явным шагом векторизации поверх неявной векторизации, которая уже происходит автоматически. Вы бы использовали, например, float16. Каждый из рабочих элементов будет обрабатывать 16 поплавков каждый, но компилятор все равно будет компилировать, по крайней мере, SIMD8. Следовательно, каждый поток GPU будет обрабатывать (8 * 16) поплавки (параллельно). Это может быть немного излишним. В идеале мы не хотим явно указывать вектор CL, используя явные типы векторов OpenCL. Но иногда бывает полезно, если ядро ​​недостаточно работает (ядра, которые слишком короткие, могут быть плохими). Где-то он говорит, что float4 - хорошее эмпирическое правило.

  3. Я думаю, вы имели в виду 112 рабочих элементов? По собственному потоку вы имеете в виду потоки процессора или потоки GPU?

    • Если вы имели в виду потоки процессора, применяются обычные аргументы в отношении графических процессоров. Графические процессоры хороши, когда ваша программа не сильно расходится (все экземпляры используют аналогичные пути), и вы используете данные достаточно времени, чтобы снизить затраты, переносящие их на GPU (арифметическую плотность).
    • Если вы имели в виду потоки GPU (генераторы GEN SIMD8 или SIMD16). На данный момент нет (общедоступного) способа напрямую программировать потоки графического процессора (EDIT см. subgroups extension (недоступно в GEN7.5)). Если бы вы были в состоянии, это было бы аналогичным компромиссом с языком ассемблера. Работа сложнее, и компилятор иногда просто делает лучшую работу, чем мы можем, но когда вы решаете конкретную проблему и получаете более качественные знания в области, вы можете добиться большего успеха с достаточным усилием программирования (пока аппаратные изменения и предположения вашей умной программы становится недействительным.)