【问题标题】:Java for loop into parallelJava for 循环进入并行
【发布时间】:2019-11-21 19:24:57
【问题描述】:

我是并行处理的新手并正在尝试学习它。我得到了大学的任务,我必须将串行“barnes-hut”算法变成并行算法。 我一直在寻找,我似乎没有找到任何有用的东西。 我想我需要与最大线程数 4 并行

for (int i = 0; i < N; i++) {
        double px = console.nextDouble();
        double py = console.nextDouble();
        double vx = console.nextDouble();
        double vy = console.nextDouble();
        double mass = console.nextDouble();
        int red = console.nextInt();
        int green = console.nextInt();
        int blue = console.nextInt();
        Color color = new Color(red, green, blue);
        bodies[i] = new Body(px, py, vx, vy, mass, color);
    }

【问题讨论】:

  • 也许他不熟悉这个词,然后很难搜索。无论如何,这是另一个example。如果控制台的 nextDoublenextInt 是线程安全的,则可以使用。
  • 谢谢,我想我搜索错了吗?

标签: java parallel-processing


【解决方案1】:

问题是:您实际上所关注的不仅仅是“添加一些并行”到您的代码。

你看,你的代码是这样的:

  • 从某个输入源读取多个值
  • 一点处理
  • 将最终“结果”存储在有序数据结构(该数组)中

您不能只并行执行上述操作。因为当你使用多个线程时,你会在事情发生时失去控制。

在您的情况下:您无法控制“从输入中读取”的顺序。是的,当您按照其他答案的建议时,您将遇到第一个多线程问题,因为其他代码不是线程安全的,因此您最终会得到意想不到的、不可预测的结果!

另请注意:您的代码确实不太适合“并行运行”。只有当您的工作负载受益于多线程时,使用多线程才会“有帮助”。从一个文件中读取顺序数据,最终得到顺序数据结构中的对象......这不是一种工作量!

因此,真正的答案是:退后一步。多线程真的很复杂。你不能通过选择“随机”代码然后尝试“添加平行”来学习这些东西。选择一本好书或教程……并研究该主题。看看写得很好的例子,然后看看它们是如何处理的。然后搜索旨在了解多线程的作业。

一个起点:来自 oracle 的 concurrency 教程。

【讨论】:

  • 我完全同意你的看法,但是这个作业是今天给我的,下周就要交了。如果这是在 c 中,那会容易得多,因为我可以只使用 omp
  • @Dimitrisgs 然后:与您的同行交谈。然后:和你的导师谈谈。然后:和你的导师谈谈。这里的人缺乏你作业的背景,以及你在课堂上学到的内容。陌生人无法帮助您完成特定任务。所以:和那些应该知道这些事情的人谈谈!
  • 我已经做到了,我们甚至有一个 10 人的 Messenger 组。老师只讲了理论上的并行处理,这是我第一次听说 java 并发。
  • @Dimitrisgs 我唯一能说的是:您必须查看算法的全部。除非我弄错了,否则您在问题中显示的部分只是开始:您读取输入数据,并 准备 一个数组以供以后处理。这个初始部分不适合并行完成。而是看看后面的东西。
【解决方案2】:

您可以查看IntStream 来并行您的 for 循环:

IntStream.range(0,N).parallel().forEach(i -> {
  double px = console.nextDouble();
  double py = console.nextDouble();
  double vx = console.nextDouble();
  double vy = console.nextDouble();
  double mass = console.nextDouble();
  int red = console.nextInt();
  int green = console.nextInt();
  int blue = console.nextInt();
  Color color = new Color(red, green, blue);
  bodies[i] = new Body(px, py, vx, vy, mass, color); 
});

请记住,这只是 for 循环帮助您入门的一个示例。这可能导致错误的结果,需要根据您的操作进行修改。

要查看与“Barnes-Hut”平行的文档,请查看:

https://www.cs.vu.nl/ibis/papers/nijhuis_barnes_2004.pdf

它很老,没有使用最新的 java 技术来简化一些并行性,但应该能够引导你走上正确的道路

还有一个 Scala 项目也可以模拟它:

https://github.com/tadjik1/Barnes-Hut-Simulation

【讨论】:

  • 谢谢,我会检查一下以及 deadpool 提供的链接
猜你喜欢
  • 2015-02-17
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多