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

📄 ad_pvfs_write.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 3 页
字号:
		    if (err == -1) err_flag = 1;		}		new_fwr_size = fwr_size;		new_bwr_size = bwr_size;		if (size == fwr_size) {/* reached end of contiguous block in file */                    if (j < (flat_file->count - 1)) j++;                    else {                        j = 0;                        n_filetypes++;                    }                    off = disp + flat_file->indices[j] +                                    (ADIO_Offset) n_filetypes*filetype_extent;		    new_fwr_size = flat_file->blocklens[j];		    if (size != bwr_size) {			indx += size;			new_bwr_size -= size;		    }		}		if (size == bwr_size) {/* reached end of contiguous block in memory */		    k = (k + 1)%flat_buf->count;		    buf_count++;		    indx = buftype_extent*(buf_count/flat_buf->count) +			flat_buf->indices[k]; 		    new_bwr_size = flat_buf->blocklens[k];		    if (size != fwr_size) {			off += size;			new_fwr_size -= size;		    }		}		num += size;		fwr_size = new_fwr_size;                bwr_size = new_bwr_size;	    }	}        if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off;	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;    }    fd->fp_sys_posn = -1;   /* set it to null. */#ifdef HAVE_STATUS_SET_BYTES    MPIR_Status_set_bytes(status, datatype, bufsize);/* This is a temporary way of filling in status. The right way is to    keep track of how much data was actually written by ADIOI_BUFFERED_WRITE. */#endif    if (!buftype_is_contig) ADIOI_Delete_flattened(datatype);}#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) {/* 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, 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;    int buf_count, buftype_is_contig, filetype_is_contig;    ADIO_Offset userbuf_off;    ADIO_Offset off, disp, start_off;    int flag, st_fwr_size, st_n_filetypes;    int new_bwr_size, new_fwr_size, err_flag=0;    int mem_list_count, file_list_count;    char ** mem_offsets;    int64_t *file_offsets;    int *mem_lengths;    int32_t *file_lengths;    int total_blks_to_write;    int max_mem_list, max_file_list;    int b_blks_wrote;    int f_data_wrote;    int size_wrote=0, n_write_lists, extra_blks;    int end_bwr_size, end_fwr_size;    int start_k, start_j, new_file_write, new_buffer_write;    int start_mem_offset;#define MAX_ARRAY_SIZE 1024    static char myname[] = "ADIOI_PVFS_WRITESTRIDED";/* PFS file pointer modes are not relevant here, because PFS does   not support strided accesses. */    /* --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) {/* noncontiguous in memory, contiguous in file.  */        int64_t file_offsets;	int32_t file_lengths;	ADIOI_Flatten_datatype(datatype);	flat_buf = ADIOI_Flatlist;	while (flat_buf->type != datatype) flat_buf = flat_buf->next;		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, fd->fp_ind, 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        }	file_list_count = 1;	file_offsets = off;	file_lengths = 0;	total_blks_to_write = count*flat_buf->count;	b_blks_wrote = 0;	/* allocate arrays according to max usage */	if (total_blks_to_write > MAX_ARRAY_SIZE)	    mem_list_count = MAX_ARRAY_SIZE;	else mem_list_count = total_blks_to_write;	mem_offsets = (char**)ADIOI_Malloc(mem_list_count*sizeof(char*));	mem_lengths = (int*)ADIOI_Malloc(mem_list_count*sizeof(int));	j = 0;	/* step through each block in memory, filling memory arrays */	while (b_blks_wrote < total_blks_to_write) {	    for (i=0; i<flat_buf->count; i++) {		mem_offsets[b_blks_wrote % MAX_ARRAY_SIZE] = 		    ((char*)buf + j*buftype_extent + flat_buf->indices[i]);		mem_lengths[b_blks_wrote % MAX_ARRAY_SIZE] = 		    flat_buf->blocklens[i];		file_lengths += flat_buf->blocklens[i];		b_blks_wrote++;		if (!(b_blks_wrote % MAX_ARRAY_SIZE) ||		    (b_blks_wrote == total_blks_to_write)) {		    /* in the case of the last read list call,		       adjust mem_list_count */		    if (b_blks_wrote == total_blks_to_write) {		        mem_list_count = total_blks_to_write % MAX_ARRAY_SIZE;			/* in case last read list call fills max arrays */			if (!mem_list_count) mem_list_count = MAX_ARRAY_SIZE;		    }		    pvfs_write_list(fd->fd_sys ,mem_list_count, mem_offsets,				   mem_lengths, file_list_count,				   &file_offsets, &file_lengths);		  		    /* in the case of the last read list call, leave here */		    if (b_blks_wrote == total_blks_to_write) break;		    file_offsets += file_lengths;		    file_lengths = 0;		} 	    } /* for (i=0; i<flat_buf->count; i++) */	    j++;	} /* while (b_blks_wrote < total_blks_to_write) */	ADIOI_Free(mem_offsets);	ADIOI_Free(mem_lengths);	if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off;	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;	fd->fp_sys_posn = -1;   /* clear this. */#ifdef HAVE_STATUS_SET_BYTES	MPIR_Status_set_bytes(status, datatype, bufsize);/* This is a temporary way of filling in status. The right way is to    keep track of how much data was actually written by ADIOI_BUFFERED_WRITE. */#endif	ADIOI_Delete_flattened(datatype);	return;    } /* if (!buftype_is_contig && filetype_is_contig) */    /* already know that file is noncontiguous from above */    /* noncontiguous in 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;    /* for each case - ADIO_Individual pointer or explicit, find offset       (file offset in bytes), n_filetypes (how many filetypes into file        to start), fwr_size (remaining amount of data in present file       block), and st_index (start point in terms of blocks in starting       filetype) */    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;		}	    }	} /* while (!flag) */    } /* if (file_ptr_type == ADIO_INDIVIDUAL) */    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;    } /* else [file_ptr_type != ADIO_INDIVIDUAL] */    start_off = offset;    st_fwr_size = fwr_size;    st_n_filetypes = n_filetypes;        if (buftype_is_contig && !filetype_is_contig) {/* contiguous in memory, noncontiguous in file. should be the most   common case. */        int mem_lengths;	char *mem_offsets;        	i = 0;	j = st_index;	off = offset;	n_filetypes = st_n_filetypes;        	mem_list_count = 1;        	/* determine how many blocks in file to read */	f_data_wrote = ADIOI_MIN(st_fwr_size, bufsize);	total_blks_to_write = 1;	j++;	while (f_data_wrote < bufsize) {	    f_data_wrote += flat_file->blocklens[j];	    total_blks_to_write++;	    if (j<(flat_file->count-1)) j++;	    else j = 0; 	}	    	j = st_index;	n_filetypes = st_n_filetypes;	n_write_lists = total_blks_to_write/MAX_ARRAY_SIZE;	extra_blks = total_blks_to_write%MAX_ARRAY_SIZE;        	mem_offsets = buf;	mem_lengths = 0;        	/* if at least one full readlist, allocate file arrays	   at max array size and don't free until very end */	if (n_write_lists) {	    file_offsets = (int64_t*)ADIOI_Malloc(MAX_ARRAY_SIZE*						  sizeof(int64_t));	    file_lengths = (int32_t*)ADIOI_Malloc(MAX_ARRAY_SIZE*						  sizeof(int32_t));	}	/* if there's no full readlist allocate file arrays according	   to needed size (extra_blks) */	else {	    file_offsets = (int64_t*)ADIOI_Malloc(extra_blks*                                                  sizeof(int64_t));            file_lengths = (int32_t*)ADIOI_Malloc(extra_blks*                                                  sizeof(int32_t));        }                /* for file arrays that are of MAX_ARRAY_SIZE, build arrays */        for (i=0; i<n_write_lists; i++) {            file_list_count = MAX_ARRAY_SIZE;            if(!i) {                file_offsets[0] = offset;                file_lengths[0] = st_fwr_size;                mem_lengths = st_fwr_size;            }            for (k=0; k<MAX_ARRAY_SIZE; k++) {                if (i || k) {                    file_offsets[k] = disp + n_filetypes*filetype_extent                      + flat_file->indices[j];                    file_lengths[k] = flat_file->blocklens[j];                    mem_lengths += file_lengths[k];                }                if (j<(flat_file->count - 1)) j++;                else {                    j = 0;                    n_filetypes++;                }            } /* for (k=0; k<MAX_ARRAY_SIZE; k++) */            pvfs_write_list(fd->fd_sys, mem_list_count,                           &mem_offsets, &mem_lengths,                           file_list_count, file_offsets,                           file_lengths);            mem_offsets += mem_lengths;            mem_lengths = 0;        } /* for (i=0; i<n_write_lists; i++) */        /* for file arrays smaller than MAX_ARRAY_SIZE (last read_list call) */        if (extra_blks) {            file_list_count = extra_blks;            if(!i) {                file_offsets[0] = offset;                file_lengths[0] = st_fwr_size;            }            for (k=0; k<extra_blks; k++) {                if(i || k) {                    file_offsets[k] = disp + n_filetypes*filetype_extent +

⌨️ 快捷键说明

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