【发布时间】:2014-04-01 15:24:32
【问题描述】:
所以据我了解,这两种方法在所有版本的 openmp 中都是正确的:
//int i declared in loop, explicitly private
#pragma omp parallel for
for (int i = 0; i < NUMEL; i++)
{
foo(i);
}
//int i declared outsize loop, but is the iterated value, implicitly private
int i;
#pragma omp parallel for
for (i = 0; i < NUMEL; i++)
{
foo(i);
}
但是,我更常看到第二个而不是第一个。这是为什么呢?
【问题讨论】:
-
我也想知道同样的事情。我想大多数人都不知道更好。它还经常导致错误,因为人们认为内部循环也可以正常工作,但事实并非如此(没有明确声明内部迭代器私有)。 GNU89 方言(ICC 也使用)允许混合声明,所以我真的不明白为什么人们仍然喜欢在循环之外声明迭代器。这很容易出错。
-
事实证明,尽管 GNU89 确实允许混合声明,但它仍然不允许循环初始声明,因此需要 C99(例如 GNU99)或 C++ 方言。我更新了我的答案来解决这个问题。