gpt4 book ai didi

java线程与java进程性能下降

转载 作者:行者123 更新时间:2023-12-01 05:42:01 24 4
gpt4 key购买 nike

在这里,我将重点关注我遇到降级的自定义应用程序(不需要对线程与进程的快速性进行一般性讨论)。

我有 Java 上的 MPI 应用程序,它使用迭代方法解决了一些问题。下面的应用程序示意图让我们将其称为 MyProcess(n),其中“n”是进程数:

double[] myArray = new double[M*K];

for(int iter = 0;iter<iterationCount;++iter)
{
//some communication between processes

//main loop
for(M)
for(K)
{
//linear sequence of arithmetical instructions
}

//some communication between processes
}

为了提高性能,我决定使用 Java 线程(我们称之为 MyThreads(n))。代码几乎相同 - myArray 变成矩阵,其中每行包含适当线程的数组。

double[][] myArray = new double[threadNumber][M*K];


public void run()
{
for(int iter = 0;iter<iterationCount;++iter)
{
//some synchronization primitives

//main loop
for(M)
for(K)
{
//linear sequence of arithmetical instructions

counter++;
}

// some synchronization primitives
}
}

使用 Executors.newFixedThreadPool(threadNumber) 创建并启动线程。

问题是,虽然对于 MyProcess(n),我们获得了足够的性能(n 在 [1,8] 中),但在 MyThreads(n) 的情况下,性能本质上会下降(在我的系统上,性能下降了 n 倍)。

硬件:Intel(R) Xeon(R) CPU X5355(2个处理器,每个4核)

Java 版本:1.5(使用 d32 选项)。

起初我以为线程上有不同的工作负载,但事实并非如此,变量“counter”显示,MyThreads(n) 的不同运行之间的迭代次数([1,8] 中的 n)是相同的。

这不是同步错误,因为我已经临时注释了所有同步原语。

任何建议/想法将不胜感激。

谢谢。

最佳答案

我在您的代码中发现两个问题。

<小时/>

首先是缓存问题。由于您尝试在多线程/进程中执行此操作,因此我假设您的 M * K 结果会很大;然后当你这样做时

    double[][] myArray = new double[threadNumber][M*K];

您实际上是在创建一个大小为 threadNumber 的双指针数组;每个都指向大小为 M*K 的 double 组。这里有趣的一点是,数组的 threadNumber 计数不一定分配到同一内存块上。它们只是双指针,可以分配在 JVM 堆内的任何位置。因此,当多个线程运行时,您可能会遇到大量缓存未命中,并且最终会多次读取内存,最终减慢程序速度。

如果以上是根本原因,您可以尝试增大 JVM 堆大小,然后执行

    double[] myArray = new double[threadNumber * M * K];

并且让线程在同一数组的不同段上运行。您应该能够更好地看到性能。

<小时/>

其次是同步问题。请注意, double (或任何原始)数组不是 volatile 的。因此,不能保证 1 个线程上的结果对其他线程可见。如果您使用同步块(synchronized block),这可以解决问题,因为同步的副作用是确保跨线程的可见性;如果没有,当您读写数组时,请务必使用Unsafe.putXXXVolatile()和Unsafe.getXXXVolatile(),以便您可以对数组进行 volatile 操作。

更进一步,Unsafe 还可以用于创建连续的内存段,您可以用它来保存数据结构并实现更好的性能。在你的情况下,我认为 1) 已经成功了。

关于java线程与java进程性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6899891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com