Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算效率高的C++;-通读_C++_Performance_Optimization - Fatal编程技术网

C++ 计算效率高的C++;-通读

C++ 计算效率高的C++;-通读,c++,performance,optimization,C++,Performance,Optimization,我的工作主要是高性能的“科学”计算。我已经做了15年了,但直到最近才意识到我的软件浪费了计算时间。简而言之:我编写高效C++代码的方法不再工作。< /强> 有时我会看到一段代码,是某个孩子写的,它的计算方法和我的基本相同(相同的算法,相似的方法),但是——神奇的是执行速度要快得多。在大多数情况下,我甚至无法找到差异的根源 我的问题是:我如何才能学习现代C++代码优化的艺术?也许是SSE、缓存/ MEM对齐问题?欢迎对书籍、PDF、文章、练习或网站提出任何建议 另外,我非常了解以下技巧: 过于

我的工作主要是高性能的“科学”计算。我已经做了15年了,但直到最近才意识到我的软件浪费了计算时间。简而言之:<强>我编写高效C++代码的方法不再工作。< /强>

有时我会看到一段代码,是某个孩子写的,它的计算方法和我的基本相同(相同的算法,相似的方法),但是——神奇的是执行速度要快得多。在大多数情况下,我甚至无法找到差异的根源

我的问题是:<强>我如何才能学习现代C++代码优化的艺术?<强>也许是SSE、缓存/ MEM对齐问题?欢迎对书籍、PDF、文章、练习或网站提出任何建议

另外,我非常了解以下技巧:

  • 过于笼统(例如,“使用探查器”、“使用好的算法”、“使用多线程”)
  • 琐碎的(例如,“避免使用虚拟函数”、“用Do++i代替i++”、“启用-O3”)
  • 有问题(例如,“通过重新解释转换重用内存”、“将正弦和余弦列表化”、“写入内联汇编”)
  • 荒谬(例如“做模板元编程”)
这些不是我要问的。

我不能称这家伙为“孩子”,但你可能会发现这门课很有用:
来自Stephan T Lavavej(那里的STL的VC++团队成员和维护者)的MSDN Channel9讲座。不过,视频的质量对我来说并不好。也许你会更幸运。

很久以前,我读了两本书,这两本书对我很有帮助:

  • Bulk&MeHew
  • 的高效C++编程技术
  • 更有效的C++

  • 此外,定期访问,当然还有stackoverflow

    处理器比15年前快得多。内存没有以同样的速度增长。这与更大的数据集相结合,特别是在大型科学模拟中,意味着您必须更仔细地考虑如何访问数据。这可能是其中的一个区别

    我发现这些文章很有趣:


    他们是由一个我认识的家伙写的,他编写了游戏引擎,现在他优化了PS3游戏。您可能会发现它们很有用。

    不要忘记网格处理。长计算可以跨多个CPU或多个线程执行

    这是一种提高计算时间的现代方法

    其他的往往是标准的: -高效使用缓存 -有效使用惰性评估


    同时避免锁定/解锁。

    我也从事科学计算工作,虽然时间比OP长,主要是Fortran语言。根据我的经验,这里有一点建议

    1) 了解编译器的最新功能。一方面,不要试图在编译器知道的优化技巧上击败编译器,另一方面,要知道编译器仍然不擅长的是什么。例如,现在我认为我可以在循环平铺方面比我的编译器做得更好。还要学习如何使编译器易于优化代码

    OP很可能会把这一点作为一个过于笼统而没有用处的建议的例子。我看到英特尔C++编译器手册有大约800页的编译器选项文档,还有400篇关于优化应用程序的文档。OP是否阅读了所有这些(或类似数量的首选编译器文档)

    2) 跟上计算机体系结构,特别是内存层次结构和FPU的设计。如果没有别的,这有助于理解人们可以合理预期的性能极限。但它也为程序设计和实现的决策提供输入,并指示当程序被转移到下一代硬件时,这些决策应该如何改变

    3) 使用图书馆。编写代码是最后的选择

    4) 不要对模板元编程之类的想法嗤之以鼻,它们在帮助程序员创建快速代码方面有着很好的声誉。研究推进和闪电战

    5) 项目绩效是一门经验性学科。只相信数据,不相信论据。甚至连我的论点都没有

    最后,即使在大规模高性能计算中(我最大的作业在10K CPU上运行数天,所以我对此有一点了解),有时优化的活动是开发时间,而不是执行时间


    PS你有没有向孩子请教?

    hennessey和patterson的《计算机体系结构-定量方法》一书。不是专门针对C++,但更重要的是整个架构。对于HPC来说,这比任何“技巧和技巧”都更为重要。

    在我看来,这是一本好书:从我到目前为止所看到的,我想说的是,尽可能避免动态内存分配,智能地打包数据,而不是随机打包。一般来说,应用程序内存是瓶颈(除了磁盘/网络IOs…)。此外,在机器翻译的情况下,虚假共享是一个杀手,因为我们有真正的多核/多处理器环境;诊断起来也有点困难。然而,不知道这如何适用于科学计算。“…无法追踪差异的起源!”-这,IMHO,无意冒犯,表明您没有加快调试/分析工具的速度。假设模板元编程通常是荒谬的,这是荒谬的。特别是当宣布者声称自己有科学背景并称那些最新的人为“孩子”时。也许你变得生疏了,甚至懒散了?@马丁:我有点同意,但还是很难真正理解这种差异是从哪里来的。使用O3,函数内联,循环展开和重新排列,等等。。。因此,理解为什么C++代码更改产生了这些影响是令人畏惧的。