【问题标题】:Intel AVX inconsistent _mm256_load_si256 integer operation in C英特尔 AVX 在 C 中的 _mm256_load_si256 整数运算不一致
【发布时间】:2018-05-09 13:48:15
【问题描述】:

为了并行化我的基于数组的代码,我试图弄清楚如何利用英特尔 AVX 内在函数对大型数组执行并行操作。

从我读到的文档中,256 位 AVX 向量将支持多达 8 个并行 32 位整数/32 位浮点数或多达 4 个并行 64 位双精度数。浮点部分没有给我任何问题并且工作正常,但是整数 AVX 函数让我很头疼,让我使用以下代码来演示:

命令行选项 -mavx 与兼容 AVX 的 Intel 处理器一起使用。我不会使用 AVX2 功能。编译将在 Ubuntu 16.04 上使用 GNU99 C 完成。

AVX FP:

#include <stdio.h>
#include <stdlib.h>
#include <immintrin.h>

int main() 
{ 
    float data[8] = {1.f,2.f,3.f,4.f,5.f,6.f,7.f,8.f};
    __m256 points = _mm256_loadu_ps(&data[0]);

    for(int i = 0; i < 8; i++)
        printf("%f\n",points[i]);

    return 0;
}

输出:

1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000

这完全是应该的,但是在使用整数加载 AVX 函数时情况并非如此:

AVX INT:

#include <stdio.h>
#include <stdlib.h>
#include <immintrin.h>

int main() 
{ 
    int data[8] = {1,2,3,4,5,6,7,8};
    __m256i points = _mm256_loadu_si256((__m256i *)&data[0]);

    for(int i = 0; i < 8; i++)
        printf("%d\n",points[i]);

    return 0;
}

输出:

1
3
5
7
1048576 [ out of bounds ]
0 [ out of bounds ]
1 [ out of bounds ]
3 [ out of bounds ]

如您所见,加载仅在 __m256i 类型变量中生成 4 个元素,其中只有第一个、第三个、第五个和第七个元素从 原始数组。超出第四个元素的引用超出范围。

如何产生将整个数据集按顺序加载到整数 AVX 数据类型的预期结果,就像 AVX 浮点数据类型一样?

【问题讨论】:

    标签: c x86 simd intrinsics avx


    【解决方案1】:

    您正在使用 GNU C 扩展来索引带有 [] 的向量,而不是将其存储回数组。英特尔的内部函数文档对此没有任何说明,并且并非所有编译器都支持它(例如 MSVC 不支持)。

    GCC 将__m256i 定义为GNU C native vector of long long&lt;immintrin.h&gt; 没有为intshort 的SIMD 向量定义不同的__m256i 类型,而__m256i 不记得任何关于它来自何处/如何设置的信息。 (与 FP 向量不同,其中 pspd 有单独的 C 类型,因此如果要在 ps 向量上使用 shufpdunpcklpd,则必须使用 __m128d _mm_castps_pd(__m128)

    您可以自己 typedefv8si 这样的原生向量类型(参见 gcc 文档的上一个链接),或者使用库 like Agner Fog's VCL 来为您提供像 Vec8i(8 签名 int)或 @ 这样的类型987654342@(32 个未签名的char)。它们具有运算符重载,可让您编写 a + b 而不是 _mm256_add_epi32(a, b)_mm256_add_epi8(a,b),具体取决于类型。或者使用[] 代替_mm_extract_epi32/epi8/epi16/epi64。


    请参阅print a __m128i variable,了解可移植且安全/正确的方法来循环/打印英特尔内部 SIMD 变量的元素。 TL:DR: _mm_store / _mm256_store 到一个 tmp 数组并索引它。它是可移植的,并且可以优化(对于整数到 pextrd 或对于 FP 只是随机播放),在简单的情况下没有实际的存储/重新加载。

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 2020-03-21
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2011-02-12
      相关资源
      最近更新 更多