// Программа 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. |
Закрыть окно |