// SpTriSumToRoot join (MPI) parallel triplets to root (Rank == 0) processor. // NOTE: J in root is also joined into Jroot func SpTriSumToRoot(J *Triplet) { if mpi.Rank() == 0 { for proc := 1; proc < mpi.Size(); proc++ { nnz := mpi.SingleIntRecv(proc) irec := make([]int, nnz) drec := make([]float64, nnz) mpi.IntRecv(irec, proc) J.i = append(J.i, irec...) mpi.IntRecv(irec, proc) J.j = append(J.j, irec...) mpi.DblRecv(drec, proc) J.x = append(J.x, drec...) } J.pos = len(J.x) J.max = J.pos } else { mpi.SingleIntSend(J.max, 0) mpi.IntSend(J.i, 0) mpi.IntSend(J.j, 0) mpi.DblSend(J.x, 0) } }
func main() { mpi.Start(false) defer func() { mpi.Stop(false) }() if mpi.Rank() == 0 { io.PfYel("\nTest MPI 02\n") } if mpi.Size() != 3 { chk.Panic("this test needs 3 processors") } var myints []int var mydbls []float64 switch mpi.Rank() { case 1: myints = []int{1, 2, 3, 4} mydbls = []float64{-1, -2, -3} case 2: myints = []int{20, 30, 40, 50, 60} mydbls = []float64{-20, -50} } // SingleIntSend if mpi.Rank() == 0 { v1 := make([]int, mpi.Size()) v2 := make([]int, mpi.Size()) allints := []int{} alldbls := []float64{} for proc := 1; proc < mpi.Size(); proc++ { // SingleIntRecv val := mpi.SingleIntRecv(proc) io.Pf("root recieved val=%d from proc=%d\n", val, proc) v1[proc] = val val = mpi.SingleIntRecv(proc) io.Pf("root recieved val=%d from proc=%d\n", val, proc) v2[proc] = val // IntRecv n := mpi.SingleIntRecv(proc) io.Pf("root recieved n=%d from proc=%d\n", n, proc) ints := make([]int, n) mpi.IntRecv(ints, proc) io.Pf("root recieved ints=%v from proc=%d\n", ints, proc) allints = append(allints, ints...) // DblRecv n = mpi.SingleIntRecv(proc) io.Pf("root recieved n=%d from proc=%d\n", n, proc) dbls := make([]float64, n) mpi.DblRecv(dbls, proc) io.Pf("root recieved dbls=%v from proc=%d\n", dbls, proc) alldbls = append(alldbls, dbls...) } var tst testing.T chk.Ints(&tst, "SingleIntRecv: vals", v1, []int{0, 1001, 1002}) chk.Ints(&tst, "SingleIntRecv: vals", v2, []int{0, 2001, 2002}) chk.Ints(&tst, "IntRecv: allints", allints, []int{1, 2, 3, 4, 20, 30, 40, 50, 60}) chk.Vector(&tst, "IntRecv: alldbls", 1e-17, alldbls, []float64{-1, -2, -3, -20, -50}) } else { // SingleIntSend mpi.SingleIntSend(1000+mpi.Rank(), 0) mpi.SingleIntSend(2000+mpi.Rank(), 0) // IntSend mpi.SingleIntSend(len(myints), 0) mpi.IntSend(myints, 0) // DblSend mpi.SingleIntSend(len(mydbls), 0) mpi.DblSend(mydbls, 0) } }