310 CHAPTER 7. MESSAGE PASSING INTERFACE
47. !
48. subroutine Fox(n,grid,local_A,local_B,local_C,n_bar)
49. integer, intent(in) :: n, n_bar
50. TYPE(GRID_INFO_TYPE), intent(in) :: grid
51. real, intent(in) , dimension(:,:) :: local_A, local_B
52. real, intent(out), dimension (:,:):: local_C
53. real, dimension(1:n_bar,1:n_bar) :: temp_A
54. integer:: step, source, dest, request,i,j
55. integer:: status(MPI_STATUS_SIZE), bcast_root
56. temp_A = 0.0
57. local_C = 0.0
58. source = mod( (grid%my_row + 1), grid%q )
59. dest = mod( (grid%my_row - 1 + grid%q), grid%q )
60. do step = 0, grid%q -1
61. bcast_root = mod( (grid%my_row + step), grid%q )
62. if (bcast_root == grid%my_col) then
63. call mpi_bcast(local_A, n_bar*n_bar, mpi_real,&
64. bcast_root, grid%row_comm, ierr)
65. ! print*, grid%my_row, grid%my_col, ’local_A = ’,local_A
66. call sgemm(’N’,’N’,n_bar,n_bar,n_bar,1.0,&
67. local_A,n_bar,local_B,n_bar,1.0,local_C,n_bar)
68. ! do j = 1,n_bar
69. ! do k = 1,n_bar
70. ! do i = 1,n_bar
71. ! local_C(i,j)=local_C(i,j) + local_A(i,k)*&
72. ! local_B(k,j)
73. ! end do
74. ! end do
75. ! end do
76. else
77. ! Store local_A from bcast_root in temp_A so as
78. ! not to overwrite local_A in destination.
79. call mpi_bcast(temp_A, n_bar*n_bar, mpi_real,&
80. bcast_root, grid%row_comm, ierr)
81. call sgemm(’N’,’N’,n_bar,n_bar,n_bar,1.0,&
82. temp_A,n_bar,local_B,n_bar,1.0,local_C,n_bar)
83. ! do j = 1,n_bar
84. ! do k = 1,n_bar
85. ! do i = 1,n_bar
86. ! local_C(i,j)=local_C(i,j) + temp_A(i,k)*&
87. ! local_B(k,j)
88. ! enddo
89. ! enddo
90. ! enddo
91. endif
© 2004 by Chapman & Hall/CRC