C 使用openmp进行并行化
我有一个我想使用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,但效果不佳。我也尝试过简化
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
的不同元素。因此没有减少。