用于求幂的 SIMD 代码

anu*_*nup 4 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;  
    }  
}  
Run Code Online (Sandbox Code Playgroud)

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);  
      }  
   } 
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢并问候,阿努普。

BЈо*_*вић 5

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