使用 AVX2 对 2 个短整型向量进行向量加法

Posted

技术标签:

【中文标题】使用 AVX2 对 2 个短整型向量进行向量加法【英文标题】:Vectorised addition for 2 short int vectors using AVX2 【发布时间】:2018-03-14 23:52:31 【问题描述】:

我在使用 AVX2 指令集对 2 个短(16 位整数)向量类型执行加法运算时遇到问题。 我已经构建了代码,但在添加命令中出现错误,可能是因为语法错误。 我正在使用以下代码创建 2 个向量:

short int si1[16] =1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;
short int si2[16] =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;

__m256i i1 = _mm256_load_si256((__m256i*)si1);
__m256i i2 = _mm256_load_si256((__m256i*)si2);

我正在尝试使用以下代码执行添加:

__m256i result = _mm256_add_si256(i1,i2);

我知道对于 16 位整数我们使用标量后缀,但是编译器给出了函数隐式声明添加命令的错误。

【问题讨论】:

所以为了清楚起见,编译器说_mm256_add_epi16 不存在? 嗯,没有_mm256_add_si256()这样的东西。 我认为错误“隐式声明函数”确实意味着该函数/方法不存在。 @Romal 可能,但哪个功能?你已经展示了_mm256_add_si256(它确实不存在也不能存在——即使它确实存在它也不会添加短裤),但是在下一段中你似乎正在走向_mm256_add_epi16(如果那是什么“标量后缀”的意思) 【参考方案1】:

通过人们的 cmets 和我的一些实验,我通过使用未对齐操作解决了这个问题。所以我的代码最终看起来像这样-

short int si1[16] =
         1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ;
short int si2[16] =  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;

__m256i i1 = _mm256_loadu_si256((__m256i *) si1);
__m256i i2 = _mm256_loadu_si256((__m256i *) si2);

    __m256i result = _mm256_adds_epi16(i2, i1);

这有效并在尝试编译程序时使用 -O2 优化标志(在 gcc 上),以防您使用多线程,因为优化是我遇到一些其他错误的原因(大工作负载的执行时间更长线程与单线程相比)。

【讨论】:

以上是关于使用 AVX2 对 2 个短整型向量进行向量加法的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVX2 高效计算 std::complex<float> 向量的绝对值

使用 Cuda 进行 128 位向量加法,性能问题

两个 16 位整数向量与 C++ 中的 AVX2 的内积

c语言的基本整型(int)和短整型(short)又啥不一样?这些有啥用?

C语言 - 隐式类型转换

在 np.ndarray 中对向量进行排序