在我的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语法?
答案 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。