Опубликован: 28.10.2009 | Уровень: специалист | Доступ: платный
Самостоятельная работа 1:

Компиляция и запуск Microsoft High Performance Computing Server 2008

< Лекция 2 || Самостоятельная работа 1: 123456789 || Лекция 3 >

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 успешно завершена.
< Лекция 2 || Самостоятельная работа 1: 123456789 || Лекция 3 >
Алексей Николаев
Алексей Николаев
Россия, г. Саранск
Рамиль Ариков
Рамиль Ариков
Россия, Республика Мордовия