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

       

Условия выполнения программы: все матрицы


// Программа 7.1 // Алгоритм Фокса умножения матриц – блочное представление данных // Условия выполнения программы: все матрицы квадратные, // размер блоков и их количество по горизонтали и вертикали // одинаково, процессы образуют квадратную решетку int ProcNum = 0; // Количество доступных процессов int ProcRank = 0; // Ранг текущего процесса int GridSize; // Размер виртуальной решетки процессов int GridCoords[2]; // Координаты текущего процесса в процессной // решетке MPI_Comm GridComm; // Коммуникатор в виде квадратной решетки MPI_Comm ColComm; // коммуникатор – столбец решетки MPI_Comm RowComm; // коммуникатор – строка решетки
void main ( int argc, char * argv[] ) { double* pAMatrix; // Первый аргумент матричного умножения double* pBMatrix; // Второй аргумент матричного умножения double* pCMatrix; // Результирующая матрица int Size; // Размер матриц int BlockSize; // Размер матричных блоков, расположенных // на процессах double *pAblock; // Блок матрицы А на процессе double *pBblock; // Блок матрицы В на процессе double *pCblock; // Блок результирующей матрицы С на процессе double *pMatrixAblock; double Start, Finish, Duration;
setvbuf(stdout, 0, _IONBF, 0);
MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &ProcNum); MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
GridSize = sqrt((double)ProcNum); if (ProcNum != GridSize*GridSize) { if (ProcRank == 0) { printf ("Number of processes must be a perfect square \n"); } } else { if (ProcRank == 0) printf("Parallel matrix multiplication program\n");
// Создание виртуальной решетки процессов и коммуникаторов // строк и столбцов CreateGridCommunicators();
// Выделение памяти и инициализация элементов матриц ProcessInitialization ( pAMatrix, pBMatrix, pCMatrix, pAblock, pBblock, pCblock, pMatrixAblock, Size, BlockSize ); // Блочное распределение матриц между процессами DataDistribution(pAMatrix, pBMatrix, pMatrixAblock, pBblock, Size, BlockSize);
// Выполнение параллельного метода Фокса ParallelResultCalculation(pAblock, pMatrixAblock, pBblock, pCblock, BlockSize);
// Сбор результирующей матрицы на ведущем процессе ResultCollection(pCMatrix, pCblock, Size, BlockSize);
// Завершение процесса вычислений ProcessTermination (pAMatrix, pBMatrix, pCMatrix, pAblock, pBblock, pCblock, pMatrixAblock); }
MPI_Finalize(); }
Пример 7.1.
Закрыть окно



Содержание раздела