|
|
1
16
首先要做的是收集轮廓数据,第二件事是考虑你的算法。我相信你知道这一点,但它们必须被纳入任何性能编程讨论中。
下一点要说明的是,代码中的显著加速(除了算法改进之外)几乎肯定来自并行性,而不是线性增加。桌面计算机现在可以在一个任务中抛出4或8个内核,这比稍好一点的代码生成器具有更大的性能潜力。因为您熟悉C/C++,所以OpenMP几乎是一个不需要动脑筋的工具;使用它来并行化循环非常容易(显然,您必须观察循环携带的依赖项,但它绝对是“可能工作的最简单并行”)。
进入什么编程语言可能比C++更好的问题,答案是“编程语言,积极促进/促进并行和并行编程的概念。”Erlang是球的美女在这方面,是一个“热”。现在,大多数对性能编程感兴趣的人都在关注它,所以如果你想提高你在这方面的技能,你可能想看看它。 |
|
|
2
14
它总是算法,很少是语言。这是我的线索:“当我在改进算法时”。 调整可能还不够。 考虑对算法的根本改变。您必须消除处理,而不是使处理速度加快。罪魁祸首往往是“搜索”——在数据中循环寻找某些东西。找到消除搜索的方法。如果您无法消除它,请使用某种树搜索或某种哈希映射替换线性搜索。 |
|
|
3
6
我建议:
C++应该能够让你接近代码中最可能的性能,所以我不建议切换语言。另一个建议是,根据应用程序的不同,您可能能够在使用多线程的多代码/处理器系统上获得更好的性能。 |
|
|
4
4
|
|
|
5
3
就我个人而言,我会研究那些允许你最容易地利用并行性的语言,除非这是一种完全不可并行的情况。如果可能的话,能够栓接一些额外的内核并获得近似线性的改进,可能比挤出额外的几%的效率要划算得多。 说到并行化,我相信函数式语言通常被认为是最好的方法,或者你可以看看OpenMP for C/C++。(就我个人而言,作为一个管理语言的人,我会考虑Java/.NET的库,但我很清楚不是每个人都有相同的首选项!) |
|
6
3
试试Fortran 77——在计算方面,没有什么能比得上编程语言的老祖宗。另外,请尝试使用OpenMP,以利用多个核心。 |
|
|
7
3
如果你已经从传统算法的角度对算法做了任何你能做的事情,并且你也消除了过度,那么你可能是SOL,或者 可以从硬件的角度考虑优化程序。 例如,每当您在堆周围跟随指针时,您都会由于缓存未命中(可能是分页等)而付出巨大的代价,这些都会影响分支预测。大多数程序员(甚至是C大师)倾向于从功能的角度看CPU,而不是从幕后发生的事情。有时,重新组织内存(例如通过“扁平化”或手动分配内存以适应同一页面)可以获得巨大的加速。我设法通过展平我的结构,在图形遍历上获得了2倍的加速。 这些不是编译器将为您做的事情,因为它们是基于您对程序的高级理解。 |
|
|
8
2
正如lobrien所说,您还没有提供任何信息告诉我们手工优化的ASM代码是否有帮助。。。这意味着答案可能是“还没有。” 您是否使用探查器运行代码? 您知道是内存限制还是处理器限制导致代码运行缓慢吗? 您正在使用所有可用的内核吗?
如果您已经完成了所有这些,那么您对程序运行的环境有多大的控制权?(如果您正在考虑切换操作系统,可能会有很多)您是否可以禁用其他进程,给予进程最高优先级,等等?找一台具有更快处理器、更多内核或更多内存(取决于您所受的限制)的机器怎么样 不断地。
祝你好运你正在解决一个有趣的问题。 |
|
|
9
1
例如,使用一个好的BLAS库,从LINPACK切换到LAPACK使LU分解/求解速度提高了10倍。 |
|
|
10
1
首先,按照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
正如Oregonghost已经暗示的那样,VectorC编译器可能会有所帮助。不过,它并没有真正实现代码的并行化,相反,您可以使用它来利用mmx或sse等扩展命令集。在软件渲染引擎中,我将其用于时间最关键的部分,它在大多数处理器上的加速率约为150%-200%。 |
|
|
12
0
对于另一种方法,您可以研究 Distributed Computing 听起来它能满足你的需要。 |
|
|
13
0
compiler intrinsics (完整参考 here )1.我知道VC++有 similar functionality ,我相信你可以用gcc做同样的事情。这些可以让您充分利用CPU内置的并行性。您可以使用MMX、SSE和SSE2指令在一定程度上提高性能。正如其他人所说,您可能最好先看看算法。 |
|
|
14
0
我建议你重新考虑你的算法,或者更好,你的方法。另一方面,你试图计算的东西可能需要很多计算时间。您是否考虑过将其分发,以便它可以在某种集群中运行?如果您想通过为您的应用程序引入汇编程序来专注于纯代码优化 inner loops 然后,这通常是非常有益的(如果你知道你在做什么)。 |
|
|
15
0
对于现代处理器,学习ASM需要很长时间。此外,有了所有不同版本的SSE,您的代码最终将非常依赖于处理器。
您必须手动优化代码和改进算法。恐怕没有“神奇的精灵之尘”能让现有代码更快。 如果您还没有,并且您关心性能,那么您必须通过一个好的分析器来运行代码(我个人喜欢Linux上的kcachegrind&valgrind,或者Mac OS X上的Shark。恐怕我不知道什么对windows有好处)。
|
|
|
16
0
“CPU受限”的两个明显答案是: 2.用别的东西。
另一个解决方案是在任务中投入更多的专用硬件。这可能是CPU的向量单位——考虑到Windows=x86/x64,这将是SSE的一种风格。另一种矢量硬件是现代GPU。GPU也有自己的内存总线,速度相当快。 |
|
17
0
|
|
|
18
0
http://www.appistry.com/resource-library/index.html
http://www.appistry.com/developers/ 我在Appistry工作,我们已经为cpu受限的任务进行了许多安装,这些任务是由10台或100台机器完成的。 希望这有帮助, -布雷特 |
|
|
19
0
|
|
|
20
0
Linux切换到Linux会有所帮助,如果你把它精简到你真正需要的部分。 |
|
|
21
0
CrowdProcess 大约有2000名员工可以用来计算算法。API非常简单,我们已经观察到接近工人数量的加速。你也可以编写JavaScript,这会使你比C++或ASM更有生产力。 所以如果你在C++或ASM之间,我会说你应该首先使用所有的CPU内核,如果不够的话,CuldPrand应该是一个有趣的平台。 免责声明:我构建了CrowdProcess。 |
|
|
22
-1
很难产生比原始C或C++代码快的ASM代码。在大多数情况下,如果你把这项工作做得很好,你可能只获得不到百分之几的提速,获得10%的提速被认为是巨大的成功,但在大多数情况下,这是不可能的。 编译器能够理解如何高效编译。您应该进行配置,以确定在何处进行优化。 |
|
Sweepy Dodo · JSON lite的格式化 1 年前 |
|
|
giantjenga · 优化整数向量到二进制向量的转换 1 年前 |
|
Zegarek · Postgresql递归查询未提供预期结果 1 年前 |
|
|
Joe · 为什么这两个查询之间的性能存在如此大的差异? 2 年前 |
|
tic-toc-choc · 在`dplyr中高效使用列表进行过滤` 2 年前 |