- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
cannon.f
************************************************************************
************************************************************************
subroutine cannon( a, lda, b, ldb, c, ldc, m, n, k, rowcomm,
colcomm, w, iw )
implicit none
include mpif.h
integer lda, ldb, ldc, m, n, k, rowcomm, colcomm, iw(*)
real a(lda, *), b(ldb, *), c(ldc, *), w(*)
*
integer lma, lka, lkb, lnb, lmc, lnc, ldw, ldw1
*
integer nr, nc, rid, cid, ierr, res, arect, brect, nrb
integer root, north, south, sta(mpi_status_size), i
*
call mpi_comm_size( colcomm, nr, ierr )
call mpi_comm_rank( colcomm, rid, ierr )
call mpi_comm_size( rowcomm, nc, ierr )
call mpi_comm_rank( rowcomm, cid, ierr )
*
lma = m/nr
res = mod( m, nr )
if ( rid .lt. res ) lma = lma + 1
*
lka = k/nc
res = mod( k, nc )
if ( cid .lt. res ) lka = lka + 1
*
lkb = k/nr
res = mod( k, nr )
if ( rid .lt. res ) lkb = lkb + 1
*
lnc = n/nc
res = mod( n, nc )
if ( cid .lt. res ) lnc = lnc + 1
lmc = lma
lnb = lnc
ldw = lma + 1
call mpi_allgather( lkb, 1, mpi_integer, iw, 1, mpi_integer,
colcomm, ierr )
nrb = iw(1)
ldw1 = ldb
*
if ( nr .ne. nc ) return
*
call mpirect( lda, lma, nrb, arect )
call mpi_type_commit( arect, ierr )
call mpirect( ldb, nrb, lnb, brect )
call mpi_type_commit( brect, ierr )
call wrapinita(a, lda, lma, lka, rid, cid, nr, nc)
call wrapinitb(b, ldb, lkb, lnb, rid, cid, nr, nc)
call zeroc( c, ldc, lmc, lnc )
*
north = mod( nr+rid-1, nr )
south = mod( rid+1, nr )
root = 0
*
do 100 i=0, nr-1
root = mod(rid + i, nr)
call mcopy( a, lda, w, ldw, lma, lka )
call mpi_bcast( w, 1, arect, root, rowcomm, ierr )
k = root + 1
call sgemm(w, ldw, b, ldb, c, ldc, lma, iw(k), lnc)
*
文档评论(0)