gpt4 book ai didi

c++ - 有符号 32 位元素的 AVX __m256i 整数除法

转载 作者:行者123 更新时间:2023-11-30 01:35:03 24 4
gpt4 key购买 nike

我正在尝试在 AVX 机器上进行 SIMD 划分并遇到编译错误。

这是我的代码:

    __m256i  help;
int arr[8];
int arr2[8];
help = _mm256_load_si256((__m256i*)arr);
__m256i temp;
temp = _mm256_load_si256((__m256i*)arr2);
__m256i result;
_mm256_div_ps(temp,help);

这里是错误:

error: cannot convert ‘__m256i {aka __vector(4) long long int}’ to ‘__m256 {aka __vector(8) float}’ for argument ‘1’ to ‘__m256 _mm256_div_ps(__m256, __m256)’ _mm256_div_ps(temp,help);

最佳答案

我建议使用 Vc: portable, zero-overhead C++ types for explicitly data-parallel programming simd 库,我听说它的目标是包含在 C++ 标准中。它更易于编写和阅读。

例子:

#include <iostream>
#include <Vc/Vc>

int main() {
using A = Vc::SimdArray<int, 8>;
A arr1 = A::Random();
A arr2 = A::Random();
std::cout << arr1 << '\n';
std::cout << arr2 << '\n';
std::cout << arr1 / arr2 << '\n';
}

输出:

<1513634383 -963914658 1763536262 -1285037745 | -695608406 -35372374 1025922083 444041308>
<824703811 1962744590 1568022524 -293901648 | 549806324 248334095 1663905340 641164273>
[1, 0, 1, 4, -1, 0, 0, 0]

下面的函数

using A = Vc::SimdArray<int, 8>;

__attribute__((noinline)) A f(A a0, A a1) {
return a0 / a1;
}

使用 g++-8.2 -O3 -march=skylake 转换为以下程序集:

f(Vc_1::SimdArray<int, 8ul, Vc_1::Vector<int, Vc_1::VectorAbi::Avx>, 8ul>, Vc_1::SimdArray<int, 8ul, Vc_1::Vector<int, Vc_1::VectorAbi::Avx>, 8ul>):
vcvtdq2pd ymm3, xmm1
vcvtdq2pd ymm2, xmm0
vextracti128 xmm1, ymm1, 0x1
vextracti128 xmm0, ymm0, 0x1
vcvtdq2pd ymm1, xmm1
vdivpd ymm2, ymm2, ymm3
vcvtdq2pd ymm0, xmm0
vdivpd ymm0, ymm0, ymm1
vcvttpd2dq xmm2, ymm2
vcvttpd2dq xmm0, ymm0
vinserti128 ymm0, ymm2, xmm0, 0x1
ret

请注意,x86 指令集中没有用于整数除法的 simd 指令。

关于c++ - 有符号 32 位元素的 AVX __m256i 整数除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54889884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com