同类,2个程序,不同的OpenMP加速;MSVC2017



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

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

有人能提出这种行为的可能原因吗?我完全知道其他并行代码的方法,所以请不要告诉我这些。我只是在微软风险投资公司下寻找OpenMP的专业知识。

我预计这两个调用传递的工作量明显不同。考虑像这样的代码(例如,琐碎的,在本文中键入的,不是编译的,不是写这篇文章的方法!(

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),即使有十次或二十次迭代,一个线程也很可能执行其中的大部分。

总之:背景很重要。

最新更新