ile türetilmiş veri türleri Fortran'daki BCASTing veri tiplerini öğreniyorum ve terminalden iki değer alan ve her işlemde bunları görüntüleyen bir kod var. Tamsayı/tamsayı/tamsayı/tamsayı/tamsayı/değer2 kombinasyonları için bu çalışır, ancak tamsayı/gerçek * 8 kombinasyonu için başarısız olur.MPI
kodudur:
use mpi
implicit none
integer :: ierror, pid, ncpu, root = 0
integer :: counts, newtype, extent
integer, dimension(2) :: oldtypes, blockcounts, offsets
type value
integer :: value1 = 0
real*8 :: value2
end type
type (value) input
call MPI_INIT(ierror)
call MPI_COMM_RANK(MPI_COMM_WORLD, pid, ierror)
call MPI_COMM_SIZE(MPI_COMM_WORLD, ncpu, ierror)
! setup of 1 MPI_INTEGER field: value1
offsets(1) = 0
oldtypes(1) = MPI_INTEGER
blockcounts(1) = 1
! setup of 1 MPI_REAL8 field: value2
call MPI_TYPE_EXTENT(MPI_INTEGER, extent, ierror) !determine offset of MPI_INTEGER
offsets(2) = blockcounts(1)*extent !offset is 1 MPI_INTEGER extents
oldtypes(2) = MPI_REAL8
blockcounts(2) = 1
! define struct type and commit
counts = 2 !for MPI_INTEGER + MPI_REAL8
call MPI_TYPE_STRUCT(counts, blockcounts, offsets, &
oldtypes, newtype, ierror)
call MPI_TYPE_COMMIT(newtype, ierror)
do while (input%value1 >= 0)
if (pid == root) then
read(*,*) input
write(*,*) 'input was: ', input
end if
call MPI_BCAST(input, 1, newtype, &
root, MPI_COMM_WORLD, ierror)
write(*,*), 'process ', pid, 'received: ', input
end do
call MPI_TYPE_FREE(newtype, ierror)
call MPI_FINALIZE(ierror)
O gelen deklarasyon değişen ve eskitür tarafından bu tamsayı/tamsayı ve tamsayı/gerçek çalışma cezası kontrol edilebilir. Tamsayı/gerçek * 8 kombinasyonu, örn. girişleri -1 2.0 üreten: benzer bir konu ile
input was: -1 2.0000000000000000
process 0 received: -1 2.0000000000000000
process 1 received: -1 0.0000000000000000
process 2 received: -1 0.0000000000000000
process 3 received: -1 0.0000000000000000
This iplik dikkate alınmaz ek dolgu olabilir olarak MPI_TYPE_EXTENT kullanarak doğru olmadığını göstermektedir. Maalesef, sorunu çözebiliyor ve burada birisinin beni aydınlatmasına yardımcı olabiliyordum. peşin
thx
+1 harika bir cevap ve örnek. – casey
+1 açıkladığınız için teşekkür ederiz. Zaten MPI_GET_ADDRESS ile uğraşıyordum ama henüz işe yaramadı. örneğiniz güzel çalıştı! – nluigi