Почему последовательные загрузки AVX2 производят так много операций vmovaps?C++

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

Сообщение Anonymous »

Мне нравится загружать несколько последовательных SIMD-векторов и хранить их в контейнере, размер которого известен во время компиляции. (Это позволило бы мне написать переносимый код для архитектур с разным количеством регистров. Для AVX2 (Arm Neon) я загружаю 3 (4) вектора.)
Когда я смотрю на код AVX2 , меня удивляет количество операций vmovaps.
Рассмотрим следующий код:

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

#include 
#include 
using InpT = const float* __restrict__;

template 
auto  load(InpT data, size_t index) {
using vecs = std::array;
alignas(32) vecs loaded;
for (size_t i = 0; i < unroll_cout; ++i) {
loaded[i] = _mm256_load_ps(data + index);
index += 8;
}
return loaded;
}

template auto load(InpT data, size_t index);

auto loadSingle(InpT data, size_t index) {
auto vec = _mm256_load_ps(data + index);
return vec;
}
Для общей операции загрузки я вижу:

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

auto load(float const*, unsigned long):
mov     rax, rdi
vmovaps ymm0, ymmword ptr [rsi + 4*rdx]
vmovaps ymm1, ymmword ptr [rsi + 4*rdx + 32]
vmovaps ymm2, ymmword ptr [rsi + 4*rdx + 64]
vmovaps ymmword ptr [rdi + 64], ymm2
vmovaps ymmword ptr [rdi + 32], ymm1
vmovaps ymmword ptr [rdi], ymm0
vzeroupper
ret
Хотя загрузка только одного значения работает так, как я ожидал:

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

loadSingle(float const*, unsigned long):
vmovaps ymm0, ymmword ptr [rdi + 4*rsi]
ret
Похоже, что загрузка трех последовательных векторов перемещает данные в памяти между двумя разными областями.
Оптимален ли код для загрузки ? Если нет, то как я могу это улучшить?

Подробнее здесь: https://stackoverflow.com/questions/793 ... operations
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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