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



Пример 1


// Программа 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();

}




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