您是否使用Multi-Core获得速度?你做了什么,是否值得努力?

时间:2009-03-10 18:52:46

标签: performance multicore

所以在发布之前我没有看到正确的位置..

I was looking at the result of the computer language benchmark game:

<http://shootout.alioth.debian.org/u32q/index.php>

And it seems that most of the fastest solutions are still C/C++ using just 
a single core of the 4 core machine that runs the tests.

I was wondering if multi-core is worth it at all for single tasks or if you 
really need some more speed just tune up your code, rewrite in C/C++ instead.

当您点击完整的基准链接时,例如:http://shootout.alioth.debian.org/u32q/benchmark.php?test=knucleotide&lang=all很明显,很多解决方案都使用多个核心。

听到您的个人经历仍然很有趣:

您是否成功使用4或8个内核才能真正提高单个任务的性能?

您使用了哪些工具/语言?

改善有多大?

值得努力吗?

11 个答案:

答案 0 :(得分:3)

  

似乎最快的解决方案仍然是使用运行测试的4核心机器的单个核心的C / C ++。

不,所有代码都不是这样。实际上,在我看过的代码中,都使用多个并行线程,因此使用多个内核。实际上,有些(例如k-nucleotide)使用像OpenMP这样的花哨架构(或者,也很有趣,SSE parallelization)来帮助并行化。

编辑事实上,每个问题最快的C ++解决方案都使用并行线程,但有三个例外:

  1. fasta benchmark,由于随机生成器的使用而难以(但完全可能)进行并行化。
  2. pidigits,使用GMP库。
  3. n-body,可以并行化。
  4. ......大多数其他解决方案也使用SSE2支持。

答案 1 :(得分:2)

为了提高多核系统上单个任务的性能,您必须将任务设计为拆分为不同的部分(ala mapreduce),并将每个部分交给不同的核心。很多程序都是这样做的,它确实提高了性能。

一些压缩算法目前支持多个处理器,例如7zip。做这样的事情并不是非常困难,但如果你的任务不能分成合作部分,你就不会从多个核心获得任何帮助。

答案 2 :(得分:1)

这实际上取决于算法的工作原理以及您正在处理的数据集的大小,以确定它是否可以跨多个核心进行良好扩展。保持相同的核心为您提供了很多优势,包括利用处理器流水线和使用寄存器和缓存 - 所有这些都非常快。

随着多核在未来变得越来越重要,我们可能会看到一些有趣的跨核优化变得可用。

答案 3 :(得分:0)

如何定义“单一任务”?然而,许多单个概念性任务可以分成许多独立的子任务。这就是多个核心可以提供性能提升的地方。

当然,这需要您实际构建程序,以便这些子任务实际上可以独立处理。

答案 4 :(得分:0)

我在执行蒙特卡罗模拟时经常使用多核。在这种情况下,它可能是一个绝对的天赐之物,因为有时这些模拟需要永远,每次运行都与其他运行无关。事实上,现在我正在等待蒙特卡罗模拟在我的四核上运行。

另一个用例是使用交叉验证测试机器学习算法。数据集可以加载一次并存储在不可变对象中。然后,可以独立地执行每个交叉验证迭代。对于这样的事情,关键是要小心内存分配并避免这涉及的隐式锁定获取。如果你不经常分配和免费/垃圾收集,那么所用核心的加速可能接近线性。

答案 5 :(得分:0)

我已经看到在处理管道上很容易获得4倍的改进。

答案 6 :(得分:0)

某些类型的任务可以简单地进行多线程处理,因此可以在具有多个核心的系统中提高性能。

图像处理是一个可以从多核中受益的领域。例如,应用图像过滤器是独立于图像其他部分的结果的过程。因此,如前面Alex Fort's answer中所述,通过将问题(在这种情况下,图像过滤)分成多个部分并在多个线程中运行处理,我能够看到处理时间减少。

事实上,多线程不仅提高了多核处理器的性能,还提高了基于Intel Atom N270的系统的性能,该系统只有一个内核,但通过同时多线程(hyper-threading)提供两个逻辑内核。 / p>

我执行了一些使用多个线程(通过将处理分成四个线程)和一个线程来应用图像过滤器的测试。

对于多线程,来自ExecutorServicejava.concurrent package用于协调多线程处理。实现此功能相当简单。

虽然不是精确的数字,也不是完美的基准,但在双核Core 2 Duo上,与单线程代码相比,多线程代码的处理时间减少了30-50%,并且在超线程Atom上,减少20-30%。

与将问题分成几部分的其他问题一样,这种处理方法的可扩展性将取决于问题被拆分和组合的步骤所花费的时间。

答案 7 :(得分:0)

我在REALbasic中编写了一个CD标签编辑程序,它是跨平台的(因此无法仅仅依赖于GDI +或Cocoa)。它允许将多个蒙版图像分层,并剪切到标签形状。

我从语言内置的图像blit和缩放例程转换为使用plugin,它最多可以使用4个核心,并实现了关键用户操作的显着加速,尤其是在缩放时。

对于插入式解决方案来说,这是一个很好的域分离 - 我将单个映像传递给二进制插件,并在内部对处理器中的工作进行分区。作为一个图书馆解决方案,它不需要我的程序的多核意识。

答案 8 :(得分:0)

make -j 6

在7分钟的建造中花了6分钟。 :)

答案 9 :(得分:0)

我想提醒所有人Amdahl's Law,,这是对并行性增加所带来的收益递减的描述,并且还用于模拟给定算法可以预期多少加速。

答案 10 :(得分:0)

我在项目中使用16个核心(在Amazon EC2实例中)达到了高速加速以解决SVM,我的加速从10倍到16倍,具体取决于算法使用的数据集:

https://github.com/RobeDM/LIBIRWLS

这是我写的那篇论文:

http://www.sciencedirect.com/science/article/pii/S0167865516302173