gpt4 book ai didi

Java多线程 vector 加法

转载 作者:行者123 更新时间:2023-11-29 08:39:25 25 4
gpt4 key购买 nike

我正在尝试熟悉 Java 多线程应用程序。我试图想出一个可以很好地并行化的简单应用程序。我认为 vector 加法是一个很好的应用。但是,在我的 Linux 服务器(有 4 个内核)上运行时,我没有得到任何加速。在4,2,1个线程上执行的时间差不多。

这是我想出的代码:

   public static void main(String[]args)throws InterruptedException{

final int threads = Integer.parseInt(args[0]);
final int length= Integer.parseInt(args[1]);
final int balk=(length/threads);
Thread[]th = new Thread[threads];

final double[]result =new double[length];

final double[]array1=getRandomArray(length);
final double[]array2=getRandomArray(length);

long startingTime =System.nanoTime();
for(int i=0;i<threads;i++){
final int current=i;
th[i]=new Thread(()->{
for(int k=current*balk;k<(current+1)*balk;k++){
result[k]=array1[k]+array2[k];
}
});
th[i].start();
}
for(int i=0;i<threads;i++){
th[i].join();
}
System.out.println("Time needed: "+(System.nanoTime()-startingTime));


}

length 始终是线程的倍数,getRandomArray() 创建一个介于 0 和 1 之间的随机 double 组。

1 线程的执行时间:84579446ns
2 线程的执行时间:74211325ns
4 线程的执行时间:89215100ns
长度 =10000000

这是 getRandomArray() 的代码:

    private static double[]getRandomArray(int length){
Random random =new Random();
double[]array= new double[length];
for(int i=0;i<length;i++){
array[i]=random.nextDouble();
}
return array;
}

如有任何帮助,我将不胜感激。

最佳答案

从以下代码可以看出差异。试试吧。

public static void main(String[]args)throws InterruptedException{

for(int z = 0; z < 10; z++) {

final int threads = 1;
final int length= 100_000_000;
final int balk=(length/threads);
Thread[]th = new Thread[threads];

final boolean[]result =new boolean[length];

final boolean[]array1=getRandomArray(length);
final boolean[]array2=getRandomArray(length);

long startingTime =System.nanoTime();
for(int i=0;i<threads;i++){
final int current=i;
th[i]=new Thread(()->{
for(int k=current*balk;k<(current+1)*balk;k++){
result[k]=array1[k] | array2[k];
}
});
th[i].start();
}
for(int i=0;i<threads;i++){
th[i].join();
}

System.out.println("Time needed: "+(System.nanoTime()-startingTime)*1.0/1000/1000);

boolean x = false;
for(boolean d : result) {
x |= d;
}
System.out.println(x);
}
}

首先,您需要预热代码。这样您将测量编译后的代码。前两次迭代具有相同(大约)的时间,但下一次会有所不同。此外,我将 double 更改为 boolean,因为我的机器没有太多内存。这使我能够分配一个巨大的数组,同时也使工作消耗更多的 CPU。

评论里有链接。我建议你阅读它。

关于Java多线程 vector 加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41447503/

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