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

·  buf — стартовый адрес буфера;

·  count — количество элементов в буфере;

·  datatype — тип каждого элемента в буфере;

·  request — идентификатор операции, являющийся выходным.

Закрытие файла fh можно выполнить с помощью подпрограммы MPI_File_close:

int MPI_File_close(MPI_File *fh)

Удаление файла выполняется подпрограммой  MPI_File_delete:

int MPI_File_delete(char *filename, MPI_Info info)

Ее входные параметры:

·  filename — имя файла;

·  info — информационный параметр.

Чтение из файла в блокирующем режиме выполняется с использованием индивидуального файлового указателя подпрограммой MPI_File_read:

int MPI_File_read(MPI_File fh, void *buf, int count,

MPI_Datatype datatype, MPI_Status *status)

Здесь входными параметрами являются:

·  fh — файловый дескриптор;

·  count — количество элементов в буфере;

·  datatype — тип элементов в буфере.

Выходными параметрами являются:

·  buf — начальный адрес буфера;

·  status — статус.

Запись в файл с блокировкой выполняется с помощью подпрограммы MPI_File_write:

int MPI_File_write(MPI_File fh, void *buf, int count,

MPI_Datatype datatype, MPI_Status *status)

В качестве входных параметров задаются:

·  fh — файловый дескриптор;

·  buf — начальный адрес буфера;

·  count — количество элементов в буфере;

·  datatype — тип элементов.

Выходной параметр — статус операции status.

В тексте 6.7 приведен исходный текст одной из тестовых программ, входящих в состав RomIO. В этой программе используются названные выше подпрограммы.

Текст 6.7. Программа file_info.c

#include "mpi.h"

#include "mpio.h"     /* Эта строка не обязательна в версиях */

/*  MPICH 1.1.1  и  HPMPI 1.4 */

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

/* Эта программа выводит значения всех ключей информационного параметра, используемые по умолчанию в RomIO */

int main(int argc, char **argv)

{

int i, len, nkeys, flag, mynod,

default_striping_factor=0, nprocs;

MPI_File fh;

MPI_Info info, info_used;

char *filename, key[MPI_MAX_INFO_KEY],

value[MPI_MAX_INFO_VAL];

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &mynod);

MPI_Comm_size(MPI_COMM_WORLD, &nprocs);

/* Процесс с рангом 0 получает имя файла в качестве аргумента командной строки, с которой запускается программа, и передает его всем остальным процессам широковещательной рассылкой */

if (!mynod)

{

i = 1;

while ((i < argc) && strcmp("-fname", *argv))

{ i++; argv++; }

if (i >= argc)

{

fprintf(stderr, "\n*# Usage: file_info

-fname filename\n\n");

MPI_Abort(MPI_COMM_WORLD, 1);

}

argv++;

len = strlen(*argv);

filename = (char *) malloc(len+1);

strcpy(filename, *argv);

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

MPI_Bcast(filename, len+1, MPI_CHAR, 0,

MPI_COMM_WORLD);

}

else

{

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

filename = (char *) malloc(len+1);

MPI_Bcast(filename, len+1, MPI_CHAR, 0,

MPI_COMM_WORLD);

}

/* Файл открывается с MPI_INFO_NULL */

MPI_File_open(MPI_COMM_WORLD, filename,

MPI_MODE_CREATE | MPI_MODE_RDWR,

MPI_INFO_NULL, &fh);

/* Проверка значений, установленных RomIO по умолчанию */

MPI_File_get_info(fh, &info_used);

MPI_Info_get_nkeys(info_used, &nkeys);

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, Default:

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

if (!strcmp("striping_factor", key))

default_striping_factor = atoi(value);

}

MPI_File_close(&fh);        /* Удаление файла */

if(!mynod)

MPI_File_delete(filename, MPI_INFO_NULL);

MPI_Barrier(MPI_COMM_WORLD);

    /* Установка новых значений информационного параметра */

MPI_Info_create(&info) ;

/* Следующие четыре "подсказки" имеют смысл на всех машинах. Они могут быть заданы во время открытия файла или позже (многократно) */