Как получить данные из регистров AVX?
Используя MSVC 2013 и AVX 1, у меня есть 8 поплавков в регистре:
__m256 foo = mm256_fmadd_ps(a,b,c);
Теперь я хочу позвонитьinline void print(float) {...}
на все 8 поплавков. Похоже,Intel AVX intrisics сделает это довольно сложным:
print(_castu32_f32(_mm256_extract_epi32(foo, 0)));
print(_castu32_f32(_mm256_extract_epi32(foo, 1)));
print(_castu32_f32(_mm256_extract_epi32(foo, 2)));
// ...
но MSVC даже не имеет ни одной из этих двух встроенных функций. Конечно, я мог записать значения обратно в память и загрузить оттуда, но я подозреваю, что на уровне сборки нет необходимости разливать регистр.
Бонус Q: я бы конечно хотел написать
for(int i = 0; i !=8; ++i)
print(_castu32_f32(_mm256_extract_epi32(foo, i)))
но MSVC не понимает, что много внутреннихтребовать развернуть петлю. Как мне написать цикл над 8x32 плавает в__m256 foo
?