0

我在 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%,实际上我失去了并行性!我能做些什么?

4

1 回答 1

0

您的程序没有说明 s1 和 s2 是什么,以及 init() 修改了什么。在任何情况下,您都需要确保一个线程不会更改另一个线程使用的数据。

根据定义,“#pragma omp critical”是一个瓶颈,因为它使得该块一次只能由一个线程进入。

一个“#pragma omp parallel for”就足够了。让线程在 for 循环中复制修改后的变量。

于 2014-02-05T03:32:41.030 回答