c++ - 相当于 m256_f32 的 GCC

标签 c++ gcc avx

我有这样的 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 寄存器中提取单个 float 。但是我可以用 gcc/linux 做什么来做同样的事情呢?

最佳答案

GCC 可以在 C 语言中索引 vector ,但不能在 C++ 中索引。您可以考虑将一小部分代码重写为 C。

另一种选择是显式使用洗牌、提取和转换内在函数 - _mm256_shuffle_pd_mm256_extractf128_pd_mm_cvtsd_f64

关于c++ - 相当于 m256_f32 的 GCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13603319/

相关文章:

c - Vanilla C 下降替代英特尔内在函数?

c++ - 如何实现 "const"和 "non-const"重载而不重复代码?

c++ - 如何检查流提取是否消耗了所有输入?

c - 为什么 GCC 编译器不支持#pragma startup 和#pragma exit 指令?

c++ - vector 矩阵乘法,浮点 vector ,二进制矩阵

c++ - 高效移位或大位 vector

c++ - 在模板类中使用嵌套的嵌套类时,“依赖名称不是类型”

c++ - 循环迭代 C++ 映射,程序崩溃

c++ - 如果我在库和应用程序中编译了相同的 cpp 文件会怎样?

C++程序无法编译