并行填充稀疏矩阵

时间:2020-03-11 14:24:10

标签: c# sparse-matrix numeric allocation indexoutofrangeexception

我有一个来自Extreme.Mathematics.LinearAlgebra的稀疏矩阵,例如:

SparseMatrix<double> J = Matrix.CreateSparse<double>(amountI, amountJ);

现在,我想将其填充到并行循环中,因为以并行方式填充它会更快。

Parallel.For(0, amountI, i =>
{
    for (int j = 0; j < amountJ; j++)
        J[i, j] = random.Next();
});

这给了我错误:超出范围异常。

但是,对于普通的for循环,它工作得很好。

for (int i = 0; i < amountI; i++)
{
    for (int j = 0; j < amountJ; j++)
        J[i, j] = random.Next();
}

此外,如果我使用2D数组而不是稀疏矩阵,则效果很好。

double[,] M = new double[amountI, amountJ];
Parallel.For(0, amountI, i =>
{
    for (int j = 0; j < amountJ; j++)
        M[i, j] = random.Next();
});

如何实现并行填充稀疏矩阵而不遇到超出范围的异常?

1 个答案:

答案 0 :(得分:1)

我知道这有点晚了,但总比没有好。

稀疏矩阵与普通数组完全不同。它使用行和列的索引来仅存储矩阵的非零值。有关更多信息,我想您应该阅读Extreme的文档。

通常:每次修改基础数据时,稀疏矩阵的后端都必须重新分配内存。因此,考虑到您正常循环的情况,分配将同步进行,就可以了。一旦有多个线程尝试修改矩阵,您就会遇到麻烦,因为在一个线程上分配了新的内存,该内存立即被另一个线程覆盖,从而在原始线程上产生了异常。

所以:稀疏矩阵的并行填充无法工作。我尚未找到合适的库来提供并行写入稀疏矩阵的可能性。

相关问题