1

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

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=k核苷酸&lang =all 时,很明显有不少解决方案使用多核。

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

您是否曾成功使用 4 或 8 个内核来实际提高单个任务的性能?

你使用了什么工具/语言?

改进有多大?

值得付出努力吗?

4

11 回答 11

3

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

不,并非所有代码都如此。事实上,在我看过的代码中,都使用了多个并行线程,因此也使用了多个内核。事实上,一些(例如k-核苷酸)使用像 OpenMP (或者,也有趣的是,SSE 并行化)这样的奇特架构来帮助并行化。

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

  1. fasta benchmark,由于随机生成器的使用,很难(但完全可能)并行化。
  2. pidigits,使用 GMP 库。
  3. n-body,可以并行化。

…大多数其他解决方案也使用 SSE2 支持。

于 2009-03-10T18:58:41.573 回答
2

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

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

于 2009-03-10T18:54:01.553 回答
1

这实际上取决于算法的工作原理以及您正在处理的数据集的大小,以及它是否可以很好地跨多个内核扩展。保持在同一个内核上会给您带来很多优势,包括利用处理器流水线以及使用寄存器和缓存——所有这些都非常快。

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

于 2009-03-10T18:59:39.450 回答
0

您如何定义“单一任务”?尽管如此,许多单一的概念性任务仍可以拆分为许多独立的子任务。这就是多核可以提供性能提升的地方。

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

于 2009-03-10T19:05:56.657 回答
0

在执行蒙特卡罗模拟时,我经常使用多核。在这种情况下,这绝对是天赐之物,因为有时这些模拟需要很长时间,并且每次运行都独立于其他运行。事实上,现在我正在等待蒙特卡罗模拟在我的四核上运行。

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

于 2009-03-11T02:59:43.290 回答
0

我已经看到在处理管道上轻松获得了 4 倍的改进。

于 2009-03-11T03:21:08.213 回答
0

某些类型的任务可以是微不足道的多线程,因此可以提高具有多个内核的系统的性能。

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

事实上,多线程不仅在多核处理器上提高了性能,而且在我的基于 Intel Atom N270 的系统上也提高了性能,该系统只有一个内核,但通过同时多线程(超线程)提供两个逻辑内核。

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

对于多线程,ExecutorServicefromjava.concurrent用于协调多线程处理。实现这个功能相当简单。

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

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

于 2009-03-11T03:46:26.233 回答
0

我用跨平台的 REALbasic 编写了一个 CD 标签编辑程序(因此不能只依赖 GDI+ 或 Cocoa)。它允许对多个蒙版图像进行分层,并通过剪切来标记形状。

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

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

于 2009-03-11T04:30:49.250 回答
0

使-j 6

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

于 2009-03-11T04:34:43.077 回答
0

我想提醒大家阿姆达尔定律,它描述了增加并行性所获得的收益递减,并且还用于模拟给定算法可以预期的加速程度。

于 2009-03-11T04:37:45.863 回答
0

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

https://github.com/RobeDM/LIBIRWLS

这是我写的论文:

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

于 2016-11-03T21:11:17.310 回答