这是任务。给定2列3列n行的数组,对多个进程进行负载均衡。我们给了一个函数,比如叫做my_function(),最初是在串行代码中完成所有的工作(接受整个2个数组并做它需要做的任何计算)。这是尝试解决方案(请注意,我们无法保证连续的内存,有时它会从连续变为非连续而不另行通知)。
if(id == 0) then
do i=0,(np - 1)
if(i /= 0) then
start_1 = 1 + i*l_n
end_1 = (i+1)*l_n
start_2 = 1 + i*l_n
end_2 = (i+1)*l_n
new_array1 = old_array1(1:3,start_1:end_1)
new_array2 = old_array2(1:3,start_2:end_2)
call MPI_Send(new_array1,l_n*3, MPI_REAL, i, 0,MPI_COMM_WORLD, ierror)
call MPI_Send(new_array2,l_n*3, MPI_REAL, i, 0,MPI_COMM_WORLD, ierror)
CALL my_function(new_array1,new_array2,l_n,id,np)
else
new_array1 = old_array1(1:3,1:l_n)
new_array2 = old_array2(1:3,1:l_n)
CALL my_function(new_array1,new_array2,l_n,id,np)
end if
end do
else
call MPI_Recv(new_array1,3*l_n, MPI_REAL, 0, 0,MPI_COMM_WORLD, istatus, ierror)
call MPI_Recv(new_array2,3*l_n, MPI_REAL, 0, 0,MPI_COMM_WORLD, istatus, ierror)
end if
PS:np
:使用的进程数量,l_n
基本上为n/np
,n
和np
保证相互均分。
首先,我不确定它应该传递给MPI_Recv
,这是否正确我做的方式?其次,主要问题是:我的负载均衡是否正确?