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

标签 c++ simd intrinsics avx

我试图在 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++ - AVX __m256i 有符号 32 位元素的整数除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54889884/

相关文章:

ios - 如何在 iOS 中使用 ARM 内在函数?

c++ - Qt 选择现有文件

c++ - 使用 AVX 内在函数计算具有允许标量值 0、1 和 2 的 vector 的内积

c++ - 为什么此代码中存在转换错误?

performance - vgetmantps 与 andpd 获取 float 尾数的说明

c++ - 打乱 __m256i vector 的元素

c - AVX-512 中 undefined reference

c - 如何使用英特尔内在函数从 256 个 vector 中提取 8 个整数?

c++ - 是否可以知道基类中的派生对象大小?

c++ - 以数值稳健的方式测试三个点的共线性