Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++ 对于CPU受限的应用程序,您建议使用哪种语言/平台?_C++_Performance_Algorithm - Fatal编程技术网

C++ 对于CPU受限的应用程序,您建议使用哪种语言/平台?

C++ 对于CPU受限的应用程序,您建议使用哪种语言/平台?,c++,performance,algorithm,C++,Performance,Algorithm,我正在开发非交互式的cpu应用程序,它只做计算,几乎没有IO。目前,它的工作时间太长,我正在努力改进算法,我还认为它是否能给改变语言或平台带来任何好处。目前,英特尔上的C++编译器(C++上没有OOP,几乎是C)。切换到ASM有帮助吗?有多少帮助?切换到Linux和GCC会有帮助吗?切换到ASM不会有多大帮助,除非您非常擅长它和/或有一个您知道可以做得更好的特定关键路径例程。正如一些人所说,在大多数情况下,现代编译器在利用缓存等方面比任何人手工都要好 我建议: 尝试不同的编译器和/或不同的优化

我正在开发非交互式的cpu应用程序,它只做计算,几乎没有IO。目前,它的工作时间太长,我正在努力改进算法,我还认为它是否能给改变语言或平台带来任何好处。目前,英特尔上的C++编译器(C++上没有OOP,几乎是C)。切换到ASM有帮助吗?有多少帮助?切换到Linux和GCC会有帮助吗?

切换到ASM不会有多大帮助,除非您非常擅长它和/或有一个您知道可以做得更好的特定关键路径例程。正如一些人所说,在大多数情况下,现代编译器在利用缓存等方面比任何人手工都要好

我建议:

  • 尝试不同的编译器和/或不同的优化选项
  • 运行代码覆盖率/分析实用程序,找出关键路径的位置,并努力优化代码中的关键路径

C++应该能够从代码中提供尽可能接近最佳的性能,因此我不建议切换语言。根据应用程序,您可以在多个代码/处理器系统上使用多线程获得更好的性能,作为另一个建议。

< P>而切换到ASM不会带来任何好处,因为英特尔C++编译器可能比您更擅长优化,您可以尝试以下选项之一:

  • 尝试一个将并行化你的代码的编译器,比如编译器
  • 尝试在大量使用MMX、3DNow的情况下切换到asm!,SSE或任何适合您的需求(以及您的CPU)的产品。这将比单纯的asm带来更多好处
  • 您也可以尝试GPGPU,即在GPU而不是CPU上执行大部分算法。根据您的算法,它可以大大加快速度

编辑:我还支持配置文件方法。我建议,支持英特尔C++编译器。

< P>个人,我将查看允许最容易利用并行性的语言,除非它是完全不可并行的情况。如果可能的话,能够栓接一些额外的内核并获得近似线性的改进,可能比挤出额外的几%的效率要划算得多


说到并行化,我相信函数式语言通常被认为是最好的方法,或者你可以看看OpenMP for C/C++。(就我个人而言,作为一个管理语言的人,我会考虑Java/.NET的库,但我很清楚不是每个人都有相同的首选项!)

总是算法,很少是语言。这是我的线索:“当我在改进算法时”

调整可能还不够


考虑对算法的根本更改。您必须消除处理,而不是使处理速度加快。罪魁祸首往往是“搜索”——在数据中循环寻找某些东西。找到消除搜索的方法。如果你不能消除它,用某种树搜索或某种哈希图代替线性搜索。对于另一种方法,

,你可以查看哪些声音能满足你的需要。

< P>只是要彻底:首先要做的是收集配置文件数据,第二件事是考虑你的算法。我相信你知道这一点,但它们必须被纳入任何性能编程讨论中

要直接回答您的问题“切换到ASM是否有帮助?”答案是“如果您不知道答案,那么可能不知道。”除非您非常熟悉CPU体系结构及其内部和外部,否则您的工作不太可能比在代码上优化好的C/C++编译器做得更好

下一点要说明的是,代码中的显著加速(除了算法改进之外)几乎肯定来自并行性,而不是线性增加。桌面计算机现在可以在一个任务中抛出4或8个内核,这比稍好一点的代码生成器具有更大的性能潜力。因为您熟悉C/C++,所以OpenMP几乎是一个不需要动脑筋的工具;使用它来并行化循环非常容易(显然,您必须观察循环携带的依赖项,但它绝对是“可能工作的最简单并行”)

话虽如此,C/C++编译器之间的代码生成质量确实有所不同。英特尔C++编译器由于其优化质量而备受关注,不仅支持OpenMP,而且支持其他技术,如线程构建块。p>
<> P>进入什么编程语言可能比C++更好的问题,答案是“编程语言,它积极促进/促进并行和并行编程的概念。”Erlang是这方面的“美女”,是一个“热门”。现在,大多数对性能编程感兴趣的人都在关注它,所以如果你想提高你在这方面的技能,你可能想看看它。

试试Fortran 77——在计算方面,没有什么能比得上编程语言的老祖宗。另外,请尝试使用OpenMP来利用多核。

有时,您可以找到对您关心的算法进行了优化实现的库。通常情况下,他们会为您完成多线程处理


例如,从LINPACK切换到LAPACK使我们在LU因式分解/求解方面的速度提高了10倍,有了一个好的BLAS库。

首先,按照S.洛特的建议,找出是否可以更改算法

假设算法的选择是正确的,那么如果您有大量正在处理的数据,您可能会查看内存访问模式。对于现在的许多数字运算应用程序,它们是由内存总线绑定的,而不是由ALU绑定的。我最近优化了以下形式的一些代码:

// Assume N is a big number for (int i=0; i<N; i++) { myArray[i] = dosomething(i); } for (int i=0; i<N; i++) { myArray[i] = somethingElse(myArray[i]); } ... //假设N是一个大数字 用于(int i) for (int i=0; i<N; i++) { double tmp = dosomething(i); tmp = somethingElse(tmp); ... myArray[i] = tmp; } ...