并行使用pragma进行构造

时间:2011-12-21 23:40:28

标签: c visual-studio parallel-processing openmp

在我的VS2010 C代码中,我在这里成功使用了pragma指令:

 void doSomething(void)
{
     n = doSomethingElse();
     j = doOnceMore();
     k = n + j;
}

   #pragma omp parallel for
   for (i = 0; i < 5; ++i)
   {
        doSomething();
   }

但如果我将“doSomething()”的内容移动到内联中,我就无法工作:

    #pragma omp parallel for
     for (int i = 0; i < 5; ++i)
    {
         n = doSomethingElse();
         j = doOnceMore();
         k = n + j;
     }

我总是假设pragma指令会将括号中的内容赋予它并为其分配一个唯一的线程。我是不是错了,或者我应该使用其他一些omp语法?

1 个答案:

答案 0 :(得分:1)

n,j,k默认为线程共享,因此不起作用。目前,每个线程都在同一时间写入n,j,k。

这取决于你想要做什么,不管他们是私人还是共享。如果它们是一个循环传递的本地,你可以将它们声明为线程私有,它应该工作正常(循环计数器,这里i,默认是线程私有)。

#pragma omp parallel for private(n,j,k)
 for (int i = 0; i < 5; ++i)
{
     n = doSomethingElse();
     j = doOnceMore();
     k = n + j;
 }

由于openmp无法猜出变量的用途是什么,因此告诉pragma如何处理它们是你的工作。您可以找到有关子句和变量here的更多信息。关于数据结构和构建适当的并行区域,talk上还有一个非常好的openmp webpage