Параллельное программирование: Учебное пособие, страница 130

/* Размер буфера для коллективного ввода/вывода */

MPI_Info_set(info, "cb_buffer_size", "8388608");

/* Количество процессов, которые действительно выполняют ввод/вывод в коллективной операции ввода/вывода */

sprintf(value, "%d", nprocs/2);

MPI_Info_set(info, "cb_nodes", value); /* Размер буфера в

индивидуальных операциях чтения */

MPI_Info_set(info, "ind_rd_buffer_size", "2097152");

/* Размер буфера в индивидуальных операциях записи */

MPI_Info_set(info, "ind_wr_buffer_size", "1048576");

/* Следующие три подсказки относятся к расщеплению файла и имеют значение только для файловых систем Intel PFS и IBM PIOFS, а в остальных случаях игнорируются. Они могут быть заданы только в момент создания файла */

sprintf(value, "%d", default_striping_factor-l);

MPI_Info_set(info, "striping_factor", value);

/* Размер блока в байтах */

MPI_Info_set(info, "striping_unit", "131072");

/* Номер устройства ввода/вывода, с которого начинается расщепление файла. Принимается, только если 0 < value < default_striping_factor,    в противном случае игнорируется */

MPI_Info_set(info, "start_iodevice", value);

/* Следующая подсказка имеет значение только для файловой системы Intel PFS и сервера PFS. Она может быть задана в любой момент времени */

MPI_Info_set(info, "pfs_svr_buf", "true");

/* Открыть файл и задать новый информационный параметр */

MPI_File_open(MPI_COMM_WORLD, filename,

MPI_MODE_CREATE | MPI_MODE_RDWR, info, &fh);

/* Проверить значения */

MPI_File_get_info(fh, &info_used);

MPI_Info_get_nkeys(info_used, &nkeys);

if (!mynod)

fprintf(stderr, "\n New values\n\n");

for (i=0; i<nkeys; i++)

{

MPI_Info_get_nthkey(info_used, i, key);

MPI_Info_get(info_used, key,

MPI_MAX_INFO_VAL-1, value, &flag);

if (!mynod)

fprintf(stderr, "Process %d, key = %s,

value = %s\n", mynod, key, value);

}

MPI_File_close(&fh);

free(filename);

MPI_Info_free(&info_used);

MPI_Info_free(&info);

MPI_Finalize();

return 0;

}

Командная строка запуска этой программы в NT-MPICH может выглядеть следующим образом:

mpiexec –host -machinefile -n 2 -- myprogr

6.9  Вопросы и задания для контроля

1.  Какие операции коллективного обмена включены в спецификацию MPI-2?

2.  Как осуществляется операция широковещательной рассылки данных и в каких процессах помещается обращение к подпрограмме рассылки?

3.  Как объявляется подпрограмма распределения данных и каков смысл входящих в нее параметров?

4.  Как объявляется подпрограмма сбора данных и каков смысл входящих в нее параметров?

5.  Как выполняются подпрограммы приведения? Из каких процессов и в какие процессы данные могут быть редуцированы?

6.  Какие операции проведения предопределены в MPI?

7.  С помощью какой подпрограммы можно определить собственную глобальную операцию приведения?

8.  Как описывается тип пользовательской функции, которую надо включить в подпрограммы приведения?

9.  Чем отличается подпрограмма сканирования от подпрограмм приведения?

10.  Что такое топологии, какие виды топологий определены спецификацией MPI-2 и как информация о них связывается с коммуникотором?

11.  Как создается новый коммуникатор, который виртуально наделяется декартовой многомерной (прямоугольной) топологией?

12.  С помощью каких подпрограмм осуществляется пересчет ранга процесса в его декартовы координаты и наоборот?

13.  Как создается новый коммуникатор, который виртуально наделяется топологией графа?

14.  Какие параметры графа должны быть указаны в подпрограмме, создающей коммуникатор с топологией графа?

15.  Как получить сведения о рангах вершинных процессов графа, которые являются соседями вершинного процесса с заданным рангом?

16.  Как получить сведения о количестве соседних вершин и вообще информацию о топологии графа, связанного с заданным коммуникатором?