Visual Studio 2010 で正常にコンパイルされる、次のような AVX C++ コードがあります。
#include <immintrin.h>
#include <iostream>
int main() {
float data[] = {0, 1, 2, 3, 4, 5, 6, 7};
__m256 ymm0 = _mm256_loadu_ps(data);
// ..
float r0 = ymm0.m256_f32[0];
float r4 = ymm0.m256_f32[4];
std::cout << r0 << " " << r4 << std::endl;
}
ただし、GCC では次のエラーが発生します。
foo.cpp:8:18: error: request for member ‘m256_f32’ in ‘ymm0’, which is of non-class type ‘__m256 {aka __vector(8) float}’
foo.cpp:9:18: error: request for member ‘m256_f32’ in ‘ymm0’, which is of non-class type ‘__m256 {aka __vector(8) float}’
私はいくつかの調査を行いましたymm0.m256_f32
が、長い AVX レジスタから個々のフロートを抽出するための Microsoft 固有の命令のようです。しかし、gcc/linux で同じことを行うには何を使用できますか?