поплавок VS поплавок N

Есть ли какое-либо преимущество при использовании floatN вместо float в OpenCL?

Например

float3 position;

и

float posX, posY, posZ;

Спасибо


person Michelle    schedule 19.01.2012    source источник


Ответы (3)


Это зависит от оборудования.

Графические процессоры NVidia имеют скалярную архитектуру, поэтому векторы дают им мало преимуществ по сравнению с написанием чисто скалярного кода. Цитата из Руководства по использованию NVidia OpenCL (ссылка в формате PDF) :

Архитектура CUDA — это скалярная архитектура. Следовательно, использование векторных типов и инструкций не дает выигрыша в производительности. Их следует использовать только для удобства. Также в целом лучше иметь больше рабочих элементов, чем меньше, используя большие векторы.

С процессорами и графическими процессорами ATI вы получите больше преимуществ от использования векторов, поскольку эти архитектуры имеют векторные инструкции (хотя я слышал, что это может быть по-другому на последних Radeon — жаль, что у меня нет ссылки на статью, где я это читал).

Цитирование руководства по программированию ATI Stream OpenCL (ссылка в формате PDF) для процессоров:

Ресурсы SIMD с плавающей запятой в ЦП (SSE) требуют использования векторизованных типов (float4), чтобы обеспечить генерацию упакованного кода SSE и добиться хорошей производительности от оборудования SIMD.

В этой статье проводится сравнение производительности графических процессоров ATI. ядра, написанного с помощью векторов, по сравнению с чистыми скалярными типами.

person prunge    schedule 20.01.2012
comment
В новейшей архитектуре AMD Graphics Core Next (также известной как GCN), на которой работают видеокарты серии Radeon HD 7900, в качестве основного вычислительного блока используется SIMD шириной 16, поэтому все еще есть веские причины для использования векторных типов. - person user57368; 20.01.2012
comment
Всем спасибо ребята за ответы :) - person Michelle; 20.01.2012
comment
@ user57368: На самом деле, насколько я понимаю, GCN работает так же, как и NVidia, и предоставляет программе только скалярную архитектуру, поэтому не было бы веской причины использовать там векторные типы. В конце концов, NVidia также использует 16-разрядные модули SIMD на фермах, но они выставляются как 16 скалярных модулей. Таким образом, это должно значительно уменьшить полезность векторных типов на gpu (и сблизить программирование для nvidia и amd, что хорошо) - person Grizzly; 20.01.2012
comment
Единственная скалярная часть вычислительной единицы GCN — это единица специальных функций, которая обрабатывает ветви и трансцендентные функции. Базовые ALU состоят из блоков по 16, которые одновременно выполняют одну и ту же инструкцию. Если вы не используете векторные типы, вы полагаетесь на то, что компилятор сможет соответствующим образом планировать инструкции и развертывать циклы, чтобы получить полное использование. Явное использование векторных типов не может повредить и может только облегчить работу компилятора. - person user57368; 20.01.2012
comment
@ user57368: Опять же, из того, что я читал, gcn работает так же, как nvidia, и предоставляет скалярную архитектуру (где 16 потоков (или больше?) следуют одному и тому же пути выполнения). Я никогда не говорил, что базовая архитектура является скалярной (опять же, Fermi запрограммирован так, как если бы он был скалярным, но использует simd 16wide). Компилятор не выполняет для этого никакого планирования/развертывания, поскольку каждый поток в основном вычисляет один элемент данных блока simd. Поэтому использование векторных типов (особенно шириной 16) вряд ли облегчит работу компилятора и может фактически снизить производительность из-за увеличения нагрузки на регистры. - person Grizzly; 26.01.2012

И в архитектуре Nvidia, и в архитектуре AMD память разделена на банки по 128 бит. Часто чтение одного значения float3 или float4 будет быстрее для контроллера памяти, чем чтение 3 отдельных чисел с плавающей запятой.

Когда вы читаете значения с плавающей запятой из последовательных адресов памяти, вы сильно полагаетесь на то, что компилятор объединит чтение для вас. Нет никакой гарантии, что posX, posY и posZ находятся в одном и том же банке. Объявление его как float3 обычно приводит к тому, что расположение плавающих элементов компонента попадает в один и тот же банк.

То, как графические процессоры обрабатывают векторные вычисления, зависит от поставщика, но доступ к памяти на обеих платформах выиграет от векторизации.

person mfa    schedule 20.01.2012
comment
Я думаю, что это может быть правдой, хотя nvidia имела в виду другое, когда заявляла, что от использования векторных инструкций нет никакой пользы. Однако есть ли у вас резервная копия, когда вы говорите, что при использовании float3/float4 расположения компонентов попадают в один и тот же банк? Разве это не зависит также от компилятора? - person Zk1001; 19.07.2012
comment
Определенно зависит от компилятора. Хотя я не могу придумать причину, по которой компилятор/драйвер замедлял бы векторные типы. Многие типы пикселей имеют размер 3 или с плавающей запятой, и GPU необходимо оптимизировать для этого по крайней мере. - person mfa; 19.07.2012
comment
Я согласен, и если у вас есть конкретные доказательства, такие как некоторые эксперименты, я хотел бы знать. - person Zk1001; 24.07.2012

Я не очень хорошо знаком с OpenCL, но в GLSL математические операции с векторами более эффективны, потому что GPU может применять одну и ту же операцию ко всем N компонентам одновременно. Кроме того, в GLSL векторы также поддерживают такие операции, как скалярные произведения, в качестве встроенных функций языка.

person Russell Zahniser    schedule 19.01.2012