Код: Выделить всё
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]);
}
}
vop5a2 эквивалентен API в стиле C и генерирует инструкции SIMD.
Код vop5c выполняет динамический тест отсутствия перекрытия между a et b, а затем имеет скалярный код «then SIMD else».
Какую магию мне следует добавить в vop5a1, чтобы включить SIMD кодирование?
Подробнее здесь: https://stackoverflow.com/questions/792 ... trict-rule
Мобильная версия