AVX __M256I整数部门用于签名的32位元素
AVX __m256i integer division for signed 32-bit elements
我正在尝试在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说明。
相关文章:
- 将应用程序从32位移植到64位时出现问题
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 浮点数为 32 位和 64 位二进制表示形式
- C++易失性:保证 32 位访问?
- C++将 16 位值转换为 32 位值
- 如何在 64 位平台上计算 32 位哈希C++?
- C++中的24位到32位转换
- 在机器字大小等于 32 位的计算机上int64_t如何工作?
- uint32_t如何保证 32 位?
- 将代码从 32 位迁移到 64 位时出现问题 Visual Studio 2010
- 如何将32位字符与内联assembelyc++中的32位字符进行比较
- 一个32位版本的应用程序,建立在CentOS 6 x64上,当在较新的Linux上启动时,在"dl_itera
- x86 32位对Cuda的支持
- 我把我的编译器从32位转换为64位,但我仍然不能使用超过2GB:(为什么
- 如何使用Canny到32位灰度
- AVX __M256I整数部门用于签名的32位元素
- C/C++的压缩库能够处理数组中超过32位的元素
- 使用for循环对32位和64位容器/字符串的元素进行反向迭代而不发出警告