Я выполняю факторизацию Холецкого с 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 позволяет распределенные матрицы с неравными размерами блоков?
Если я печатаю информацию, как это, для матрицы 8×8:
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
что не имеет смысла для матрицы 8×8.
Как ответили Вот, Ответ: нет, вы не можете иметь блоки разных размеров.