Я выполняю факторизацию Холецкого с Intel-MKL, который использует ScaLAPACK. Я распространил матрицу на основе этого примера, где матрица распределена по блокам одинакового размера (т.е. Nb x Mb). Я попытался сделать так, чтобы каждый блок имел свой размер, в зависимости от того, какому процессу он принадлежит, чтобы я мог больше экспериментировать и, возможно, получить лучшую производительность.
Проверьте этот вопрос, чтобы лучше понять что я говорю. Я не буду публиковать свой код, так как он слишком большой (да, второстепенный пример тоже слишком большой, я проверял), и дистрибутив, похоже, работает хорошо. Однако ScaLAPACK, по-видимому, предполагает, что матрица распределена в блоках одинакового размера?
Например, я использую это:
int nrows = numroc_(&N, &Nb, &myrow, &iZERO, &procrows);
int ncols = numroc_(&M, &Mb, &mycol, &iZERO, &proccols);
где (взято из руководства):
NB (глобальный ввод) INTEGER Размер блока, размер блоков, на которые разбита распределенная матрица.
Итак, поддерживает ли ScaLAPACK распределенные матрицы с неравными размерами блоков?
Если я распечатаю такую информацию для матрицы 8x8:
std::cout << Nb << " " << Mb << " " << nrows << " " << ncols << " " << myid << std::endl;
Я получаю это:
3 3 5 5 0
1 1 4 4 1
1 1 4 4 2
1 1 4 4 3
и, просто поменяв местами первые два размера блока, это:
1 1 4 4 0
3 3 5 3 1
1 1 4 4 2
1 1 4 4 3
что не имеет смысла для матрицы 8x8.