gpt4 book ai didi

Java future 和快点产品

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:09:35 25 4
gpt4 key购买 nike

我正在尝试实现一个利用并发来加快运行速度的点积。我将采用分而治之的方法,将 vector 分成越来越小的位,然后最终将所有分量加在一起。但是,我没有立即返回值,而是返回最终包含结果的 Future

这是我目前的尝试:

Future<Double> dotProduct(double[] x, double[] d, int start, int end) {
if ((end-start) == 1) {
return executor.submit(() -> {
return x[start] * d[start];
});
} else if ((end-start) == 0) {
return executor.submit(() -> {
return 0.0;
});
}

int middle = (start+end)/2;
Future<Double> leftDotProduct = dotProduct(x, d, start, middle);
Future<Double> rightDotProduct = dotProduct(x, d, middle, end);

return executor.submit(() -> {
double l = leftDotProduct.get();
double r = rightDotProduct.get();
return l + r;
});
}

// Usage:
Future<Double> v = dotProduct(x, d, 0, x.length);
v.get()

它产生正确的结果,但它仍然比等效的顺序实现运行得慢。我测试了小型(4 个条目)和大型(20,000 个)条目。

我认为速度变慢可能是由于递归调用和设置新堆栈。但如果是这种情况,我什至不确定如何重新设计算法。

对于可能导致延迟的原因以及如何改进它的任何想法,我们将不胜感激!


编辑:

对于更多上下文,我想返回 futures 因为最终我的目标是使用此方法将矩阵乘以 vector :

  double[] parMult(double[] x) {
if (this.getWidth() != x.length)
throw new ArithmeticException("The matrix and vector are of incompatible sizes");

// Create an array of futures that will store all the results from dot poduct
Future<Double>[] f = new Future[this.getHeight()];
for (int i=0; i<this.getHeight(); i++) {
f[i] = dotProduct(x, this.data[i]);
}

// Get the values of all futures
double[] b = new double[this.getHeight()];
try {
for (int i = 0; i < this.getHeight(); i++) {
b[i] = f[i].get();
}
} catch (Exception e) {
e.printStackTrace();
}

return b;
}

最佳答案

当您调用 Future.get() 时,您等待 future 完成。所以,刚刚发生的事情是你引入了一个执行器的所有开销,其中有许多任务要分派(dispatch)并且你强制你的代码几乎串行运行,因为你阻塞了。

您正在寻找的是 Fork+Join .积的累加和是 fork+join 模式的一个经典例子。

关于Java future 和快点产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47662154/

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