Теория и практика параллельных вычислений



         

Программная реализация - часть 3


// Рассылка блоков матрицы А по строкам решетки процессов void ABlockCommunication (int iter, double *pAblock, double* pMatrixAblock, int BlockSize) {

// Определение ведущего процесса в строке процессной решетки int Pivot = (GridCoords[0] + iter) % GridSize;

// Копирование передаваемого блока в отдельный буфер памяти if (GridCoords[1] == Pivot) { for (int i=0; i<BlockSize*BlockSize; i++) pAblock[i] = pMatrixAblock[i]; }

// Рассылка блока MPI_Bcast(pAblock, BlockSize*BlockSize, MPI_DOUBLE, Pivot, RowComm); }

6. Функция BlockMultiplication. Функция обеспечивает перемножение блоков матриц A и B. Следует отметить, что для более легкого понимания рассматриваемой программы приводится простой вариант реализации функции – выполнение операции блочного умножения может быть существенным образом оптимизировано для сокращения времени вычислений. Данная оптимизация может быть направлена, например, на повышение эффективности использования кэша процессоров, векторизации выполняемых операций и т.п.

// Умножение матричных блоков void BlockMultiplication (double *pAblock, double *pBblock, double *pCblock, int BlockSize) { // Вычисление произведения матричных блоков for (int i=0; i<BlockSize; i++) { for (int j=0; j<BlockSize; j++) { double temp = 0; for (int k=0; k<BlockSize; k++ ) temp += pAblock [i*BlockSize + k] * pBblock [k*BlockSize + j]; pCblock [i*BlockSize + j] += temp; } } }

7. Функция BblockCommunication. Функция выполняет циклический сдвиг блоков матрицы B по столбцам процессорной решетки. Каждый процесс передает свой блок следующему процессу NextProc в столбце процессов и получает блок, переданный из предыдущего процесса PrevProc в столбце решетки. Выполнение операций передачи данных осуществляется при помощи функции MPI_SendRecv_replace, которая обеспечивает все необходимые пересылки блоков, используя при этом один и тот же буфер памяти pBblock. Кроме того, эта функция гарантирует отсутствие возможных тупиков, когда операции передачи данных начинают одновременно выполняться несколькими процессами при кольцевой топологии сети.




Содержание  Назад  Вперед