54 INTEGER(mpi),
DIMENSION(:),
ALLOCATABLE ::
bitmap
55 INTEGER(mpi),
PARAMETER ::
bs = bit_size(1_mpi)
68 INTEGER(mpi),
INTENT(IN) :: im
69 INTEGER(mpi),
INTENT(IN) :: jm
70 INTEGER(mpi),
INTENT(IN) :: inc
79 INTEGER(mpi) :: icount
81 INTEGER(mpi) :: jcount
90 noffi=int(i-1,mpl)*int(i-2,mpl)*int(
ibfw,mpl)/2
112 icount=min(icount+inc,
mxcnt)
114 IF (icount /= jcount)
THEN
118 IF (btest(icount,ib))
THEN
147SUBROUTINE clbits(in,jreqpe,jhispe,jsngpe,jcmprs,jextnd,idimb,iencdb,ispc)
151 INTEGER(mpi),
INTENT(IN) :: in
152 INTEGER(mpi),
INTENT(IN) :: jreqpe
153 INTEGER(mpi),
INTENT(IN) :: jhispe
154 INTEGER(mpi),
INTENT(IN) :: jsngpe
155 INTEGER(mpi),
INTENT(IN) :: jcmprs
156 INTEGER(mpi),
INTENT(IN) :: jextnd
157 INTEGER(mpl),
INTENT(OUT) :: idimb
158 INTEGER(mpi),
INTENT(OUT) :: iencdb
159 INTEGER(mpi),
INTENT(OUT) :: ispc
161 INTEGER(mpl) :: noffd
163 INTEGER(mpi) :: icount
165 INTEGER(mpi) :: nbcol
178 icount=max(jsngpe+1,jhispe)
179 icount=max(jreqpe,icount)
183 IF (icount >
mxcnt)
THEN
189 noffd=int(
n,mpl)*int(
n-1,mpl)*int(
ibfw,mpl)/2
192 mb=int(4.0e-6*real(
ndimb,mps),mpi)
194 WRITE(*,*)
'CLBITS: symmetric matrix of dimension',
n
195 WRITE(*,*)
'CLBITS: off-diagonal elements',noffd
197 WRITE(*,*)
'CLBITS: dimension of bit-array',
ndimb ,
'(',mb,
'MB)'
199 WRITE(*,*)
'CLBITS: dimension of bit-array',
ndimb ,
'(< 1 MB)'
206 IF (btest(
n,i)) nbcol=i+1
224SUBROUTINE ndbits(ndims,ncmprs,nsparr,ihst)
227 INTEGER(mpl),
DIMENSION(4),
INTENT(OUT) :: ndims
228 INTEGER(mpi),
DIMENSION(:),
INTENT(OUT) :: ncmprs
229 INTEGER(mpl),
DIMENSION(:,:),
INTENT(OUT) :: nsparr
230 INTEGER(mpi),
INTENT(IN) :: ihst
232 INTEGER(mpi) :: nwcp(0:1)
233 INTEGER(mpi) :: irgn(2)
234 INTEGER(mpi) :: inr(2)
235 INTEGER(mpi) :: ichunk
248 INTEGER(mpi) :: icount
249 INTEGER(mpi) :: iproc
250 INTEGER(mpi) :: iword
258 INTEGER(mpl) :: noffi
283 noffi=int(i-1,mpl)*int(i-2,mpl)*int(
ibfw,mpl)/2
313 IF (iproc == 0.AND.ihst > 0)
CALL hmpent(ihst,real(icount,mps))
317 IF (icount >=
ireqpe)
THEN
319 IF (icount <=
isngpe) next=2
320 iword=ibset(iword,mb+next-1)
321 inr(next)=inr(next)+1
322 IF (next /= last.OR.lrgn >=
nencdm)
THEN
323 irgn(next)=irgn(next)+1
343 nsparr(1,ir)=irgn(jp)
359 irgn(1)=int(nsparr(1,i+1),mpi)
360 irgn(2)=int(nsparr(1,i+
n+2),mpi)
361 inr(1)=int(nsparr(2,i+1),mpi)
362 inr(2)=int(nsparr(2,i+
n+2),mpi)
376 noffi=int(j-1,mpl)*int(j-2,mpl)*int(
ibfw,mpl)/2
377 ll=noffi/
bs+j+noffj/
bs
387 inr(next)=inr(next)+1
388 IF (next /= last.OR.lrgn >=
nencdm)
THEN
389 irgn(next)=irgn(next)+1
403 IF (inr(jp) > 0)
THEN
404 nwcp(1)=irgn(jp)+(irgn(jp)+7)/8
406 IF ((nwcp(1) < nwcp(0).AND.
icmprs > 0).OR.
iextnd > 0)
THEN
408 ncmprs(i+
n*(jp-1))=irgn(jp)
411 ndims(2) =ndims(2) +nwcp(icp)
412 ndims(jp+2)=ndims(jp+2)+nwcp(0)
415 nsparr(1,ir)=nwcp(icp)
447 noffi=int(i-1,mpl)*int(i-2,mpl)/2
456 nsparr(1,n1)=nsparr(1,1)+nin
457 nsparr(2,n1)=nsparr(2,1)+nin
465 nin=ndims(3)+ndims(4)
466 fracz=200.0*real(ntot,mps)/real(
n,mps)/real(
n-1,mps)
467 fracu=200.0*real(nin,mps)/real(
n,mps)/real(
n-1,mps)
469 WRITE(*,*)
'NDBITS: number of diagonal elements',
n
470 WRITE(*,*)
'NDBITS: number of used off-diagonal elements',nin
471 WRITE(*,1000)
'fraction of non-zero off-diagonal elements', fracz
472 WRITE(*,1000)
'fraction of used off-diagonal elements', fracu
474 cpr=100.0*real(mpi*ndims(2)+mpd*ndims(3)+mps*ndims(4),mps)/real((mpd+mpi)*nin,mps)
475 WRITE(*,1000)
'compression ratio for off-diagonal elements', cpr
4771000
FORMAT(
' NDBITS: ',a,f6.2,
' %')
489 INTEGER(mpl),
DIMENSION(4),
INTENT(OUT) :: ndims
491 INTEGER(mpi) :: nwcp(0:1)
492 INTEGER(mpi) :: irgn(2)
493 INTEGER(mpi) :: inr(2)
495 INTEGER(mpl) :: noffi
503 INTEGER(mpi) :: icount
517 noffi=int(i-1,mpl)*int(i-2,mpl)*int(
ibfw,mpl)/2
538 IF (icount > 0) ndims(1)=ndims(1)+1
540 IF (icount >=
ireqpe)
THEN
542 IF (icount <=
isngpe) next=2
543 inr(next)=inr(next)+1
544 IF (next /= last.OR.lrgn >=
nencdm)
THEN
545 irgn(next)=irgn(next)+1
555 IF (inr(jp) > 0)
THEN
558 nwcp(1)=irgn(jp)+(irgn(jp)+7)/8
560 IF (nwcp(1) < nwcp(0).OR.
iextnd > 0) icp=1
561 ndims(2) =ndims(2) +nwcp(icp)
562 ndims(jp+2)=ndims(jp+2)+nwcp(0)
566 ndims(2)=ndims(2)+inr(1)
567 ndims(3)=ndims(3)+inr(1)
585 INTEGER(mpl),
DIMENSION(:,:),
INTENT(IN) :: nsparr
586 INTEGER(mpi),
DIMENSION(:),
INTENT(OUT) :: nsparc
587 INTEGER(mpi),
DIMENSION(:),
INTENT(INOUT) :: ncmprs
595 INTEGER(mpl) :: noffi
602 INTEGER(mpi) :: ichunk
607 INTEGER(mpi) :: nrgn8
619 noffi=int(i-1,mpl)*int(i-2,mpl)*int(
ibfw,mpl)/2
644 IF (last == 0.OR.jn >=
nencdm)
THEN
645 IF (mod(lrgn,8) == 0)
THEN
647 nsparc(k8)=int(ll-l1,mpi)
655 nsparc(kl)=ior(j1,jn)
676 noffi=int(j-1,mpl)*int(j-2,mpl)*int(
ibfw,mpl)/2
677 l=noffi/
bs+j+noffj/
bs
686 IF (last == 0.OR.jn >=
nencdm)
THEN
687 IF (mod(lrgn,8) == 0)
THEN
689 nsparc(k8)=int(ll-l1,mpi)
697 nsparc(kl)=ior(j1,jn)
712 WRITE(*,*)
'SPBITS: sparse structure constructed ',nsparr(1,n1),
' words'
713 WRITE(*,*)
'SPBITS: dimension parameter of matrix',nsparr(2,1)-1
715 WRITE(*,*)
'SPBITS: index of last used location',nsparr(2,n1)-1
717 WRITE(*,*)
'SPBITS: index of last used double',nsparr(2,n1/2)-1
718 WRITE(*,*)
'SPBITS: index of last used single',nsparr(2,n1)-1
733 INTEGER(mpi),
INTENT(IN) :: in
735 INTEGER(mpl) :: noffd
741 noffd=int(
n2,mpl)*int(
n2-1,mpl)/2
743 mb=int(4.0e-6*real(
ndimb2,mps),mpi)
746 WRITE(*,*)
'CLBMAP: dimension of bit-map',
ndimb2 ,
'(',mb,
'MB)'
748 WRITE(*,*)
'CLBMAP: dimension of bit-map',
ndimb2 ,
'(< 1 MB)'
763 INTEGER(mpi),
INTENT(IN) :: im
764 INTEGER(mpi),
INTENT(IN) :: jm
769 INTEGER(mpi) :: noffj
770 INTEGER(mpl) :: noffi
778 noffi=int(i-1,mpl)*int(i-2,mpl)/2
780 l=noffi/
bs+i+noffj/
bs
794 INTEGER(mpi),
DIMENSION(:),
INTENT(OUT) :: npair
797 INTEGER(mpl) :: noffi
807 noffi=int(i-1,mpl)*int(i-2,mpl)/2
811 IF (btest(
bitmap(l),m))
THEN
subroutine clbits(in, jreqpe, jhispe, jsngpe, jcmprs, jextnd, idimb, iencdb, ispc)
Calculate bit (field) array size, encoding.
subroutine gpbmap(npair)
Get pairs (statistic) from map.
subroutine ckbits(ndims)
Check sparsity of matrix.
subroutine spbits(nsparr, nsparc, ncmprs)
Create sparsity information.
subroutine clbmap(in)
Clear (additional) bit map.
subroutine inbmap(im, jm)
Fill bit map.
subroutine inbits(im, jm, inc)
Fill bit fields (counters).
subroutine ndbits(ndims, ncmprs, nsparr, ihst)
Analyze bit fields.
integer(mpi) n2
matrix size (map)
integer(mpi) ireqpe
min number of pair entries
integer(mpl) ndimb2
dimension for bit map
integer(mpi) ibfw
bit field width
integer(mpi) iextnd
flag for extended storage (both 'halves' of sym. mat. for improved access patterns)
integer(mpi) n
matrix size (counters)
integer(mpi), parameter bs
number of bits in INTEGER(mpi)
integer(mpi) nspc
number of precision for sparse global matrix (1=D, 2=D+f)
integer(mpi) nencdb
number of bits for encoding column counter
integer(mpi) isngpe
upper bound for pair entry single precision storage
integer(mpi), dimension(:), allocatable bitmap
fit field map for global parameters pairs (measurements)
integer(mpi) mxcnt
max value for bit field counters
integer(mpi) icmprs
compression flag for sparsity (column indices)
integer(mpi) nthrd
number of threads
integer(mpl) ndimb
dimension for bit (field) array
integer(mpi), dimension(:), allocatable bitfieldcounters
fit field counters for global parameters pairs (tracks)
integer(mpi) nencdm
max value for column counter
(De)Allocate vectors and arrays.