Заполнить разреженную матрицу параллельно - PullRequest
0 голосов
/ 11 марта 2020

У меня есть разреженная матрица из Extreme.Mathematics.LinearAlgebra, например:

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

Теперь я хочу заполнить ее в параллели l oop, поскольку ее параллельное заполнение будет намного быстрее.

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

Это дает мне ошибку: исключение вне диапазона.

Однако, для нормального значения для l oop, оно работает довольно хорошо.

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

Также , если я использую двумерный массив вместо разреженной матрицы, он работает нормально.

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

Как мне добиться, чтобы заполнить разреженную матрицу параллельно, не сталкиваясь с исключениями из диапазона?

1 Ответ

1 голос
/ 26 апреля 2020

Я знаю, что это немного поздно, но лучше, чем ничего.

Разреженная матрица - это нечто совершенно отличное от обычного массива. Он использует индексы строк и столбцов, чтобы хранить только ненулевые значения матрицы. Для получения дополнительной информации, я думаю, вам следует прочитать документы Extreme.

В общем: серверная часть разреженной матрицы должна перераспределять память каждый раз, когда вы изменяете базовые данные. Поэтому, если вы обычно * oop, распределение будет происходить синхронно c, и вы в порядке. Как только несколько потоков попытаются изменить матрицу, у вас возникнут проблемы, потому что в одном потоке вы выделили новую память, которая немедленно перезаписывается другим потоком, что дает вам исключение в исходном потоке.

Итак: Параллельное заполнение разреженных матриц не сработает . Я не нашел подходящей библиотеки, которая давала бы возможность записи в разреженную матрицу параллельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...