Россия, г. Саранск |
Опубликован: 28.10.2009 | Уровень: специалист | Доступ: платный
Самостоятельная работа 1:
Компиляция и запуск Microsoft High Performance Computing Server 2008
3.3.3. Задание 3 - Компиляция параллельной программы в Microsoft Visual Studio 2008
В качестве примера параллельной программы для этого задания будет использоваться параллельный алгоритм вычисления числа Пи. В данной работе рассматриваются только технические вопросы использования Microsoft High Performance Computing 2008; вопросы реализации параллельного алгоритма вычисления числа Пи рассматриваются в соответствующих курсах по параллельному программированию. В данном задании будут рассмотрены вопросы использования Visual Studio 2008 для компиляции параллельной MPI программы для использования в среде MS MPI:
- Запустите Microsoft Visual Studio 2008
- Создайте новый проект: выберите пункт меню File->New->Project. В окне выбора нового проекта выберите консольное Win32 приложение ( Other Languages->Visual C++->Win32->Win32 Console Application ), введите имя проекта в поле " Name " (например, " parallelpi ") и убедитесь, что путь до проекта выбран правильно (поле " Location "). Нажмите кнопку " OK " для выбора остальных настроек создаваемого проекта.
- В открывшемся окне нажмите кнопку " Next ".
- В открывшемся окне выберите настройки проекта (можно оставить все настройки по умолчанию). Нажмите кнопку " Finish ".
- В окне Solution Explorer щелкните 2 раза на файле parallelpi.cpp (имя файла совпадает с введенным названием проекта).
- Удалите содержимое файла и замените его следующим (см. лабораторную работу "Параллельный метод вычисления числа Пи"):
#include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <math.h> #include <mpi.h> void main(int argc, char *argv[]) { int NumIntervals = 0; // num intervals in the domain [0,1] double IntervalWidth = 0.0; // width of intervals double IntervalLength = 0.0; // length of intervals double IntrvlMidPoint = 0.0; // x mid point of interval int Interval = 0; // loop counter int done = 0; // flag double MyPI = 0.0; // storage for PI approximation results double ReferencePI = 3.141592653589793238462643; // value for comparison double PI; char processor_name[MPI_MAX_PROCESSOR_NAME]; char (*all_proc_names)[MPI_MAX_PROCESSOR_NAME]; int numprocs; int MyID; int namelen; int proc = 0; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&MyID); MPI_Get_processor_name(processor_name,&namelen); all_proc_names = (char(*)[128]) malloc(numprocs * MPI_MAX_PROCESSOR_NAME); MPI_Gather(processor_name, MPI_MAX_PROCESSOR_NAME, MPI_CHAR, all_proc_names, MPI_MAX_PROCESSOR_NAME, MPI_CHAR, 0, MPI_COMM_WORLD); if (MyID == 0) { for (proc=0; proc < numprocs; ++proc) printf("Process %d on %s\n", proc, all_proc_names[proc]); } IntervalLength = 0.0; if (MyID == 0) { if (argc > 1) { NumIntervals = atoi(argv[1]); } else { NumIntervals = 100000; } printf("NumIntervals = %i\n", NumIntervals); } // send number of intervals to all procs MPI_Bcast(&NumIntervals, 1, MPI_INT, 0, MPI_COMM_WORLD); if (NumIntervals != 0) { //approximate the value of PI IntervalWidth = 1.0 / (double) NumIntervals; for (Interval = MyID+1; Interval <= NumIntervals; Interval += numprocs){ IntrvlMidPoint = IntervalWidth * ((double)Interval - 0.5); IntervalLength += (4.0 / (1.0 + IntrvlMidPoint*IntrvlMidPoint)); } MyPI = IntervalWidth * IntervalLength; // Calculating the sum of all local alues of MyPI MPI_Reduce(&MyPI, &PI, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); //report approximation if (MyID == 0) { printf("PI is approximately %.16f, Error is %.16f\n", PI, fabs(PI - ReferencePI)); } } MPI_Finalize(); }
- Выполните настройки проекта Visual Studio 2008 для компиляции MPI части проекта в соответствии с указаниями пункта " Настройка интегрированной среды разработки Microsoft Visual Studio 2008 ".
- Выполните команду Build->Rebuild Solution для компиляции и линковки проекта.
- Поздравляем! Компиляция параллельной программы для MS MPI успешно завершена.