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

📄 ad_pvfs_write.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 3 页
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//*  * *   Copyright (C) 1997 University of Chicago.  *   See COPYRIGHT notice in top-level directory. */#include "ad_pvfs.h"#include "adio_extern.h"#ifdef HAVE_PVFS_LISTIOvoid ADIOI_PVFS_WriteStridedListIO(ADIO_File fd, void *buf, int count,                       MPI_Datatype datatype, int file_ptr_type,                       ADIO_Offset offset, ADIO_Status *status, int                       *error_code);#endifvoid ADIOI_PVFS_WriteContig(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_PVFS_WRITECONTIG";    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	    pvfs_lseek64(fd->fd_sys, offset, SEEK_SET);#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );#endif        }#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );#endif	err = pvfs_write(fd->fd_sys, buf, len);#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );#endif	fd->fp_sys_posn = offset + err;	/* individual file pointer not updated */            }    else { /* write from curr. location of ind. file pointer */	if (fd->fp_sys_posn != fd->fp_ind) {#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );#endif	    pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );#endif        }#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );#endif	err = pvfs_write(fd->fd_sys, buf, len);#ifdef ADIOI_MPE_LOGGING        MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );#endif	fd->fp_ind += err;	fd->fp_sys_posn = fd->fp_ind;    }#ifdef HAVE_STATUS_SET_BYTES    if (err != -1) MPIR_Status_set_bytes(status, datatype, err);#endif    if (err == -1) {	*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,					   myname, __LINE__, MPI_ERR_IO,					   "**io",					   "**io %s", strerror(errno));    }    else *error_code = MPI_SUCCESS;}void ADIOI_PVFS_WriteStrided(ADIO_File fd, void *buf, int count,			     MPI_Datatype datatype, int file_ptr_type,			     ADIO_Offset offset, ADIO_Status *status, int			     *error_code){/* Since PVFS does not support file locking, can't do buffered writes   as on Unix *//* offset is in units of etype relative to the filetype. */    ADIOI_Flatlist_node *flat_buf, *flat_file;    int i, j, k, err=-1, bwr_size, fwr_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;    MPI_Aint filetype_extent, buftype_extent, indx;    int buf_count, buftype_is_contig, filetype_is_contig;    ADIO_Offset off, disp;    int flag, new_bwr_size, new_fwr_size, err_flag=0;    static char myname[] = "ADIOI_PVFS_WRITESTRIDED";#ifdef HAVE_PVFS_LISTIO    if ( fd->hints->fs_hints.pvfs.listio_write == ADIOI_HINT_ENABLE ) {	    ADIOI_PVFS_WriteStridedListIO(fd, buf, count, datatype, 			    file_ptr_type, offset, status, error_code);	    return;    }#endif    /* if hint set to DISABLE or AUTOMATIC, don't use listio */    /* --BEGIN ERROR HANDLING-- */    if (fd->atomicity) {	*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,					   myname, __LINE__,					   MPI_ERR_INTERN,					   "Atomic mode set in PVFS I/O function", 0);	return;    }    /* --END ERROR HANDLING-- */    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;    if (!buftype_is_contig && filetype_is_contig) {	char *combine_buf, *combine_buf_ptr;	ADIO_Offset combine_buf_remain;/* noncontiguous in memory, contiguous in file. use writev */	ADIOI_Flatten_datatype(datatype);	flat_buf = ADIOI_Flatlist;	while (flat_buf->type != datatype) flat_buf = flat_buf->next;	/* allocate our "combine buffer" to pack data into before writing */	combine_buf = (char *) ADIOI_Malloc(fd->hints->ind_wr_buffer_size);	combine_buf_ptr = combine_buf;	combine_buf_remain = fd->hints->ind_wr_buffer_size;	/* seek to the right spot in the file */	if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {	    off = fd->disp + etype_size * offset;#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );#endif	    pvfs_lseek64(fd->fd_sys, off, SEEK_SET);#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );#endif	}	else {#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );#endif            off = pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );#endif        }	/* loop through all the flattened pieces.  combine into buffer until	 * no more will fit, then write.	 *	 * special case of a given piece being bigger than the combine buffer	 * is also handled.	 */	for (j=0; j<count; j++) {	    for (i=0; i<flat_buf->count; i++) {		if (flat_buf->blocklens[i] > combine_buf_remain && combine_buf != combine_buf_ptr) {		    /* there is data in the buffer; write out the buffer so far */#ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );#endif		    err = pvfs_write(fd->fd_sys,				     combine_buf,				     fd->hints->ind_wr_buffer_size - combine_buf_remain);#ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );#endif		    if (err == -1) err_flag = 1;		    /* reset our buffer info */		    combine_buf_ptr = combine_buf;		    combine_buf_remain = fd->hints->ind_wr_buffer_size;		}		/* TODO: heuristic for when to not bother to use combine buffer? */		if (flat_buf->blocklens[i] >= combine_buf_remain) {		    /* special case: blocklen is as big as or bigger than the combine buf;		     * write directly		     */#ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );#endif		    err = pvfs_write(fd->fd_sys,				     ((char *) buf) + j*buftype_extent + flat_buf->indices[i],				     flat_buf->blocklens[i]);#ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );#endif		    if (err == -1) err_flag = 1;		    off += flat_buf->blocklens[i]; /* keep up with the final file offset too */		}		else {		    /* copy more data into combine buffer */		    memcpy(combine_buf_ptr,			   ((char *) buf) + j*buftype_extent + flat_buf->indices[i],			   flat_buf->blocklens[i]);		    combine_buf_ptr += flat_buf->blocklens[i];		    combine_buf_remain -= flat_buf->blocklens[i];		    off += flat_buf->blocklens[i]; /* keep up with the final file offset too */		}	    }	}	if (combine_buf_ptr != combine_buf) {	    /* data left in buffer to write */#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );#endif	    err = pvfs_write(fd->fd_sys,			     combine_buf,			     fd->hints->ind_wr_buffer_size - combine_buf_remain);#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );#endif	    if (err == -1) err_flag = 1;	}	if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off;	ADIOI_Free(combine_buf);	if (err_flag) {	    *error_code = MPIO_Err_create_code(MPI_SUCCESS,					       MPIR_ERR_RECOVERABLE, myname,					       __LINE__, MPI_ERR_IO, "**io",					       "**io %s", strerror(errno));	}	else *error_code = MPI_SUCCESS;    } /* if (!buftype_is_contig && filetype_is_contig)  ... */    else {  /* noncontiguous in file *//* split up into several contiguous writes *//* find starting location in the file *//* filetype already flattened in ADIO_Open */	flat_file = ADIOI_Flatlist;	while (flat_file->type != fd->filetype) flat_file = flat_file->next;        disp = fd->disp;	if (file_ptr_type == ADIO_INDIVIDUAL) {	    offset = fd->fp_ind; /* in bytes */            n_filetypes = -1;            flag = 0;            while (!flag) {                n_filetypes++;                for (i=0; i<flat_file->count; i++) {                    if (disp + flat_file->indices[i] +                         (ADIO_Offset) n_filetypes*filetype_extent + flat_file->blocklens[i]                             >= offset) {                        st_index = i;                        fwr_size = disp + flat_file->indices[i] +                                 (ADIO_Offset) n_filetypes*filetype_extent                                 + flat_file->blocklens[i] - offset;                        flag = 1;                        break;                    }                }            }	}	else {	    n_etypes_in_filetype = filetype_size/etype_size;	    n_filetypes = (int) (offset / n_etypes_in_filetype);	    etype_in_filetype = (int) (offset % n_etypes_in_filetype);	    size_in_filetype = etype_in_filetype * etype_size; 	    sum = 0;	    for (i=0; i<flat_file->count; i++) {		sum += flat_file->blocklens[i];		if (sum > size_in_filetype) {		    st_index = i;		    fwr_size = sum - size_in_filetype;		    abs_off_in_filetype = flat_file->indices[i] +			size_in_filetype - (sum - flat_file->blocklens[i]);		    break;		}	    }	    /* abs. offset in bytes in the file */            offset = disp + (ADIO_Offset) n_filetypes*filetype_extent + abs_off_in_filetype;	}	if (buftype_is_contig && !filetype_is_contig) {/* contiguous in memory, noncontiguous in file. should be the most   common case. */	    i = 0;	    j = st_index;	    off = offset;	    fwr_size = ADIOI_MIN(fwr_size, bufsize);	    while (i < bufsize) {                if (fwr_size) {                     /* TYPE_UB and TYPE_LB can result in                        fwr_size = 0. save system call in such cases */ #ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );#endif		    pvfs_lseek64(fd->fd_sys, off, SEEK_SET);#ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );#endif#ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );#endif		    err = pvfs_write(fd->fd_sys, ((char *) buf) + i, fwr_size);#ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );#endif		    if (err == -1) err_flag = 1;		}		i += fwr_size;                if (off + fwr_size < disp + flat_file->indices[j] +                   flat_file->blocklens[j] + (ADIO_Offset) n_filetypes*filetype_extent)                       off += fwr_size;                /* did not reach end of contiguous block in filetype.                   no more I/O needed. off is incremented by fwr_size. */                else {		    if (j < (flat_file->count - 1)) j++;		    else {			j = 0;			n_filetypes++;		    }		    off = disp + flat_file->indices[j] +                                         (ADIO_Offset) n_filetypes*filetype_extent;		    fwr_size = ADIOI_MIN(flat_file->blocklens[j], bufsize-i);		}	    }	}	else {/* noncontiguous in memory as well as in file */	    ADIOI_Flatten_datatype(datatype);	    flat_buf = ADIOI_Flatlist;	    while (flat_buf->type != datatype) flat_buf = flat_buf->next;	    k = num = buf_count = 0;	    indx = flat_buf->indices[0];	    j = st_index;	    off = offset;	    bwr_size = flat_buf->blocklens[0];	    while (num < bufsize) {		size = ADIOI_MIN(fwr_size, bwr_size);		if (size) {#ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );#endif		    pvfs_lseek64(fd->fd_sys, off, SEEK_SET);#ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );#endif#ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );#endif		    err = pvfs_write(fd->fd_sys, ((char *) buf) + indx, size);#ifdef ADIOI_MPE_LOGGING                    MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );#endif

⌨️ 快捷键说明

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