代码之家  ›  专栏  ›  技术社区  ›  Pavel Feldman

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

  •  5
  • Pavel Feldman  · 技术社区  · 18 年前

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

    22 回复  |  直到 18 年前
        1
  •  16
  •   Larry OBrien    18 年前

    首先要做的是收集轮廓数据,第二件事是考虑你的算法。我相信你知道这一点,但它们必须被纳入任何性能编程讨论中。

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

    进入什么编程语言可能比C++更好的问题,答案是“编程语言,积极促进/促进并行和并行编程的概念。”Erlang是球的美女在这方面,是一个“热”。现在,大多数对性能编程感兴趣的人都在关注它,所以如果你想提高你在这方面的技能,你可能想看看它。

        2
  •  14
  •   S.Lott    18 年前

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

    调整可能还不够。

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

        3
  •  6
  •   Nick    18 年前

    我建议:

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

    C++应该能够让你接近代码中最可能的性能,所以我不建议切换语言。另一个建议是,根据应用程序的不同,您可能能够在使用多线程的多代码/处理器系统上获得更好的性能。

        4
  •  4
  •   OregonGhost    18 年前

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

    • 尝试一个可以并行化代码的编译器,比如 VectorC 编译器。
    • 您也可以尝试GPGPU,即在GPU而不是CPU上执行大部分算法。根据您的算法,它可以大大加快速度。

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

        5
  •  3
  •   Jon Skeet    18 年前

    就我个人而言,我会研究那些允许你最容易地利用并行性的语言,除非这是一种完全不可并行的情况。如果可能的话,能够栓接一些额外的内核并获得近似线性的改进,可能比挤出额外的几%的效率要划算得多。

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

        6
  •  3
  •   Nemanja Trifunovic    18 年前

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

        7
  •  3
  •   Uri    18 年前

    如果你已经从传统算法的角度对算法做了任何你能做的事情,并且你也消除了过度,那么你可能是SOL,或者 可以从硬件的角度考虑优化程序。

    例如,每当您在堆周围跟随指针时,您都会由于缓存未命中(可能是分页等)而付出巨大的代价,这些都会影响分支预测。大多数程序员(甚至是C大师)倾向于从功能的角度看CPU,而不是从幕后发生的事情。有时,重新组织内存(例如通过“扁平化”或手动分配内存以适应同一页面)可以获得巨大的加速。我设法通过展平我的结构,在图形遍历上获得了2倍的加速。

    这些不是编译器将为您做的事情,因为它们是基于您对程序的高级理解。

        8
  •  2
  •   Moishe Lettvin    18 年前

    正如lobrien所说,您还没有提供任何信息告诉我们手工优化的ASM代码是否有帮助。。。这意味着答案可能是“还没有。”

    您是否使用探查器运行代码?

    您知道是内存限制还是处理器限制导致代码运行缓慢吗?

    您正在使用所有可用的内核吗?

    如果您已经完成了所有这些,那么您对程序运行的环境有多大的控制权?(如果您正在考虑切换操作系统,可能会有很多)您是否可以禁用其他进程,给予进程最高优先级,等等?找一台具有更快处理器、更多内核或更多内存(取决于您所受的限制)的机器怎么样

    不断地。

    祝你好运你正在解决一个有趣的问题。

        9
  •  1
  •   Greg Rogers    18 年前

    例如,使用一个好的BLAS库,从LINPACK切换到LAPACK使LU分解/求解速度提高了10倍。

        10
  •  1
  •   Mr Fooz    18 年前

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

    // 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]);
    }
    ...
    

    并将其转换为:

    for (int i=0; i<N; i++) {
      double tmp = dosomething(i);
      tmp = somethingElse(tmp);
      ...
      myArray[i] = tmp;
    }
    ...
    

    在这种特殊情况下,这产生了大约2倍的加速。

        11
  •  1
  •   Adrian Grigore    17 年前

    正如Oregonghost已经暗示的那样,VectorC编译器可能会有所帮助。不过,它并没有真正实现代码的并行化,相反,您可以使用它来利用mmx或sse等扩展命令集。在软件渲染引擎中,我将其用于时间最关键的部分,它在大多数处理器上的加速率约为150%-200%。

        12
  •  0
  •   QAZ    18 年前

    对于另一种方法,您可以研究 Distributed Computing 听起来它能满足你的需要。

        13
  •  0
  •   Salman A    18 年前

    compiler intrinsics (完整参考 here )1.我知道VC++有 similar functionality ,我相信你可以用gcc做同样的事情。这些可以让您充分利用CPU内置的并行性。您可以使用MMX、SSE和SSE2指令在一定程度上提高性能。正如其他人所说,您可能最好先看看算法。

        14
  •  0
  •   Luke    18 年前

    我建议你重新考虑你的算法,或者更好,你的方法。另一方面,你试图计算的东西可能需要很多计算时间。您是否考虑过将其分发,以便它可以在某种集群中运行?如果您想通过为您的应用程序引入汇编程序来专注于纯代码优化 inner loops 然后,这通常是非常有益的(如果你知道你在做什么)。

        15
  •  0
  •   Chris Jefferson    18 年前

    对于现代处理器,学习ASM需要很长时间。此外,有了所有不同版本的SSE,您的代码最终将非常依赖于处理器。

    您必须手动优化代码和改进算法。恐怕没有“神奇的精灵之尘”能让现有代码更快。

    如果您还没有,并且您关心性能,那么您必须通过一个好的分析器来运行代码(我个人喜欢Linux上的kcachegrind&valgrind,或者Mac OS X上的Shark。恐怕我不知道什么对windows有好处)。

        16
  •  0
  •   MSalters    18 年前

    “CPU受限”的两个明显答案是: 2.用别的东西。

    另一个解决方案是在任务中投入更多的专用硬件。这可能是CPU的向量单位——考虑到Windows=x86/x64,这将是SSE的一种风格。另一种矢量硬件是现代GPU。GPU也有自己的内存总线,速度相当快。

        17
  •  0
  •   Mike Dunlavey    17 年前
        18
  •  0
  •   Brett McCann    17 年前

    http://www.appistry.com/resource-library/index.html

    http://www.appistry.com/developers/

    我在Appistry工作,我们已经为cpu受限的任务进行了许多安装,这些任务是由10台或100台机器完成的。

    希望这有帮助, -布雷特

        20
  •  0
  •   Brad Gilbert    17 年前

    Linux

    切换到Linux会有所帮助,如果你把它精简到你真正需要的部分。

        21
  •  0
  •   João Pinto Jerónimo    12 年前

    CrowdProcess 大约有2000名员工可以用来计算算法。API非常简单,我们已经观察到接近工人数量的加速。你也可以编写JavaScript,这会使你比C++或ASM更有生产力。

    所以如果你在C++或ASM之间,我会说你应该首先使用所有的CPU内核,如果不够的话,CuldPrand应该是一个有趣的平台。

    免责声明:我构建了CrowdProcess。

        22
  •  -1
  •   Luka Rahne    14 年前

    很难产生比原始C或C++代码快的ASM代码。在大多数情况下,如果你把这项工作做得很好,你可能只获得不到百分之几的提速,获得10%的提速被认为是巨大的成功,但在大多数情况下,这是不可能的。

    编译器能够理解如何高效编译。您应该进行配置,以确定在何处进行优化。