AVX __m256i用于带符号的32位元素的整数除法

问题描述 投票:1回答:1

我试图在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 long int}'转换为'__m256 {aka __vector(8)float}'以将参数'1'转换为'__m256 _mm256_div_ps(__ m256,__ m256)'_ mm256_div_ps(temp,help) ;

c++ simd intrinsics avx
1个回答
4
投票

我建议使用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指令。

© www.soinside.com 2019 - 2024. All rights reserved.