我有这样的 AVX C++ 代码,它在 Visual Studio 2010 下编译得很好:
#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
是 Microsoft 特定的指令,用于从长 AVX 寄存器中提取单个浮点数。但是我可以用 gcc/linux 做什么来做同样的事情? 最佳答案
GCC 可以索引 C 语言中的 vector ,但不能在 C++ 中索引。您可以考虑将一小部分代码重写为 C。
另一种选择是显式使用 shuffle、extract 和转换内在函数 - _mm256_shuffle_pd
、 _mm256_extractf128_pd
、 _mm_cvtsd_f64
。
关于c++ - m256_f32 的 GCC 等效项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13603319/