0

我有一个 C++ 类,其中一些函数具有 OpenMP 并行 for 循环。我正在使用 MSVC2017 将其构建到两个应用程序中,并发现其中一个功能在两个应用程序中的运行方式不同。该函数有两个独立的并行 for 循环。在一个版本中,VS 调试器显示它们在处理一块测试数据时都使用了 7 个内核并持续了整整一秒;另一方面,它只显示了两个多核使用情况,大概在每个并行部分的开头,但大部分时间只有一个处理器运行。

这些函数在类的代码深处,这在 2 个应用程序中是相同的。据我所知,这些构建具有相同的编译器和链接器选项。我使用 CMake 生成项目,从不手动修改它们。

任何人都可以提出这种行为的可能原因吗?我完全了解并行化代码的其他方法,所以请不要告诉我这些。我只是在寻找有关 MSVC 下 OpenMP 的专业知识。

4

1 回答 1

0

我预计他的两个电话正在传递明显不同的工作量。考虑(例如,微不足道的,输入到这篇文章中,没有编译,不是写这个的方式!)像这样的代码

void scale(int n, double *d, double f) { 
#pragma omp parallel for
    for (int i=0; i<n; i++)
        d[i] = d[i] * f;
}

如果使用 n == 10000 的大向量调用,您将获得一些并行性和许多线程工作。如果用 n == 3 调用,显然只有三个线程有效!如果你使用#pragma omp parallel for schedule(dynamic)它,即使有十或二十次迭代,单个线程也很可能会执行其中的大部分。

总而言之:上下文很重要。

于 2020-03-26T08:48:39.400 回答