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

📄 ad_xfs_write.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//*  *   $Id: ad_xfs_write.c,v 1.9 2002/10/24 17:01:11 gropp Exp $     * *   Copyright (C) 1997 University of Chicago.  *   See COPYRIGHT notice in top-level directory. */#include "ad_xfs.h"static void ADIOI_XFS_Aligned_Mem_File_Write(ADIO_File fd, void *buf, int len, 					     ADIO_Offset offset, int *err);void ADIOI_XFS_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, diff, size, nbytes;    void *newbuf;#ifndef PRINT_ERR_MSG    static char myname[] = "ADIOI_XFS_WRITECONTIG";#endif    MPI_Type_size(datatype, &datatype_size);    len = datatype_size * count;    fd->fp_sys_posn = -1; /* set it to null, since we are using pwrite */    if (file_ptr_type == ADIO_INDIVIDUAL) offset = fd->fp_ind;    if (!(fd->direct_write))     /* direct I/O not enabled */	err = pwrite(fd->fd_sys, buf, len, offset);    else {       /* direct I/O enabled */	/* (1) if mem_aligned && file_aligned                     use direct I/O to write up to correct io_size                    use buffered I/O for remaining  */	if (!(((long) buf) % fd->d_mem) && !(offset % fd->d_miniosz)) 	    ADIOI_XFS_Aligned_Mem_File_Write(fd, buf, len, offset, &err);        /* (2) if !file_aligned                    use buffered I/O to write up to file_aligned                    At that point, if still mem_aligned, use (1)   		        else copy into aligned buf and then use (1) */	else if (offset % fd->d_miniosz) {	    diff = fd->d_miniosz - (offset % fd->d_miniosz);	    diff = ADIOI_MIN(diff, len);	    nbytes = pwrite(fd->fd_sys, buf, diff, offset);	    buf = ((char *) buf) + diff;	    offset += diff;	    size = len - diff;	    if (!(((long) buf) % fd->d_mem)) {		ADIOI_XFS_Aligned_Mem_File_Write(fd, buf, size, offset, &err);		nbytes += err;	    }	    else {		newbuf = (void *) memalign(XFS_MEMALIGN, size);		if (newbuf) {		    memcpy(newbuf, buf, size);		    ADIOI_XFS_Aligned_Mem_File_Write(fd, newbuf, size, offset, &err);		    nbytes += err;		    free(newbuf);		}		else nbytes += pwrite(fd->fd_sys, buf, size, offset);	    }	    err = nbytes;	}        /* (3) if !mem_aligned && file_aligned    	            copy into aligned buf, then use (1)  */	else {	    newbuf = (void *) memalign(XFS_MEMALIGN, len);	    if (newbuf) {		memcpy(newbuf, buf, len);		ADIOI_XFS_Aligned_Mem_File_Write(fd, newbuf, len, offset, &err);		free(newbuf);	    }	    else err = pwrite(fd->fd_sys, buf, len, offset);	}    }    if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind += err;#ifdef HAVE_STATUS_SET_BYTES    if (err != -1) MPIR_Status_set_bytes(status, datatype, err);#endif#ifdef PRINT_ERR_MSG    *error_code = (err == -1) ? MPI_ERR_UNKNOWN : MPI_SUCCESS;#else    if (err == -1) {	*error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,			      myname, "I/O Error", "%s", strerror(errno));	ADIOI_Error(fd, *error_code, myname);    }    else *error_code = MPI_SUCCESS;#endif}void ADIOI_XFS_Aligned_Mem_File_Write(ADIO_File fd, void *buf, int len,               ADIO_Offset offset, int *err){    int ntimes, rem, newrem, i, size, nbytes;    /* memory buffer is aligned, offset in file is aligned,       io_size may or may not be of the right size.       use direct I/O to write up to correct io_size,       use buffered I/O for remaining. */    if (!(len % fd->d_miniosz) && 	(len >= fd->d_miniosz) && (len <= fd->d_maxiosz))	*err = pwrite(fd->fd_direct, buf, len, offset);    else if (len < fd->d_miniosz)	*err = pwrite(fd->fd_sys, buf, len, offset);    else if (len > fd->d_maxiosz) {	ntimes = len/(fd->d_maxiosz);	rem = len - ntimes * fd->d_maxiosz;	nbytes = 0;	for (i=0; i<ntimes; i++) {	    nbytes += pwrite(fd->fd_direct, ((char *)buf) + i * fd->d_maxiosz,			 fd->d_maxiosz, offset);	    offset += fd->d_maxiosz;	}	if (rem) {	    if (!(rem % fd->d_miniosz))		nbytes += pwrite(fd->fd_direct, 		             ((char *)buf) + ntimes * fd->d_maxiosz, rem, offset);	    else {		newrem = rem % fd->d_miniosz;		size = rem - newrem;		if (size) {		    nbytes += pwrite(fd->fd_direct, 		            ((char *)buf) + ntimes * fd->d_maxiosz, size, offset);		    offset += size;		}		nbytes += pwrite(fd->fd_sys, 	              ((char *)buf) + ntimes*fd->d_maxiosz + size, newrem, offset);	    }	}	*err = nbytes;    }    else {	rem = len % fd->d_miniosz;	size = len - rem;	nbytes = pwrite(fd->fd_direct, buf, size, offset);	nbytes += pwrite(fd->fd_sys, (char *)buf + size, rem, offset+size);	*err = nbytes;    }}void ADIOI_XFS_WriteStrided(ADIO_File fd, void *buf, int count,                       MPI_Datatype datatype, int file_ptr_type,                       ADIO_Offset offset, ADIO_Status *status, int                       *error_code){    ADIOI_GEN_WriteStrided(fd, buf, count, datatype, file_ptr_type,                        offset, status, error_code);}

⌨️ 快捷键说明

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