· 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. В этой программе используются названные выше подпрограммы.
#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) ;
/* Следующие четыре "подсказки" имеют смысл на всех машинах. Они могут быть заданы во время открытия файла или позже (многократно) */
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.