Есть ли какое-либо преимущество при использовании floatN вместо float в OpenCL?
Например
float3 position;
и
float posX, posY, posZ;
Спасибо
Есть ли какое-либо преимущество при использовании floatN вместо float в OpenCL?
Например
float3 position;
и
float posX, posY, posZ;
Спасибо
Это зависит от оборудования.
Графические процессоры NVidia имеют скалярную архитектуру, поэтому векторы дают им мало преимуществ по сравнению с написанием чисто скалярного кода. Цитата из Руководства по использованию NVidia OpenCL (ссылка в формате PDF) :
Архитектура CUDA — это скалярная архитектура. Следовательно, использование векторных типов и инструкций не дает выигрыша в производительности. Их следует использовать только для удобства. Также в целом лучше иметь больше рабочих элементов, чем меньше, используя большие векторы.
С процессорами и графическими процессорами ATI вы получите больше преимуществ от использования векторов, поскольку эти архитектуры имеют векторные инструкции (хотя я слышал, что это может быть по-другому на последних Radeon — жаль, что у меня нет ссылки на статью, где я это читал).
Цитирование руководства по программированию ATI Stream OpenCL (ссылка в формате PDF) для процессоров:
Ресурсы SIMD с плавающей запятой в ЦП (SSE) требуют использования векторизованных типов (float4), чтобы обеспечить генерацию упакованного кода SSE и добиться хорошей производительности от оборудования SIMD.
В этой статье проводится сравнение производительности графических процессоров ATI. ядра, написанного с помощью векторов, по сравнению с чистыми скалярными типами.
И в архитектуре Nvidia, и в архитектуре AMD память разделена на банки по 128 бит. Часто чтение одного значения float3 или float4 будет быстрее для контроллера памяти, чем чтение 3 отдельных чисел с плавающей запятой.
Когда вы читаете значения с плавающей запятой из последовательных адресов памяти, вы сильно полагаетесь на то, что компилятор объединит чтение для вас. Нет никакой гарантии, что posX, posY и posZ находятся в одном и том же банке. Объявление его как float3 обычно приводит к тому, что расположение плавающих элементов компонента попадает в один и тот же банк.
То, как графические процессоры обрабатывают векторные вычисления, зависит от поставщика, но доступ к памяти на обеих платформах выиграет от векторизации.
Я не очень хорошо знаком с OpenCL, но в GLSL математические операции с векторами более эффективны, потому что GPU может применять одну и ту же операцию ко всем N компонентам одновременно. Кроме того, в GLSL векторы также поддерживают такие операции, как скалярные произведения, в качестве встроенных функций языка.