2016-07-07 19 views
1

Я ищу код AVX-256/512 для float4/double4 struct, который перегружает основные операции *, +, /, -, scale by scalar и т. Д., Чтобы получить быстрый прирост производительности от вектора операции в коде, написанном с использованием float4/double4. OpenCL имеет эти типы данных как встроенные, но код C++, работающий на XeonPhi, нуждается в новых реализациях, использующих 512-битные SIMD-единицы.AVX float4/double4 struct

+1

Отключить тему и не рекомендуется. Использование векторов SIMD в качестве векторов иногда является разумным, но очень часто плохая идея - рассматривать точечные продукты и нормализацию, выполняя их горизонтально, неэффективно. Конечно, добавление отлично. Поэтому это зависит от того, какие операции вы намерены выполнять на векторах. – harold

+0

Я знаю, что точечные продукты плохо подходят для этого подхода. Операции, которые я хочу, это *, +, /, -, + =, - =,/=, * =, mulitply и делить на скаляр – user1382302

+1

Хорошо, тогда все в порядке. Конечно, на самом деле он не будет использовать 512-битный SIMD, 4 удваивают всего 256 бит – harold

ответ

1

Что вы ищете, это Agner Fog's Vector Class Library(VCL). Я использовал это в основном для замены векторных типов в OpenCL.

С VCL float4 является Vec4f и double4 является Vec4d. Как и OpenCL, вам не нужно беспокоиться об AVX и AVX512. Если вы используете Vec8d и скомпилируете для AVX, он будет эмулировать AVX512 с использованием двух регистров AVX.

VCL имеет все необходимые операции, такие как *,+,/,-,+=,-=,/=,*=, multiply and divide by scalar и многие другие функции.

Основное отличие от OpenCL и VCL заключается в том, что OpenCL в основном создает диспетчер процессора. В то время как в VCL вам приходится писать диспетчер CPU самостоятельно (он включает в себя некоторый пример кода для этого с документацией). VCL имеет оптимизированные функции для SSE2 через AVX512, поэтому вы можете настроить несколько наборов инструкций. Существует даже a special version of the VCL для Рыцарей Уголок Xeon Phi.

Еще одна особенность OpenCL, которую я пропустил, - это синтаксис перестановки. В OpenCL для изменения порядка компонентов float4 вы можете сделать v.wzyx, тогда как с VCL вы бы сделали permute4f<3,2,1,0>(v). Возможно, мне будет create this syntax with C++, но я не уверен.

Использование VCL, OpenMP и специализированного диспетчера процессора Я в значительной степени заменил OpenCL на CPU.

 Смежные вопросы

  • Нет связанных вопросов^_^