我是 OpenMP 的新手,根据我所阅读的有关 OpenMP 2.0(Microsoft Visual Studio 2010 的标准配置)的信息,全局变量在并行编程中使用时被认为很麻烦且容易出错。我也一直在接受这种感觉,因为我几乎没有发现如何有效地处理全局变量和静态全局变量,或者根本就没有发现。
我有这段代码可以运行,但由于在并行块中创建了局部变量,我没有得到我正在寻找的答案。我得到 8 种不同的打印输出(因为我的 PC 上有多少线程)而不是 1 个答案。我知道这是因为在并行块中创建了局部变量“list”,但是如果我移动“list”变量并使其成为全局变量,这段代码将不会运行。实际上代码确实运行但它从来没有给我一个答案。这是我想修改以使用全局“列表”变量的示例代码:
#pragma omp parallel
{
vector<int> list;
#pragma omp for
for(int i = 0; i < 50000; i++)
{
list.push_back(i);
}
cout << list.size() << endl;
}
输出:
6250
6250
6250
6250
6250
6250
6250
6250
它们加起来是 50000,但我没有得到 50000 的唯一答案,而是被分割了。
解决方案:
vector<int> list;
#pragma omp parallel
{
#pragma omp for
for(int i = 0; i < 50000; i++)
{
cout << i << endl;
#pragma omp critical
{
list.push_back(i);
}
}
}
cout << list.size() << endl;