Что такое 4-сторонняя SIMD-версия выбора с плавающей запятой на платформе OSX Accelerate? - PullRequest
1 голос
/ 25 августа 2011

Используя Accelerate Framework из OSX, вы получаете доступ к 4-сторонней функциональности SIMD, где вы можете работать с векторными числами, векторными целочисленными значениями и векторными числами. Это дает вам 4-х стороннее деление, например а также 4-х сторонний грех, cos, tan и т. д.

Для векторного типа с плавающей точкой из 4 чисел, фреймворк обеспечивает vFloat . Для векторного bool из 4 bools, структура предоставляет vBool32 .

Я пытаюсь выполнить 4-х стороннюю SIMD-версию этой строки кода:

  float a = ...;
  float b = ...;
  bool  condition = ...;

  float selected = condition ? a : b;

На процессоре Cell, например, вы бы использовали встроенный spu_sel (val1, val2, условный).

Я попытался записать 4-х сторонний выбор как:

vFloat a = { ... };
vFloat b = { ... };
vBool32 condition = { ... };

vFloat selected = condition ? a : b;

... который не принимается компилятором LLVM, как '?' Оператор не принимает vBool32. Кроме того, на упомянутой выше веб-странице нет оператора с именем vsel или vself или чего-то подобного. Есть ли вообще возможность выбора с плавающей запятой в этой структуре? И если да, то как получить к нему доступ?

1 Ответ

2 голосов
/ 25 августа 2011

Если вы хотите работать на этом уровне абстракции, вам, вероятно, придется довольствоваться умножением на 1.0f или 0.0f, чтобы достичь желаемого результата. На самом деле это все еще довольно эффективно, потому что AltiVec и SSE могут выдавать как минимум одно умножение с плавающей запятой SIMD за такт.

Если вы хотите добиться максимальной производительности, я думаю, вам нужно перейти к программированию на SIMD и использовать соответствующие встроенные функции (vec_sel в случае AltiVec, _mm_blend_ps в случае SSE4, _mm_and_ps / _mm_andnot_ps / _mm_or_ps в случае более старых реализаций SSE).

...