Содержание
- 2. Принципы распараллеливания В методах матричных вычислений повторяются одинаковые действия для разных элементов матриц Это параллелизм по
- 3. Способы разбиения матриц Ленточное разбиение – каждому процессору выделяется подмножество строк или столбцов Всего строк (столбцов)
- 4. Постановка задачи Матрица А размерности m x n умножается на вектор b (n элементов), результат –
- 5. Пример разбиения – ленточное по строкам Дополнительная задача разбиения: дублировать или разбивать векторы b и с?
- 6. Схема информационного взаимодействия подзадач
- 7. Распределение подзадач по процессорам Количество вычислительных операций одинаково для всех подзадач. Если p Распределение объединенных подзадач
- 8. Анализ эффективности параллельных вычислений Упрощенный подход: m = n Не учитывается коммуникационная трудоемкость Время выполнения всех
- 9. Анализ эффективности параллельных вычислений Учет коммуникационной трудоемкости модель Хокни - оценка времени передачи сообщения m байт
- 10. Программная реализация (MPI) – порядок по логике вызовов! int ProcNum = 0;//число процессов int ProcRank =
- 11. if (ProcRank == 0) { printf ("Parallel matrix-vector multiplication program\n"); } ProcessInitialization(pMatrix, pVector, pResult, pProcRows, pProcResult,
- 12. void ProcessInitialization (double* &pMatrix, double* &pVector, double* &pResult, double* &pProcRows, double* &pProcResult, int &Size, int &RowNum)
- 13. // осталось распределить между процессами Size строк матрицы А RestRows = Size; for (i=0; i {
- 14. void RandomDataInitialization(double* pMatrix, double* pVector, int Size) { int i, j; srand(unsigned(clock()));// инициализация датчика случайных чисел
- 15. void DataDistribution(double* pMatrix, double* pProcRows, double* pVector, int Size, int RowNum) { int *pSendNum;//число элементов, отправляемых
- 16. for (int i=1; i { RestRows = RestRows - RowNum; RowNum = RestRows/(ProcNum-i);// нужно если нет
- 17. Функция MPI_Scatterv int MPI_Scatterv(void* sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype
- 18. // будет выполняться каждым процессом void ParallelResultCalculation(double* pProcRows, double* pVector, double* pProcResult, int Size, int RowNum)
- 19. // будет выполняться каждым процессом для сбора результата void ResultReplication(double* pProcResult, double* pResult, int Size, int
- 20. for (i=1; i { RestRows = RestRows - pReceiveNum[i-1]; pReceiveNum[i] = RestRows/(ProcNum-i); pReceiveInd[i] = pReceiveInd[i-1]+pReceiveNum[i-1]; }
- 21. Функция MPI_Allgatherv int MPI_Allgatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,MPI_Datatype recvtype, MPI_Comm comm)
- 22. // проверка результатов void TestDistribution(double* pMatrix, double* pVector, double* pProcRows, int Size, int RowNum, double* pResult,
- 23. // вывод результатов с других процессов for (int i=1; i { if (ProcRank == i) {
- 24. // освобождение памяти на всех процессах void ProcessTermination (double* pMatrix, double* pVector, double* pResult, double* pProcRows,
- 26. Скачать презентацию