c - 用于求幂的 SIMD 代码

标签 c optimization simd

我正在使用 SIMD 计算快速求幂结果。我将时间与非 simd 代码进行比较。使用平方和乘法算法实现求幂。

普通(非simd)版本的代码:

b = 1;  
for (i=WPE-1; i>=0; --i){  
    ew = e[i];  
    for(j=0; j<BPW; ++j){  
        b = (b * b) % p;  
        if (ew & 0x80000000U)  b = (b * a) % p;  
        ew <<= 1;  
    }  
}  

SIMD 版本:

   B.data[0] = B.data[1] = B.data[2] = B.data[3] = 1U;  
   P.data[0] = P.data[1] = P.data[2] = P.data[3] = p;  
   for (i=WPE-1; i>=0; --i) {  
      EW.data[0] = e1[i]; EW.data[1] = e2[i]; EW.data[2] = e3[i]; EW.data[3] = e4[i];  
      for (j=0; j<BPW;++j){  
         B.v *= B.v; B.v -= (B.v / P.v) * P.v;  
         EWV.v = _mm_srli_epi32(EW.v,31);  
         M.data[0] = (EWV.data[0]) ? a1 : 1U;  
         M.data[1] = (EWV.data[1]) ? a2 : 1U; 
         M.data[2] = (EWV.data[2]) ? a3 : 1U; 
         M.data[3] = (EWV.data[3]) ? a4 : 1U;  
         B.v *= M.v; B.v -= (B.v / P.v) * P.v;  
         EW.v = _mm_slli_epi32(EW.v,1);  
      }  
   } 

问题是虽然计算正确,但 simd 版本比非 simd 版本花费更多时间。

请帮我调试原因。也欢迎任何有关 SIMD 编码的建议。

谢谢和问候, 安普。

最佳答案

for 循环中的所有函数都应该是 SIMD 函数,而不是只有两个。为您的 2 个函数设置参数所花费的时间不如您的原始示例最佳(这很可能由编译器优化)

关于c - 用于求幂的 SIMD 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4012551/

相关文章:

c - 程序中的未知错误

c - C中位的右循环

python - 加速 pandas 迭代,寻找测试后续元素的条件

javascript - 页面速度优化: writing to DOM using javascript vs. html

fortran - 嵌套循环的 OpenMP SIMD 矢量化

sse - 在哪里可以找到 AMD FMA 4 内在函数的引用?

c++ - 如何根据另一个包含 0 或 1 个元素的 vector 有条件地否定 AVX2 int16_t vector ?

函数定义中与 double 冲突的类型

c++ - 这是允许的 : memcpy(dest, src, 0)

C# (.Net 2.0) 微优化第 2 部分 : Finding Contiguous Groups within a grid