计算效率高的C++-一般阅读
Computationally efficient C++ - general reading
我的工作主要是高性能的"科学"计算。我已经做了大约15年了,但直到最近才意识到我的软件浪费了计算时间。简而言之:我编写高效C++代码的方法不再有效
我不时看到一些孩子写的一段代码,它做的计算基本上和我的相同(相同的算法,相似的方法),但神奇的是!-性能要快得多。在大多数情况下,我甚至无法找到差异的根源!
我的问题是:我如何学习现代C++代码优化的艺术也许是SSE上的问题,缓存/内存对齐问题?欢迎任何书籍、PDF、文章、练习或网站的建议!
PS。我很清楚其中一种技巧:
- 过于笼统(例如"使用探查器"、"使用良好的算法"、"多线程")
- 琐碎(例如,"避免虚拟函数"、"Do++i而非i++"、"Enable-O3")
- 有问题(例如,"使用interpret_cast<>重用内存"、"将正弦和余弦制表"、"编写内联程序集")
- 可笑(例如"执行模板元编程")
这些不是我所问的。
我也从事科学计算,尽管时间比OP长,主要是在Fortran中。根据我的经验,这里有一些建议;
1) 了解编译器的最新功能。一方面,不要试图在编译器知道的优化技巧上击败编译器,另一方面,要知道编译器仍然不擅长什么。例如,现在我认为我可以在循环平铺方面比我的编译器做得更好。学习如何让编译器更容易地优化代码。
OP很想把这一点作为一个建议的例子,因为它太笼统了,没有用。我看到"英特尔C++编译器手册"有大约800页的编译器选项文档,还有400页关于优化应用程序的文档。OP是否阅读了所有这些(或首选编译器的类似数量的文档)?
2) 及时了解计算机体系结构,特别是内存层次结构和fpus的设计。如果没有别的,这有助于理解人们可以合理预期的性能极限。但它也为程序设计和实现的决策提供了输入,并指示当程序转移到下一代硬件时,这些决策应该如何改变。
3) 使用库。写代码是最后的手段。
4) 不要对模板元编程之类的想法嗤之以鼻,因为它们在帮助程序员创建快速代码方面有着很好的声誉。学习促进和闪电战。
5) 项目绩效是一门经验学科。只相信数据,不相信论据。甚至连我的论点都没有。
最后,即使在大规模高性能计算中(我最大的工作在10K CPU上运行了好几天,所以我对此有一点了解),有时需要优化的活动是开发时间,而不是执行时间。
PS你向孩子请教了吗?
处理器比15年前快得多。内存没有以同样的速度增长。这与更大的数据集相结合,特别是在大型科学模拟中,意味着你必须更加仔细地思考如何访问数据。这也许是其中的一个区别。
我发现这些文章很有趣:
http://overbyte.com.au/2011/10/21/optimisationmasterclass1/
http://overbyte.com.au/2011/11/10/optimisation-lesson-2/
它们是由我认识的一个人写的,他写游戏引擎,现在优化PS3游戏。你可能会发现它们很有用。
我不能称这家伙为"孩子",但你可能会发现这门课很有用:高级STL来自MSDN Channel9 Stephan T Lavavej(那里的VC++团队成员和STL维护者)的讲座。不过,视频的质量对我来说并不好。也许,你会更幸运。
《计算机体系结构-定量方法》一书。不是专门针对C++,而是更重要的整体架构。这对HPC来说甚至比任何"技巧和窍门"都更重要。
记录时间前我读了两本对我有帮助的书:
- 利用Bulka&Meyhew
- 更有效的C++
此外,定期访问BrDobbs,当然还有stackoverflow!!!
不要忘记网格处理。可以跨多个CPU或多个线程执行长计算。
这是一种提高计算时间的现代方法。
其他的往往是标准的:-高效使用缓存-延迟评估的有效利用
并且在进行所有这些操作的同时避免锁定/解锁。
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- C++高阶模板
- 获取 SFML 窗口的 HWND 和高可用性?
- Opencv 恢复到比我设置的更高的分辨率
- 代码的效率. 转到和函数调用
- 输入较高值时的分段代码
- 高精度双精度的 Sprintf 格式化问题
- 对于循环C++可能效率低下
- 使数组的内存效率更高
- 内存效率高 map<pair<int,int>, set<int>> alternative
- 为什么同时使用一个赋值运算符处理复制和移动赋值效率不高
- 对于静态错误字符串,哪个的内存/性能效率更高,或者有替代方案
- 计算效率高的C++-一般阅读
- 5字节QByteArray的内存占用空间.5字节的quint64或QByteArray存储效率更高吗
- std::next_permutation实现解释似乎效率不高
- 矢量化图像块处理效率高
- 内存和处理效率高的多维数据结构C++
- 与调用函数相比,goto语句效率高吗?