【问题标题】:Multithreading Computations in JavaJava中的多线程计算
【发布时间】:2016-09-06 12:48:17
【问题描述】:

我有一个关于 java 中的多线程(并行性)的问题。事实上,我实现了两个程序来计算 Mandelbrot 集:

  1. 第一次启动 n 个线程,每个线程计算 Mandelbrot 高度的一部分(例如:https://www.logre.eu/mediawiki/images/4/49/Mandelbrot_h_block.png)。

  2. 第二个启动一个包含 n 个线程的池,其中每个线程计算 Mandelbrot 的一行像素(例如:https://www.logre.eu/mediawiki/images/f/f2/Mandelbrot_horizontal.png)。

我在双核机器上进行了不同的分析,如果线程数 (n) 大于内核数,我不明白为什么第一个程序比第二个程序快。如果线程数低于内核数,则情况相反。

谁能帮帮我?

注意:计算这个程序的线程是否也有限制?

【问题讨论】:

  • 这缺少所有需要的细节。如果没有看到代码或您如何对其进行分析,我们不知道您是否正确且公平地完成了该操作。没有看到时间,我们不知道差异有多大。我们甚至不知道n

标签: java multithreading parallel-processing computation


【解决方案1】:

由于池中的线程消耗的内存量与单个线程相同,因此优势在于 ctx 切换以及线程池如何创建/删除活动线程。 如果运行它们的线程比内核多得多,则程序将在上下文切换上花费太多时间。

假设您在 2 核上有 1000 个线程(如您所说),您将有太多的上下文切换,因此线程池的性能会更好。

所以我猜你并没有在这两种情况下创建这么多线程,并且差异并不明显。

如果差异很明显,也许您可​​以尝试向我们展示您的代码,以便为您提供更多信息。

检查您可以在另一个post 中计算的线程数。

【讨论】:

    【解决方案2】:

    你在比较苹果和橘子。两种不同的实现,甚至不同数量的线程。

    您使用的线程数不应超过您机器的 CPU 内核数。如果 n >> 数量的 CPU 内核,CPU 利用率的很大一部分将用于线程之间的上下文切换。

    【讨论】:

      【解决方案3】:

      如果您仅在双核机器上进行测试,我认为您不应该尝试声称线程数小于或大于内核数,原因有两个

      • 首先,只有 2 个内核,几乎每个多线程系统使用的线程数都比内核数多,因此这个指标变得毫无意义。

      • 更重要的是,如果不在具有不同内核数的机器上进行测试,您将无法知道它是线程数多于内核数还是少于内核数,还是线程数多于或少于 2 个。

      话虽如此,您已经使用了两种完全不同的算法。似乎一个线程比另一个线程扩展得更好,交叉点恰好在 2 个线程。在不了解算法细节的情况下,我们无法说出为什么会这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-02
        • 2021-07-08
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        相关资源
        最近更新 更多