Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/array.f90
Original file line number Diff line number Diff line change
Expand Up @@ -759,7 +759,7 @@ subroutine array_set_index(context,array,index,e,ve,errno)
vec=array%data%ptr(array%offset+pm_elemref_vect)
off=array%data%ptr(array%offset+pm_elemref_offset)
ix=array%data%ptr(array%offset+pm_elemref_idx)
idx=vector_zero_unused(context,index,ve,-1_pm_ln)
idx=vector_zero_unused(context,index,ve,-987654321_pm_ln)
esize=pm_fast_esize(idx)
newvec=pm_new(context,pm_pointer,esize+1)
newoff=pm_new(context,pm_long,esize+1)
Expand All @@ -772,7 +772,8 @@ subroutine array_set_index(context,array,index,e,ve,errno)
newoff%data%ln(newoff%offset+i)=v%data%ln(v%offset+j)
v=w%data%ptr(w%offset+pm_array_length)
if(v%data%ln(v%offset+j)<=idx%data%ln(idx%offset+i).or.&
idx%data%ln(idx%offset+i)<0) then
idx%data%ln(idx%offset+i)<0.and.&
idx%data%ln(idx%offset+i)/=-987654321_pm_ln) then
errno=vector_index_error
return
endif
Expand Down
27 changes: 20 additions & 7 deletions src/parlib.f90
Original file line number Diff line number Diff line change
Expand Up @@ -1587,6 +1587,7 @@ recursive subroutine irecv(node,v,mess_tag,iserr,xcomm)
endif
tno=pm_fast_typeof(v)
esize=pm_fast_esize(v)
iserr=.false.
if(debug_mess) then
write(*,*) 'on',par_frame(par_depth)%this_node,'irecv',tno,'to',node,'top',message_top
endif
Expand Down Expand Up @@ -2555,13 +2556,25 @@ function mpi_subrange_type(tno,start,end,step,width,align) result(tno2)
n=(end-start)/step+1
if(width>1.and.(align>0.or.start+(n-1)*step+width>end)) then
! Partial block at start or end complicates things...
types(1)=mpi_contig_type(tno, max(0_pm_ln,width-align),blk(1))
types(2)=mpi_strided_block_type(tno,max(0_pm_ln,n-2),step,width,blk(2))
types(3)=mpi_contig_type(tno, min(width,end-(start-align+(n-1)*step)),blk(3))
displ(1)=start*siz
displ(2)=(start-align+step)*siz
displ(3)=(start-align+(n-1)*step)*siz
call mpi_type_create_struct(3,blk,displ,types,tno2,errno)
if(n>2) then
types(1)=mpi_contig_type(tno, max(0_pm_ln,width-align),blk(1))
types(2)=mpi_strided_block_type(tno,max(0_pm_ln,n-2),step,width,blk(2))
types(3)=mpi_contig_type(tno, min(width,end-(start-align+(n-1)*step)+1),blk(3))
displ(1)=start*siz
displ(2)=(start-align+step)*siz
displ(3)=(start-align+(n-1)*step)*siz
call mpi_type_create_struct(3,blk,displ,types,tno2,errno)
elseif(n==2) then
types(1)=mpi_contig_type(tno, max(0_pm_ln,width-align),blk(1))
types(2)=mpi_contig_type(tno, min(width,end-(start-align+step)+1),blk(2))
displ(1)=start*siz
displ(2)=(start-align+step)*siz
call mpi_type_create_struct(2,blk,displ,types,tno2,errno)
else
types(1)=mpi_contig_type(tno,min(end+1,start-align+width)-start,blk(1))
displ(1)=start*siz
call mpi_type_create_struct(1,blk,displ,types,tno2,errno)
endif
else
tno3=mpi_strided_block_type(tno,n,step,width,m)
displ(1)=start*siz
Expand Down
702 changes: 685 additions & 17 deletions src/rtime.inc

Large diffs are not rendered by default.

26 changes: 19 additions & 7 deletions src/runtime.f90
Original file line number Diff line number Diff line change
Expand Up @@ -590,13 +590,25 @@ SUBROUTINE PM__GET_MPI_SUBRANGE_TYPE(TNO,START,END,STEP,WIDTH,ALIGN,TNO2)
N=(END-START)/STEP+1
IF(WIDTH>1.AND.(ALIGN>0.OR.START+(N-1)*STEP+WIDTH>END)) THEN
! PARTIAL BLOCK AT START OR END COMPLICATES THINGS...
CALL PM__GET_MPI_CONTIG_TYPE(TNO, MAX(0_PM__LN,WIDTH-ALIGN),MTYPES(1),BLK(1))
CALL PM__GET_MPI_STRIDED_BLOCK_TYPE(TNO,MAX(0_PM__LN,N-2),STEP,WIDTH,MTYPES(2),BLK(2))
CALL PM__GET_MPI_CONTIG_TYPE(TNO, MIN(WIDTH,END-(START-ALIGN+(N-1)*STEP)),MTYPES(3),BLK(3))
DISPL(1)=START*SIZ
DISPL(2)=(START-ALIGN+STEP)*SIZ
DISPL(3)=(START-ALIGN+(N-1)*STEP)*SIZ
CALL MPI_TYPE_CREATE_STRUCT(3,BLK,DISPL,MTYPES,TNO2,ERRNO)
IF(N.GT.2) THEN
CALL PM__GET_MPI_CONTIG_TYPE(TNO, MAX(0_PM__LN,WIDTH-ALIGN),MTYPES(1),BLK(1))
CALL PM__GET_MPI_STRIDED_BLOCK_TYPE(TNO,MAX(0_PM__LN,N-2),STEP,WIDTH,MTYPES(2),BLK(2))
CALL PM__GET_MPI_CONTIG_TYPE(TNO, MIN(WIDTH,END-(START-ALIGN+(N-1)*STEP)),MTYPES(3),BLK(3))
DISPL(1)=START*SIZ
DISPL(2)=(START-ALIGN+STEP)*SIZ
DISPL(3)=(START-ALIGN+(N-1)*STEP)*SIZ
CALL MPI_TYPE_CREATE_STRUCT(3,BLK,DISPL,MTYPES,TNO2,ERRNO)
ELSEIF(N==2) THEN
CALL PM__GET_MPI_CONTIG_TYPE(TNO, MAX(0_PM__LN,WIDTH-ALIGN),MTYPES(1),BLK(1))
CALL PM__GET_MPI_CONTIG_TYPE(TNO, MIN(WIDTH,END-(START-ALIGN+STEP)+1),MTYPES(2),BLK(2))
DISPL(1)=START*SIZ
DISPL(2)=(START-ALIGN+STEP)*SIZ
CALL MPI_TYPE_CREATE_STRUCT(2,BLK,DISPL,MTYPES,TNO2,ERRNO)
ELSE
CALL PM__GET_MPI_CONTIG_TYPE(TNO,MIN(END+1,START-ALIGN+WIDTH)-START,MTYPES(1),BLK(1))
DISPL(1)=START*SIZ
CALL MPI_TYPE_CREATE_STRUCT(1,BLK,DISPL,MTYPES,TNO2,ERRNO)
ENDIF
ELSE
CALL PM__GET_MPI_STRIDED_BLOCK_TYPE(TNO,N,STEP,WIDTH,TNO3,M)
DISPL(1)=START*SIZ
Expand Down
Loading