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

📄 ad_nfs_read.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
        if (fd->atomicity)            ADIOI_UNLOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);        if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off;	ADIOI_Free(readbuf); /* malloced in the buffered_read macro */	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;    }    else {  /* 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;	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;			frd_size = (int) (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;		    frd_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;	}        start_off = offset;       /* Calculate end_offset, the last byte-offset that will be accessed.         e.g., if start_offset=0 and 100 bytes to be read, end_offset=99*/	st_frd_size = frd_size;	st_n_filetypes = n_filetypes;	i = 0;	j = st_index;	off = offset;	frd_size = ADIOI_MIN(st_frd_size, bufsize);	while (i < bufsize) {	    i += frd_size;	    end_offset = off + frd_size - 1;	    if (j < (flat_file->count - 1)) j++;	    else {		j = 0;		n_filetypes++;	    }	    off = disp + flat_file->indices[j] + (ADIO_Offset) n_filetypes*filetype_extent;	    frd_size = ADIOI_MIN(flat_file->blocklens[j], bufsize-i);	}/* 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);        /* initial read into readbuf */	readbuf_off = offset;	readbuf = (char *) ADIOI_Malloc(max_bufsize);	readbuf_len = (int) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1));#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_READ_LOCK(fd, offset, 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, offset, SEEK_SET, readbuf_len);        if (err == -1) err_flag = 1;	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;	    n_filetypes = st_n_filetypes;	    frd_size = ADIOI_MIN(st_frd_size, bufsize);	    while (i < bufsize) {                if (frd_size) {                     /* TYPE_UB and TYPE_LB can result in                        frd_size = 0. save system call in such cases */ 		    /* lseek(fd->fd_sys, off, SEEK_SET);		    err = read(fd->fd_sys, ((char *) buf) + i, frd_size);*/		    req_off = off;		    req_len = frd_size;		    userbuf_off = i;		    ADIOI_BUFFERED_READ		}		i += frd_size;                if (off + frd_size < disp + flat_file->indices[j] +                   flat_file->blocklens[j] + (ADIO_Offset) n_filetypes*filetype_extent)                       off += frd_size;                /* did not reach end of contiguous block in filetype.                   no more I/O needed. off is incremented by frd_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;		    frd_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;	    i = (int) (flat_buf->indices[0]);	    j = st_index;	    off = offset;	    n_filetypes = st_n_filetypes;	    frd_size = st_frd_size;	    brd_size = flat_buf->blocklens[0];	    while (num < bufsize) {		size = ADIOI_MIN(frd_size, brd_size);		if (size) {		    /* lseek(fd->fd_sys, off, SEEK_SET);		    err = read(fd->fd_sys, ((char *) buf) + i, size); */		    req_off = off;		    req_len = size;		    userbuf_off = i;		    ADIOI_BUFFERED_READ		}		new_frd_size = frd_size;		new_brd_size = brd_size;		if (size == frd_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_frd_size = flat_file->blocklens[j];		    if (size != brd_size) {			i += size;			new_brd_size -= size;		    }		}		if (size == brd_size) {/* reached end of contiguous block in memory */		    k = (k + 1)%flat_buf->count;		    buf_count++;		    i = (int) (buftype_extent*(buf_count/flat_buf->count) +			flat_buf->indices[k]); 		    new_brd_size = flat_buf->blocklens[k];		    if (size != frd_size) {			off += size;			new_frd_size -= size;		    }		}		num += size;		frd_size = new_frd_size;                brd_size = new_brd_size;	    }	}	        if (fd->atomicity)            ADIOI_UNLOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);	if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off;	ADIOI_Free(readbuf); /* malloced in the buffered_read macro */	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 read and placed in buf    by ADIOI_BUFFERED_READ. */#endif    if (!buftype_is_contig) ADIOI_Delete_flattened(datatype);}

⌨️ 快捷键说明

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