Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабораторки текст .doc
Скачиваний:
30
Добавлен:
08.09.2019
Размер:
751 Кб
Скачать
☆

Со­зда­ние mpi-про­грам­мы в Visual Studio

Пре­жде все­го, нуж­но на­стро­ить Visual Studio, что­бы он на­хо­дил за­го­ло­воч­ные фай­лы и .lib-биб­лио­те­ки MPICH2. Для это­го за­пу­сти­те Visual Studio и на­жми­те Tools → Options, в де­ре­ве сле­ва вы­бе­ри­те Projects and Solutions → VC++ Directories. Спра­ва-ввер­ху вы­бе­ри­те Show directories for: Include files. На­жми­те кно­поч­ку с жёл­той па­поч­кой и до­бавь­те путь к .h-фай­лам (рис. 2.1.):

Ри­с 2.1. На­строй­ка пу­ти к за­го­ло­воч­ным фай­лам MPICH

По­сле это­го про­де­лай­те ту же про­це­ду­ру для биб­лио­тек (Show directories for: Library files) (Рис. 2.2.):

Ри­с 2.2. На­строй­ка пу­ти к биб­лио­теч­ным фай­лам MPICH

Те­перь со­здай­те кон­соль­ный про­ект. От­крой­те ок­но на­стро­ек про­ек­та (Project → Properties), вы­бе­ри­те Configuration: All Configurations, в де­ре­ве сле­ва вы­бе­ри­те Configuration Properties → Linker → Input. До­бавь­те mpi.lib в по­ле Additional Dependencies спра­ва (Рис. 2.3.):

Ри­с 2.3. До­бав­ле­ние mpi.lib к про­грам­ме

Ис­ход­ный код про­грам­мы для про­вер­ки мо­же­те взять из фай­ла C:\​Program Files\​MPICH2\​examples\​icpi.c. От­ком­пи­ли­руй­те про­грам­му и за­пу­сти­те с по­мо­щью Wmpiexec. Если вы все сделали правильно – программа заработает.

Исходный код примера 2.1

/* This is an interactive version of cpi */

#include "mpi.h"

#include <stdio.h>

#include <math.h>

#include <conio.h>

double f(double);

int main(int argc, char **argv)

{

int done = 0,

n,

myid,

numprocs,

i;

double PI25DT = 3.141592653589793238462643;

double mypi,

pi,

h,

sum,

x;

double startwtime = 0.0,

endwtime;

int namelen;

char processor_name[MPI_MAX_PROCESSOR_NAME];

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);

/*

fprintf(stdout,"Process %d of %d is on %s\n",

myid, numprocs, processor_name);

fflush(stdout);

*/

while (!done)

{

if (myid == 0)

{

fprintf(stdout, "Enter the number of intervals: (0 quits) ");

fflush(stdout);

if (scanf("%d",&n) != 1)

{

fprintf( stdout, "No number entered; quitting\n" );

n = 0;

}

startwtime = MPI_Wtime();

}

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

if (n == 0)

done = 1;

else

{

h = 1.0 / (double) n;

sum = 0.0;

for (i = myid + 1; i <= n; i += numprocs)

{

x = h * ((double)i - 0.5);

sum += f(x);

}

mypi = h * sum;

MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,

MPI_COMM_WORLD);

if (myid == 0)

{

printf("pi is approximately %.16f, Error is %.16f\n",

pi, fabs(pi - PI25DT));

endwtime = MPI_Wtime();

printf("wall clock time = %f\n", endwtime-startwtime);

fflush( stdout );

}

}

}

MPI_Finalize();

_getch();

return(0);

}

double f(double a)

{

return (4.0 / (1.0 + a*a));

}