AVX __M256I整数部门用于签名的32位元素

AVX __m256i integer division for signed 32-bit elements

本文关键字:元素 32位 用于 M256I 整数部 AVX      更新时间:2023-10-16

我正在尝试在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);

这是错误:

错误:无法将'__m256i {aka __vector(4)长long int}'转换为'__m256 {aka ____vector(8)float}'for参数'1'到'__m256 ___m256 _mmm256_div_ps(__ m256,__ m256,__ m256,__ m256,__ m256)'' _mm256_div_ps(temp,help);

我建议使用VC:可移植的,零左头C 类型,用于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说明。