⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad_nfs_read.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//*  * *   Copyright (C) 1997 University of Chicago.  *   See COPYRIGHT notice in top-level directory. */#include "ad_nfs.h"#include "adio_extern.h"void ADIOI_NFS_ReadContig(ADIO_File fd, void *buf, int count,                      MPI_Datatype datatype, int file_ptr_type,		     ADIO_Offset offset, ADIO_Status *status, int *error_code){    int err=-1, datatype_size, len;    static char myname[] = "ADIOI_NFS_READCONTIG";    MPI_Type_size(datatype, &datatype_size);    len = datatype_size * count;    if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {	if (fd->fp_sys_posn != offset) {#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );#endif	    lseek(fd->fd_sys, offset, SEEK_SET);#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );#endif        }	if (fd->atomicity)	    ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);	else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );#endif	err = read(fd->fd_sys, buf, len);#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );#endif	ADIOI_UNLOCK(fd, offset, SEEK_SET, len);	fd->fp_sys_posn = offset + err;	/* individual file pointer not updated */            }    else {  /* read from curr. location of ind. file pointer */	offset = fd->fp_ind;	if (fd->fp_sys_posn != fd->fp_ind) {#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );#endif	    lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );#endif        }	if (fd->atomicity)	    ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);	else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );#endif	err = read(fd->fd_sys, buf, len);#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );#endif	ADIOI_UNLOCK(fd, offset, SEEK_SET, len);	fd->fp_ind += err;	fd->fp_sys_posn = fd->fp_ind;    }    /* --BEGIN ERROR HANDLING-- */    if (err == -1) {	*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,					   myname, __LINE__, MPI_ERR_IO,					   "**io", "**io %s", strerror(errno));	return;    }    /* --END ERROR HANDLING-- */#ifdef HAVE_STATUS_SET_BYTES    MPIR_Status_set_bytes(status, datatype, err);#endif    *error_code = MPI_SUCCESS;}#ifdef ADIOI_MPE_LOGGING#define ADIOI_BUFFERED_READ \{ \    if (req_off >= readbuf_off + readbuf_len) { \	readbuf_off = req_off; \	readbuf_len = (int) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1));\        MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL ); \	lseek(fd->fd_sys, readbuf_off, SEEK_SET);\        MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL ); \        if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off, SEEK_SET, readbuf_len);\        MPE_Log_event( ADIOI_MPE_read_a, 0, NULL ); \        err = read(fd->fd_sys, readbuf, readbuf_len);\        MPE_Log_event( ADIOI_MPE_read_b, 0, NULL ); \        if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off, SEEK_SET, readbuf_len);\        if (err == -1) err_flag = 1; \    } \    while (req_len > readbuf_off + readbuf_len - req_off) { \	partial_read = (int) (readbuf_off + readbuf_len - req_off); \	tmp_buf = (char *) ADIOI_Malloc(partial_read); \	memcpy(tmp_buf, readbuf+readbuf_len-partial_read, partial_read); \	ADIOI_Free(readbuf); \	readbuf = (char *) ADIOI_Malloc(partial_read + max_bufsize); \	memcpy(readbuf, tmp_buf, partial_read); \	ADIOI_Free(tmp_buf); \	readbuf_off += readbuf_len-partial_read; \	readbuf_len = (int) (partial_read + ADIOI_MIN(max_bufsize, \				       end_offset-readbuf_off+1)); \        MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL ); \	lseek(fd->fd_sys, readbuf_off+partial_read, SEEK_SET);\        MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL ); \        if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off+partial_read, SEEK_SET, readbuf_len-partial_read);\        MPE_Log_event( ADIOI_MPE_read_a, 0, NULL ); \        err = read(fd->fd_sys, readbuf+partial_read, readbuf_len-partial_read);\        MPE_Log_event( ADIOI_MPE_read_b, 0, NULL ); \        if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off+partial_read, SEEK_SET, readbuf_len-partial_read);\        if (err == -1) err_flag = 1; \    } \    memcpy((char *)buf + userbuf_off, readbuf+req_off-readbuf_off, req_len); \}#else#define ADIOI_BUFFERED_READ \{ \    if (req_off >= readbuf_off + readbuf_len) { \	readbuf_off = req_off; \	readbuf_len = (int) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1));\	lseek(fd->fd_sys, readbuf_off, SEEK_SET);\        if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off, SEEK_SET, readbuf_len);\        err = read(fd->fd_sys, readbuf, readbuf_len);\        if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off, SEEK_SET, readbuf_len);\        if (err == -1) err_flag = 1; \    } \    while (req_len > readbuf_off + readbuf_len - req_off) { \	partial_read = (int) (readbuf_off + readbuf_len - req_off); \	tmp_buf = (char *) ADIOI_Malloc(partial_read); \	memcpy(tmp_buf, readbuf+readbuf_len-partial_read, partial_read); \	ADIOI_Free(readbuf); \	readbuf = (char *) ADIOI_Malloc(partial_read + max_bufsize); \	memcpy(readbuf, tmp_buf, partial_read); \	ADIOI_Free(tmp_buf); \	readbuf_off += readbuf_len-partial_read; \	readbuf_len = (int) (partial_read + ADIOI_MIN(max_bufsize, \				       end_offset-readbuf_off+1)); \	lseek(fd->fd_sys, readbuf_off+partial_read, SEEK_SET);\        if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off+partial_read, SEEK_SET, readbuf_len-partial_read);\        err = read(fd->fd_sys, readbuf+partial_read, readbuf_len-partial_read);\        if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off+partial_read, SEEK_SET, readbuf_len-partial_read);\        if (err == -1) err_flag = 1; \    } \    memcpy((char *)buf + userbuf_off, readbuf+req_off-readbuf_off, req_len); \}#endifvoid ADIOI_NFS_ReadStrided(ADIO_File fd, void *buf, int count,                       MPI_Datatype datatype, int file_ptr_type,                       ADIO_Offset offset, ADIO_Status *status, int                       *error_code){/* offset is in units of etype relative to the filetype. */    ADIOI_Flatlist_node *flat_buf, *flat_file;    int i, j, k, err=-1, brd_size, frd_size=0, st_index=0;    int bufsize, num, size, sum, n_etypes_in_filetype, size_in_filetype;    int n_filetypes, etype_in_filetype;    ADIO_Offset abs_off_in_filetype=0;    int filetype_size, etype_size, buftype_size, req_len, partial_read;    MPI_Aint filetype_extent, buftype_extent;     int buf_count, buftype_is_contig, filetype_is_contig;    ADIO_Offset userbuf_off;    ADIO_Offset off, req_off, disp, end_offset=0, readbuf_off, start_off;    char *readbuf, *tmp_buf, *value;    int flag, st_frd_size, st_n_filetypes, readbuf_len;    int new_brd_size, new_frd_size, err_flag=0, info_flag, max_bufsize;    static char myname[] = "ADIOI_NFS_READSTRIDED";    ADIOI_Datatype_iscontig(datatype, &buftype_is_contig);    ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig);    MPI_Type_size(fd->filetype, &filetype_size);    if ( ! filetype_size ) {	*error_code = MPI_SUCCESS; 	return;    }    MPI_Type_extent(fd->filetype, &filetype_extent);    MPI_Type_size(datatype, &buftype_size);    MPI_Type_extent(datatype, &buftype_extent);    etype_size = fd->etype_size;    bufsize = buftype_size * count;/* get max_bufsize from the info object. */    value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));    MPI_Info_get(fd->info, "ind_rd_buffer_size", MPI_MAX_INFO_VAL, value,                  &info_flag);    max_bufsize = atoi(value);    ADIOI_Free(value);    if (!buftype_is_contig && filetype_is_contig) {/* noncontiguous in memory, contiguous in file. */	ADIOI_Flatten_datatype(datatype);	flat_buf = ADIOI_Flatlist;	while (flat_buf->type != datatype) flat_buf = flat_buf->next;        off = (file_ptr_type == ADIO_INDIVIDUAL) ? fd->fp_ind :                  fd->disp + etype_size * offset;	start_off = off;	end_offset = off + bufsize - 1;        readbuf_off = off;        readbuf = (char *) ADIOI_Malloc(max_bufsize);        readbuf_len = (int) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1));/* if atomicity is true, lock (exclusive) the region to be accessed */        if (fd->atomicity)            ADIOI_WRITE_LOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );#endif	lseek(fd->fd_sys, readbuf_off, SEEK_SET);#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );#endif        if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off, SEEK_SET, readbuf_len);#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );#endif        err = read(fd->fd_sys, readbuf, readbuf_len);#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );#endif        if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off, SEEK_SET, readbuf_len);        if (err == -1) err_flag = 1;        for (j=0; j<count; j++)             for (i=0; i<flat_buf->count; i++) {                userbuf_off = j*buftype_extent + flat_buf->indices[i];		req_off = off;		req_len = flat_buf->blocklens[i];		ADIOI_BUFFERED_READ                off += flat_buf->blocklens[i];            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -