Когда я смотрю на код 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