代码之家  ›  专栏  ›  技术社区  ›  cbowns

你使用多核的速度?你做了什么,值得付出努力吗?

  •  1
  • cbowns  · 技术社区  · 5 年前

    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 回复  |  直到 15 年前
        1
  •  3
  •   Konrad Rudolph    15 年前

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

    k-nucleotide )使用像OpenMP这样的奇特架构(或者,也很有趣, SSE parallelization )以帮助并行化。

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

    1. fasta benchmark
    2. pidigits ,使用GMP库。
    3. n-body ,可以并行化。

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

        2
  •  2
  •   Alex Fort    15 年前

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

    一些压缩算法目前支持多个处理器,如7zip。这样做并不十分困难,但如果您的任务不能分成多个协作部分,那么您将无法从多个核心获得任何帮助。

        3
  •  1
  •   James L    15 年前

    这实际上取决于算法的工作方式和您正在处理的数据集的大小,以及它是否能够跨多个核心进行良好的扩展。保持在同一个内核上会给你带来很多好处,包括利用处理器流水线和使用寄存器和缓存——所有这些都是超快速的。

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

        4
  •  0
  •   Stack Overflow is garbage    15 年前

    如何定义“单一任务”?然而,许多单一的概念性任务可以分解为许多独立的子任务。这就是多核的地方 也许

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

        5
  •  0
  •   dsimcha    15 年前

    在进行蒙特卡罗模拟时,我经常使用多核。在这种情况下,这可能是天赐良机,因为有时这些模拟会花费很长时间,每次运行都独立于其他运行。事实上,现在我正在等待蒙特卡罗模拟在我的四核上运行。

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

        6
  •  0
  •   Joshua    15 年前

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

        7
  •  0
  •   Community VonC    7 年前

    Alex Fort's answer ,通过将问题(在本例中为图像过滤)拆分为多个部分并在多个线程中运行处理,我能够看到处理时间的减少。

    hyper-threading ).

    ExecutorService java.concurrent package 用于协调多线程处理。实现这个功能相当简单。

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

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

        8
  •  0
  •   Andy Dent    15 年前

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

    plugin

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

        9
  •  0
  •   dicroce    15 年前

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

        10
  •  0
  •   Paul Nathan    15 年前

    Amdahl's Law, 这是对通过增加并行性而获得的收益递减的描述,也用于模拟给定算法的预期加速程度。

        11
  •  0
  •   Rob    8 年前

    在一个解决支持向量机的项目中,我使用16个内核(在Amazon EC2实例中)实现了很高的加速比,根据算法使用的数据集,我的加速比从10倍提高到16倍:

    https://github.com/RobeDM/LIBIRWLS

    这是我写的论文:

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