Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用openmp进行并行化_C_Parallel Processing_Openmp - Fatal编程技术网

C 使用openmp进行并行化

C 使用openmp进行并行化,c,parallel-processing,openmp,C,Parallel Processing,Openmp,我有一个我想使用openmp并行化的函数: for(i=len-1;i>=0;i--){ if(bin[i]==49) // bin is a binary number & is // stored in a string. 49 is ascii value of 1 { s=(s*x)%n; } x=(x*x)%n; } 我尝试使用#pragma omp parallel for,但效果不佳。我也尝试过简化

我有一个我想使用openmp并行化的函数:

for(i=len-1;i>=0;i--){
  if(bin[i]==49) // bin is a binary number & is
                 // stored in a string. 49 is ascii value of 1
  {
     s=(s*x)%n;    
  }
  x=(x*x)%n;
}
我尝试使用
#pragma omp parallel for
,但效果不佳。我也尝试过简化函数,但我得到了错误的答案。

我认为原因是因为s的值取决于x(这取决于每个步长的值)。

x
的依赖导致问题是正确的。这种依赖关系在迭代之间存在。每次迭代都需要上一次迭代的
x
。因此,它使整个循环不可并行化

看起来这个循环是通过重复平方运算来计算幂模的


简而言之:不,你将无法并行化它。依赖性是您所使用的算法中固有的。

那么,有没有其他方法来实现这一点以使其速度极快?我正在尝试为大数实现RSA算法。但对于一个50位数的素数来说,解密大约需要1小时。此函数占用的时间太多。由于无法在此并行化,因此需要在更高级别上执行此操作。如果您有多个PowerMod要做(并且它们是独立的),那么您可以并行地做这些事情。虽然我不太熟悉RSA算法,所以我不知道在更高的层次上有多少并行性。好的,我会检查一下。非常感谢你。这个环路怎么样?有可能并行化吗?对于(i=0,k=0;iAs,只要
msg()
是可重入的,那么是的,它是可并行的。(另外,确保
a
b
不重叠)实际上不需要减少。所以只需使用
#pragma omp parallel for
。只有当迭代的结果将“减少”为变量时才需要减少。(例如对所有元素求和)但在您的示例中,您没有这样做。您正在写入数组
b
的不同元素。因此没有减少。