草庐IT

java - 带有 native 代码的多核 Java 程序

我在Java程序中使用nativeC++库。Java程序是为使用多核系统而编写的,但它无法扩展:最好的速度是在6个内核左右,即添加更多内核会减慢速度。我的测试表明,对native代码的调用本身会导致问题,因此我想确保不同的线程访问native库的不同实例,从而消除并行任务之间的任何隐藏(内存)依赖性。换句话说,而不是静态blockstatic{System.loadLibrary("theNativeLib");}我想为每个线程动态加载库的多个实例。主要的问题是这是否可能。然后怎么做!注意事项:-我在Java7fork/join以及Scala/akka中都有实现。因此,感谢每个平台的任

java - 多核环境中的 BufferedReader

我有8个文件。每一个大约1.7GB。我正在将这些文件读入一个字节数组,并且该操作足够快。然后按如下方式读取每个文件:BufferedReaderbr=newBufferedReader(newInputStreamReader(newByteArrayInputStream(data)));在顺序意义上使用单核进行处理时,大约需要60秒才能完成。但是,当将计算分布在8个独立的核心上时,每个文件花费的时间远远超过60秒。由于数据都在内存中并且没有执行任何IO操作,因此我假设每个核心处理一个文件的时间不会超过60秒。因此,总共8个文件应该在60多秒内完成,但事实并非如此。我是否缺少有关Bu

Java 多核处理

我想了解Java的多核处理。据我了解,Threading是多核的一种,我觉得自己掌握得很好。我知道还有其他方法可以进行多核处理,但我不知道它们是什么。有谁知道任何好的简单教程/示例,或者有他们自己的教程/示例可供我查看以了解有关Java中多核处理的更多信息?我找到的所有教程都对图表、图形、背景信息等过于深入,这确实不是我的编程学习风格。我更喜欢快速简单的东西。 最佳答案 使用多核的主要方式是使用多线程。如果通过HighLevelConcurrencyObjects使用这些最简单的方法你应该熟悉的。这使用线程,但您不必直接处理它们。另

java - 在 Java 中实现多核 - 如何实现?

Java实现多核最简单的方法是什么?我的意思是,要特别指出执行项目某些部分的核心是什么,所以旧的“普通”Java线程不是一个选项。到目前为止,有人建议我使用JConqurr(这是一个用于java多核编程的Eclipse工具包)、JaMP(它为OpenMP扩展Java)和MPJexpress,我对它们了解不多。您认为以上哪项最好,或者您有其他建议?最好以某种方式测量性能提升/增益,但不是唯一的。任何帮助将不胜感激。谢谢,二十九。 最佳答案 尽管用Java编写多线程代码很容易,但Java标准运行时中没有任何内容可以让您一般地告诉JVM或

java - 什么启发式使用 TPL 来确定何时使用多核

我们知道TPL(所以PLINQ也是如此)如果他认为任务很简单并在单核上执行,则不会消耗所有核。但即使是复杂的任务,他也会这样做!例如,这里是关于Java并行性的文章中的代码:importorg.openjdk.jmh.infra.Blackhole;importorg.openjdk.jmh.annotations.*;importjava.util.concurrent.TimeUnit;importjava.util.stream.IntStream;importjava.math.BigInteger;@Warmup(iterations=5)@Measurement(itera

java - 多核上的jvm

我不久前读过一篇博文,声称Java应用程序在允许在多核机器中使用单个CPU时运行得更好:http://mailinator.blogspot.com/2010/02/how-i-sped-up-my-server-by-factor-of-6.htmlJava应用程序在多核机器上运行比在单核机器上运行慢得多的原因是什么? 最佳答案 如果不同线程中的共享资源之间存在严重争用,可能是锁定和解锁对象需要大量的IPI(处理器间中断)并且处理器可能会花费更多的时间来丢弃其L1和L2缓存并从其他CPU重新获取数据,而不是他们实际花费在解决手头问

java - 如何让 Java 将我的多核处理器与 GZIPInputStream 一起使用?

我在我的程序中使用GZIPInputStream,我知道如果我能让Java并行运行我的程序,性能会有所提高。一般来说,是否有让标准虚拟机在多核上运行的命令行选项?它只在一个上运行。谢谢!编辑我在WindowsXP上运行普通的JavaSE6更新17。将GZIPInputStream放在一个单独的线程上是否有明确的帮助?没有!不要将GZIPInputStream放在单独的线程上!不要多线程I/O!编辑2我想I/O是瓶颈,因为我正在读取和写入同一个磁盘...不过,一般来说,有没有办法让GZIPInputStream更快?还是并行运行的GZIPInputStream的替代品?编辑3我使用的代码

c# - 针对 F# 的案例是什么?

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭8年前。Improvethisquestion简单的C#/Java代码极难并行化、多线程等。因此,简单的C#/Java代码将使用越来越少的总处理能力(因为现在一切都将是多核)。在C#和Java中解决这个问题并不简单。可变性和副作用是在C#和Java中完成任务的关键,但这正是多核、多线程编程如此困难的原因。因此,函数式编程将变得越来越重要。鉴于J2EE/Ruby世界将在许多函数式/多核方法之间split(就像它对几乎所有其他事物所做的那

Java 8 自动使用多核?

我一年前用java7做了一些关于多核的测试。首先我只在主线程中实现了一些计算(CPU使用率显示只有一个内核完成了所有工作)然后我用一个ExecutorService实例实现了Callable。在运行它时,所有核心都在工作。现在,一年后,我必须实现一个小程序(使用java8)来插入大量数据。所有工作都在主线程中实现(没有Callable和ExecutorService),但是当我运行程序时,CPU使用率显示所有4个内核都为98%。那么java8会自动分配所有CPU核心上的工作吗?我很困惑...这里有一些代码...map生成器.javaRegion[][]regions=newRegion

Java:VM 如何在 32 位处理器上处理 64 位 `long`

JVM如何在32位处理器上处理原始的“long”,即64位?能否在多核32位机器上并行使用多核?32位机器上的64位操作要慢多少? 最佳答案 它可能使用多个核心来运行不同的线程,但它不会并行使用它们进行64位计算。64位长基本上存储为两个32位整数。为了添加它们,需要进行两次添加,以跟踪进位位。乘法有点像将两个两位数相乘,只是每个数字都以2^32为底,而不是以10为底。其他算术运算也是如此。关于速度的编辑:我只能猜测速度差异。加法需要两次加法而不是一次,乘法(我认为)需要四次乘法而不是一次。但是,我怀疑如果所有内容都可以保存在寄存器