【发布时间】:2019-02-26 16:19:56
【问题描述】:
我正在尝试在 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);
这是错误:
错误:无法将参数“1”的“__m256i {aka __vector(4) long long int}”转换为“__m256 {aka __vector(8) float}”到“__m256 _mm256_div_ps(__m256, __m256)” _mm256_div_ps(温度,帮助);
【问题讨论】:
-
_mm256_div_ps-- 正如名称中的ps所暗示的 -- 除以 Packet S 单精度浮点数,但不是整数。如果要近似除整数,请将它们转换为浮点数,除以它们并将结果转换回来。 (为了获得更好的结果转换为双精度,当然您需要将数组分成两半)。 -
如果你的编译器支持SVML,你可以使用
_mm256_div_epi32。 -
遗憾的是它不支持 SVML,但如果我想要整数除法,我可以只进行浮点除法并将其转换为整数吗?这会给我在所有情况下的正确结果吗?
-
如果你做
float(即单精度)除法,你只会得到一个近似值。使用double,您应该得到准确的结果,但计算时间大约是原来的两倍。 -
似乎没有人明确提及它,但英特尔不支持任何本机 simd 整数除法。它需要以某种方式进行模拟,要么一直返回到 idiv,要么通过转换为浮点类型
标签: c++ simd intrinsics avx