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

📄 ad_pvfs2_write.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 3 页
字号:
		  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 write */	f_data_wrote = ADIOI_MIN(st_fwr_size, bufsize);	total_blks_to_write = 1;	if (j < (flat_file->count -1)) j++;	else {	    j = 0;	    n_filetypes++;	}	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 writelist, 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 writelist 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 + 			((ADIO_Offset)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++) */	    err_flag = PVFS_Request_contiguous(mem_lengths, 					       PVFS_BYTE, &mem_req);	    /* --BEGIN ERROR HANDLING-- */	    if (err_flag != 0) {		*error_code = MPIO_Err_create_code(MPI_SUCCESS,						   MPIR_ERR_RECOVERABLE,						   myname, __LINE__,						   ADIOI_PVFS2_error_convert(err_flag),						   "Error in PVFS_Request_contiguous (memory)", 0);		goto error_state;	    }	    /* --END ERROR HANDLING-- */	    err_flag = PVFS_Request_hindexed(file_list_count, file_lengths, 					     file_offsets, PVFS_BYTE,					     &file_req);	    /* --BEGIN ERROR HANDLING-- */	    if (err_flag != 0) {		*error_code = MPIO_Err_create_code(MPI_SUCCESS,						   MPIR_ERR_RECOVERABLE,						   myname, __LINE__,						   ADIOI_PVFS2_error_convert(err_flag),						   "Error in PVFS_Request_hindexed (file)", 0);		goto error_state;	    }	    /* --END ERROR HANDLING-- */	    /* PVFS_Request_hindexed already expresses the offsets into the	     * file, so we should not pass in an offset if we are using	     * hindexed for the file type */#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );#endif	    err_flag = PVFS_sys_write(pvfs_fs->object_ref, file_req, 0, 				      mem_offsets, mem_req,				      &(pvfs_fs->credentials), &resp_io);#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );#endif	    /* --BEGIN ERROR HANDLING-- */	    if (err_flag != 0) {		*error_code = MPIO_Err_create_code(MPI_SUCCESS,						   MPIR_ERR_RECOVERABLE,						   myname, __LINE__,						   ADIOI_PVFS2_error_convert(err_flag),						   "Error in PVFS_sys_write", 0);		goto error_state;	    }	    /* --END ERROR HANDLING-- */	    total_bytes_written += resp_io.total_completed;            mem_offsets += mem_lengths;            mem_lengths = 0;	    PVFS_Request_free(&file_req);	    PVFS_Request_free(&mem_req);        } /* for (i=0; i<n_write_lists; i++) */        /* for file arrays smaller than MAX_ARRAY_SIZE (last write_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 + 			((ADIO_Offset)n_filetypes)*filetype_extent +			flat_file->indices[j];                    if (k == (extra_blks - 1)) {                        file_lengths[k] = bufsize - (int32_t) mem_lengths                          - (int32_t) mem_offsets + (int32_t)  buf;                    }                    else file_lengths[k] = flat_file->blocklens[j];                } /* if(i || k) */                mem_lengths += file_lengths[k];                if (j<(flat_file->count - 1)) j++;                else {                    j = 0;                    n_filetypes++;                }            } /* for (k=0; k<extra_blks; k++) */	    err_flag = PVFS_Request_contiguous(mem_lengths, 					       PVFS_BYTE, &mem_req);	    /* --BEGIN ERROR HANDLING-- */	    if (err_flag != 0) {		*error_code = MPIO_Err_create_code(MPI_SUCCESS,						   MPIR_ERR_RECOVERABLE,						   myname, __LINE__,						   ADIOI_PVFS2_error_convert(err_flag),						   "Error in PVFS_Request_contiguous (memory)", 0);		goto error_state;	    }	    /* --END ERROR HANDLING-- */	    err_flag = PVFS_Request_hindexed(file_list_count, file_lengths, 					     file_offsets, PVFS_BYTE,					     &file_req);	    /* --BEGIN ERROR HANDLING-- */	    if (err_flag != 0) {		*error_code = MPIO_Err_create_code(MPI_SUCCESS,						   MPIR_ERR_RECOVERABLE,						   myname, __LINE__,						   ADIOI_PVFS2_error_convert(err_flag),						   "Error in PVFS_Request_hindexed(file)", 0);		goto error_state;	    }	    /* --END ERROR HANDLING-- */	    /* as above, use 0 for 'offset' when using hindexed file type*/#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );#endif	    err_flag = PVFS_sys_write(pvfs_fs->object_ref, file_req, 0, 				      mem_offsets, mem_req,				      &(pvfs_fs->credentials), &resp_io);#ifdef ADIOI_MPE_LOGGING            MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );#endif	    /* --BEGIN ERROR HANDLING-- */	    if (err_flag != 0) {		*error_code = MPIO_Err_create_code(MPI_SUCCESS,						   MPIR_ERR_RECOVERABLE,						   myname, __LINE__,						   ADIOI_PVFS2_error_convert(err_flag),						   "Error in PVFS_sys_write", 0);		goto error_state;	    }	    /* --END ERROR HANDLING-- */	    total_bytes_written += resp_io.total_completed;	    PVFS_Request_free(&mem_req);	    PVFS_Request_free(&file_req);        }    }     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;	size_wrote = 0;	n_filetypes = st_n_filetypes;	fwr_size = st_fwr_size;	bwr_size = flat_buf->blocklens[0];	buf_count = 0;	start_mem_offset = 0;	start_k = k = 0;	start_j = st_index;	max_mem_list = 0;	max_file_list = 0;	/* run through and file max_file_list and max_mem_list so that you 	   can allocate the file and memory arrays less than MAX_ARRAY_SIZE	   if possible */	while (size_wrote < bufsize) {	    k = start_k;	    new_buffer_write = 0;	    mem_list_count = 0;	    while ((mem_list_count < MAX_ARRAY_SIZE) && 		   (new_buffer_write < bufsize-size_wrote)) {	        /* find mem_list_count and file_list_count such that both are		   less than MAX_ARRAY_SIZE, the sum of their lengths are		   equal, and the sum of all the data written and data to be		   written in the next immediate write list is less than		   bufsize */	        if(mem_list_count) {		    if((new_buffer_write + flat_buf->blocklens[k] + 			size_wrote) > bufsize) {		        end_bwr_size = new_buffer_write + 			    flat_buf->blocklens[k] - (bufsize - size_wrote);			new_buffer_write = bufsize - size_wrote;		    }		    else {		        new_buffer_write += flat_buf->blocklens[k];			end_bwr_size = flat_buf->blocklens[k];		    }		}		else {		    if (bwr_size > (bufsize - size_wrote)) {		        new_buffer_write = bufsize - size_wrote;			bwr_size = new_buffer_write;		    }		    else new_buffer_write = bwr_size;		}		mem_list_count++;		k = (k + 1)%flat_buf->count;	     } /* while ((mem_list_count < MAX_ARRAY_SIZE) && 	       (new_buffer_write < bufsize-size_wrote)) */	    j = start_j;	    new_file_write = 0;	    file_list_count = 0;	    while ((file_list_count < MAX_ARRAY_SIZE) && 		   (new_file_write < new_buffer_write)) { 	        if(file_list_count) {		    if((new_file_write + flat_file->blocklens[j]) > 		       new_buffer_write) {		        end_fwr_size = new_buffer_write - new_file_write;			new_file_write = new_buffer_write;			j--;		    }		    else {		        new_file_write += flat_file->blocklens[j];			end_fwr_size = flat_file->blocklens[j];		    }		}		else {		    if (fwr_size > new_buffer_write) {		        new_file_write = new_buffer_write;			fwr_size = new_file_write;		    }		    else new_file_write = fwr_size;		}		file_list_count++;		if (j < (flat_file->count - 1)) j++;		else j = 0;				k = start_k;		if ((new_file_write < new_buffer_write) && 		    (file_list_count == MAX_ARRAY_SIZE)) {		    new_buffer_write = 0;		    mem_list_count = 0;		    while (new_buffer_write < new_file_write) {		        if(mem_list_count) {			    if((new_buffer_write + flat_buf->blocklens[k]) >			       new_file_write) {			        end_bwr_size = new_file_write - 				    new_buffer_write;				new_buffer_write = new_file_write;				k--;			    }			    else {			        new_buffer_write += flat_buf->blocklens[k];				end_bwr_size = flat_buf->blocklens[k];

⌨️ 快捷键说明

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