使用Java 8,如何有效地并行化矩阵向量乘法?

时间:2015-07-31 18:00:34

标签: java vector parallel-processing sparse-matrix matrix-multiplication

鉴于稀疏向量SparseVectorDouble(基本上是索引和值数组)和向量乘法的一些固定实现,我想实现并行化矩阵向量乘法。我尝试了基于全新流框架的以下方法。

ArrayList<SparseVectorDouble> rows;

//...

public double[] multiply(final double[] vector, final double[] result)
{
    final IntToDoubleFunction multiply = (index) -> rows.get(index).multiply(vector);
    Arrays.parallelSetAll(result, multiply);
    return result;
}

然而,对于巨大的矩阵(16M x 16M矩阵;每行约10个条目),使用具有超线程的双核CPU的加速仅为20%左右。

  1. 上述代码是否适合并行化,或者在并行流处理框架中是否存在某些假设?
  2. 如何有效地对此类任务的CPU使用率进行基准测试?
  3. 编辑#1: SparseVectorDouble类中的向量乘法基本上如下实现:

    protected double multiplyThisDefaultZero(final double[] other) {
        assert defaultValue == 0.0;
    
        if (!(size() <= other.length)) {
            throw new IllegalArgumentException("vector of matching size expected");
        }
    
        double sumXY = 0;
    
        for (int internalIndex = 0; internalIndex < internalSize; internalIndex ++) {
            final int index = indices[internalIndex];
            sumXY += values[internalIndex] * other[index];
        }
    
        return sumXY;
    }
    

0 个答案:

没有答案