GCC OpenMP 并行用于减少比 Visual Studio 慢得多
GCC OpenMP parallel for reduction MUCH slower than Visual Studio
我和我的一个朋友在 GCC 中遇到了有关parallel for reduction
的性能问题。
代码:
#include <cstdio>
int main() {
int tans = 0;
for (int i = 0; i < 100000; ++i)
#pragma omp parallel for reduction(+:tans)
for (int id = 0; id < 10000; ++id) {
tans++;
}
printf("%dn", tans);
}
(这个无用的代码仅用于演示问题)
当使用 GCC(版本 4.9.2 (tdm64-1))编译并在我的 4 核 8 线程系统(Win 8.1 64b)上运行时,代码运行大约 5 秒,而num_threads(1)
代码仅运行 0.5 秒。
我也在 24 核系统(gcc 版本 4.8.2(Ubuntu 4.8.2-19ubuntu1))上尝试过相同的代码,并行版本仍然很慢,运行时间非常不稳定,从 1s 到 10s 不等。
在Visual Studio 2013中,代码总是几乎立即完成。生成的汇编代码可在此处找到:https://gist.github.com/ftfish/f8ffdb9106b82ae63925
我做错了什么?是因为parallel for reduction
的开销吗?为什么Visual Studio表现更好?提前谢谢你。
如果你的真实代码和这段代码一样简单,你很可能会失去很多编译器优化的机会。 g++ -O3
为您发布的代码减去 OMP 行生成以下程序集:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $1000000000, %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
xorl %eax, %eax
addq $8, %rsp
.cfi_def_cfa_offset 8
ret
如您所见,这里绝对不会在运行时计算任何内容,循环都完全优化了。因此,程序立即完成。如果让计算在运行时进行,则显然会增加计算。在这里你可以看到,添加OMP行实际上使计算在运行时发生,生成的程序集太长,无法粘贴到这里。
编辑:
我用 g++ 和 clang++ 测试了 OMP 代码,并且可以重现您的问题(g++ 大约 0.3 秒,clang++ 0.006 秒,即即时)。 clang 确实优化了这两个循环,即使使用 OMP 行也是如此。由于您的代码非常好,这是 gcc 优化器的错。现在不清楚 gcc 的人是否搞砸了,或者他们是否遵循了诸如"如果用户编写 OMP,他们应该通过测量并行版本更快来发现。不要优化它。我会把钱放在后者上,但如果你想确定的话,去拜访 gcc bugzilla。
剩下的就是我在评论中提到的结论:衡量一切。
在这种特殊情况下:如果您想定位 gcc 和 VC,只需在两种环境中测量这两种变体,然后将更好的变体交付给您的客户。如果你觉得这是一个 gcc 性能错误,你仍然可以为他们编写一个错误报告。
最后一句话:
如果你的真实代码是像这里这样的双循环,请考虑并行化最外部的代码以节省昂贵的OMP启动过程(但measure(!),这当然可能没有帮助。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何在MS Visual Studio 2019中运行QT UI
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- Visual Studio Code - C++ Debugger 無法啟動
- Visual Studio 2019:插入多个C++风格的单行注释
- Visual Studio Code "undefined reference to `WinMain@16'"
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- Visual Studio中的函数声明和函数定义问题
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- Visual Studio mkl_link_tool.exe链接错误
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 不同的Visual Studio版本中缺少.dll
- 用Visual Studio在C++中嵌入Julia
- Visual Studio 2017循环自动向量化问题
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- Visual Studio在尝试读取resource.txt文件时崩溃
- Visual Studio 2017 不允许我创建 C++ 专用模板