我在visual studio 2012中用open-mp写了一个程序,我有一些问题。这是我的代码:
#pragma omp parallel num_threads(4) private(k)
{
#pragma omp for
for(k=0x20AC6E12AF3E4DB0;k<=MAXINT64;k++)
{
U.k=k;
init();
Decrypt(s1);
Decrypt(s2);
}
}
上面编译的代码和我的cpu使用率为100%,但输出错误。当我将代码更改为:
#pragma omp parallel num_threads(4) private(k)
{
#pragma omp for
for(k=0x20AC6E12AF3E4DB0;k<=MAXINT64;k++)
{
U.k=k;
init();
#pragma omp critical
{
Decrypt(s1);
Decrypt(s2);
}
}
}
输出变得正确但在这种情况下我的cpu使用率不是100%而我实际上失去了并行性! 我该怎么办?
答案 0 :(得分:0)
您的程序没有说明s1和s2是什么,以及init()修改了什么。在任何情况下,您都需要确保一个线程不会更改另一个线程使用的数据。
根据定义,“#pragma omp critical”是一个瓶颈,因为它使得块一次只能由一个线程输入。一个“#pragma omp parallel for”就足够了。让线程在for循环中复制变量。