Собственные правила ограничения векторовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Собственные правила ограничения векторов

Сообщение Anonymous »

Учитывая, что код C++ скомпилирован в x86/64 (GCC 11, -O2):

Код: Выделить всё

    static constexpr int N = 4;
typedef std::complex cfloat;
typedef Eigen::Vector VectorNf;
typedef Eigen::Vector VectorNz;

void vop5a1 (VectorNf & a, const VectorNz & b)
{
a = b.array().abs2();       // No SIMD
}
void vop5a2 (VectorNf * __restrict__ a, const VectorNz * __restrict__ b)
{
*a = b->array().abs2();     // SIMD if restrict present
}
void vop5c (VectorNf & a, const VectorNz & b)
{
for (int i = 0; i < N; i++)
{  // tests restrict then SIMD (2 mulps, 1 addps) else scalar x86
a[i] = std::norm(b[i]);
}
}
Сгенерированный код x86-64 для vop5a1 не использует SIMD.
vop5a2 эквивалентен API в стиле C и генерирует инструкции SIMD.
Код vop5c выполняет динамический тест отсутствия перекрытия между a et b, а затем имеет скалярный код «then SIMD else».
Какую магию мне следует добавить в vop5a1, чтобы включить SIMD кодирование?

Подробнее здесь: https://stackoverflow.com/questions/792 ... trict-rule
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»