是否有使用SSE查找两个变量的模数的好方法?(没有SVML)

凯莱奇·尼泽

我正在尝试学习使用SSE,我正在编写的程序之一要求使用模数除法,因此我为此编写了代码(很抱歉,它被过分评价):

__m128i SSEModDiv(__m128i input, __m128i divisors)
{
    //Error Checking (div by zero)
    /*__m128i zeros = _mm_set1_epi32(0);
    __m128i error = _mm_set1_epi32(-1);
    __m128i zerocheck = _mm_cmpeq_epi32(zeros, divisors);
    if (_mm_extract_epi16(zerocheck, 0) != 0)
        return error;
    if (_mm_extract_epi16(zerocheck, 2) != 0)
        return error;
    if (_mm_extract_epi16(zerocheck, 4) != 0)
        return error;
    if (_mm_extract_epi16(zerocheck, 6) != 0)
        return error;*/

    //Now for the real work
    __m128 inputf = _mm_cvtepi32_ps(input);
    __m128 divisorsf = _mm_cvtepi32_ps(divisors);

    /*__m128 recip = _mm_rcp_ps(divisorsf); //Takes reciprocal
    __m128 divided = _mm_mul_ps(inputf, recip); //multiplies by reciprical values*/
    __m128 divided = _mm_div_ps(inputf, divisorsf);
    __m128i intermediateint = _mm_cvttps_epi32(divided); //makes an integer version truncated
    __m128 intermediate = _mm_cvtepi32_ps(intermediateint);
    __m128 multiplied = _mm_mul_ps(intermediate, divisorsf); //multiplies the intermediate with the divisors
    __m128 mods = _mm_sub_ps(inputf, multiplied); //subtracts to get moduli
    return _mm_cvtps_epi32(mods);
}

问题在于,这大约与分别释放四个32位整数的每个元素的模数一样快,而调试(通过性能分析发现)则要慢大约10倍。

谁能给我任何有关如何使此功能更快的指针?

-我无法使用SVML,因为我正在使用Visual Studio-

玻色子

对于一般的价值inputdivisors存在整数除法或模量没有有用的SIMD x86指令,因此最好使用标量整数除法。但是,在某些特殊情况下,SIMD整数模量可以更快地完成。

例如,如果您要执行(a + b)%c并且a和b已被减少(即a<cand b<c),则可以使用比较和减法,如下所示:

z = a + b
if(z>=c) z-=c;

我在此示例中进行了此操作vectorizing-modular-arithmetic

另一个例子是,除数不是编译时间常数,而是在循环内仍然是常数,那么您可以使用浮点除法的类似思想。浮点除法的一个常见技巧是预先计算除数的倒数并像这样进行乘法:

float fact = 1.0/x;
for(int i=0; i<n; i++) {
    z[i] = fact*y[i];  //z[i] = y[i]/x;
}

您可以对整数除法使用类似的技术,该技术将整数除法转换为带移位的整数乘法。

y / x ≈ y * (2 n / x) >> n

有几种不同的技术可以确定因子(又称幻数(2 n / x)和移位n实际上,大多数编译器已经为编译时间常数和除法了。例如x/7如果您尝试查看GCC或MSVC的程序集输出,您会发现它们实际上并没有进行整数除法,而是使用与从http:// www计算的相同的幻数和移位进行乘法和移位。 hackersdelight.org/magic.htm

我在运行时使用Agner Fog的Vector Class Library或他的Subroutine库进行此操作这两个库都将在运行时为SSE和AVX整数除法计算魔术数并为您移位。

但是正如我在回答开头所说的,如果你想做

for(int i=0; i<n; i++) {
    z[i] = y[i]%x[i];
}

并且x[i]不是循环中的常数,最好坚持标量除法/模量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

检查两个表之间是否没有使用用户名

来自分类Dev

有没有一种优化两个BigNum乘法的好方法?

来自分类Dev

是否有使用intel svml(短矢量数学库)编译的anaconda版本?

来自分类Dev

它是好两个或多个接口有相同的方法?

来自分类Dev

查找具有一定总和的两个变量的所有值的最佳方法

来自分类Dev

是否有使用多态性删除此switch语句的好方法?

来自分类Dev

是否有必要交换两个变量而不使用第三个变量?

来自分类Dev

查找行没有两个连续的零

来自分类Dev

是否有使用静态方法的原因?

来自分类Dev

是否有使用`udev`的替代方法?

来自分类Dev

有没有一种方法可以使用FC命令显示两个文件不同的确切位置?或在Windows中比较2个文件的任何其他好方法?

来自分类Dev

有没有一种好的方法可以让一个类继承两个类之一

来自分类Dev

有没有使用公共变量的正确时间?

来自分类Dev

有没有更好的方法来检查这两个变量而不是四个if?

来自分类Dev

有没有更好的方法来迭代两个列表以查找python中项目之间的关系?

来自分类Dev

有没有更好的方法来迭代两个列表以查找python中项目之间的关系?

来自分类Dev

有没有一种方法可以测试在numpy中是否可以广播两个形状?

来自分类Dev

'没有匹配的返回类型'; 使用带有两个变量存储过程的数据实体创建 wcf 服务

来自分类Dev

var.sh没有使用终端导出变量

来自分类Dev

使用两个自变量计算 numpy 数据的最有效方法

来自分类Dev

如果一两个变量没有值,如何添加 3 个变量?

来自分类Dev

查看一个变量中是否有两个不同的字符串的更好方法?

来自分类Dev

如何查找有向图是否具有两个拓扑顺序?

来自分类Dev

Spyne(Python Web服务框架)是否支持多个线程?如果没有,是否有使用Python线程库的方法?

来自分类Dev

是否有更好的方法使用RxJava获取两个Observable的交集

来自分类Dev

是否有两个对象的两个锁?

来自分类Dev

有没有一种有效的方法来执行带有两个变量的选择语句?

来自分类Dev

Python中的两个变量具有相同的ID,但没有列表或元组

来自分类Dev

有没有办法将两个在R中互换的变量分组

Related 相关文章

  1. 1

    检查两个表之间是否没有使用用户名

  2. 2

    有没有一种优化两个BigNum乘法的好方法?

  3. 3

    是否有使用intel svml(短矢量数学库)编译的anaconda版本?

  4. 4

    它是好两个或多个接口有相同的方法?

  5. 5

    查找具有一定总和的两个变量的所有值的最佳方法

  6. 6

    是否有使用多态性删除此switch语句的好方法?

  7. 7

    是否有必要交换两个变量而不使用第三个变量?

  8. 8

    查找行没有两个连续的零

  9. 9

    是否有使用静态方法的原因?

  10. 10

    是否有使用`udev`的替代方法?

  11. 11

    有没有一种方法可以使用FC命令显示两个文件不同的确切位置?或在Windows中比较2个文件的任何其他好方法?

  12. 12

    有没有一种好的方法可以让一个类继承两个类之一

  13. 13

    有没有使用公共变量的正确时间?

  14. 14

    有没有更好的方法来检查这两个变量而不是四个if?

  15. 15

    有没有更好的方法来迭代两个列表以查找python中项目之间的关系?

  16. 16

    有没有更好的方法来迭代两个列表以查找python中项目之间的关系?

  17. 17

    有没有一种方法可以测试在numpy中是否可以广播两个形状?

  18. 18

    '没有匹配的返回类型'; 使用带有两个变量存储过程的数据实体创建 wcf 服务

  19. 19

    var.sh没有使用终端导出变量

  20. 20

    使用两个自变量计算 numpy 数据的最有效方法

  21. 21

    如果一两个变量没有值,如何添加 3 个变量?

  22. 22

    查看一个变量中是否有两个不同的字符串的更好方法?

  23. 23

    如何查找有向图是否具有两个拓扑顺序?

  24. 24

    Spyne(Python Web服务框架)是否支持多个线程?如果没有,是否有使用Python线程库的方法?

  25. 25

    是否有更好的方法使用RxJava获取两个Observable的交集

  26. 26

    是否有两个对象的两个锁?

  27. 27

    有没有一种有效的方法来执行带有两个变量的选择语句?

  28. 28

    Python中的两个变量具有相同的ID,但没有列表或元组

  29. 29

    有没有办法将两个在R中互换的变量分组

热门标签

归档