2017-02-09 5 views
0

Я довольно новичок в написании/запуске параллельного кода. В настоящее время я экспериментирую с основными учебниками в написании параллельного кода, чтобы получить представление о процессе. Мой компьютер использует ubuntu с Mpich.Неустранимая ошибка в MPI_Send, неверный тег

Я пытаюсь запустить код под названием «Полная параллельная программа подвести вектор» на этой странице: http://condor.cc.ku.edu/~grobe/docs/intro-MPI.shtml

и я встречая следующее сообщение об ошибке после исполнения после запроса на ввод/Ввод номера:

Fatal error in MPI_Send: Invalid tag, error stack: 
MPI_Send(174): MPI_Send(buf=0x7ffeab0f2d3c, count=1, MPI_INT, dest=1, tag=1157242880, MPI_COMM_WORLD) failed 
MPI_Send(101): Invalid tag, value is 1157242880 

Я также получить предупреждение при компиляции:

sumvecp.f90:41:23: 

    call mpi_send(vector(start_row),num_rows_to_send, mpi_real, an_id, send_data_tag, mpi_comm_world,ierr) 
         1 
Warning: Legacy Extension: REAL array index at (1) 

Это мой код

program sumvecp 

include '/usr/include/mpi/mpif.h' 

parameter (max_rows = 10000000) 
parameter (send_data_tag = 2001, return_data_tag = 2002) 

integer my_id, root_proces, ierr, status(mpi_status_size) 
integer num_procs, an_id, num_rows_to_receive 
integer avg_rows_per_process, num_rows,num_rows_to_send 

real vector(max_rows), vector2(max_rows), partial_sum, sum 


root_process = 0 

call mpi_init(ierr) 

call mpi_comm_rank(mpi_comm_world,my_id,ierr) 
call mpi_comm_size(mpi_comm_world,num_procs,ierr) 

if (my_id .eq. root_process) then 
    print *, "please enter the number of numbers to sum: " 
    read *, num_rows 
    if (num_rows .gt. max_rows) stop "Too many numbers." 

    avg_rows_per_process = num_rows/num_procs 

    do ii = 1,num_rows 
     vector(ii) = float(ii) 
    end do 

    do an_id = 1, num_procs -1 
     start_row = (an_id*avg_rows_per_process) +1 
     end_row = start_row + avg_rows_per_process -1 
     if (an_id .eq. (num_procs - 1)) end_row = num_rows 
     num_rows_to_send = end_row - start_row + 1 

     call mpi_send(num_rows_to_send, 1, mpi_int, an_id, send_data_tag, mpi_comm_world,ierr) 

     call mpi_send(vector(start_row),num_rows_to_send, mpi_real, an_id, send_data_tag, mpi_comm_world,ierr) 
    end do 

    summ = 0.0 
    do ii = 1, avg_rows_per_process 
     summ = summ + vector(ii) 
    end do 

    print *,"sum", summ, "calculated by the root process." 

    do an_id =1, num_procs -1 
     call mpi_recv(partial_sum, 1, mpi_real, mpi_any_source, mpi_any_tag, mpi_comm_world, status, ierr) 

     sender = status(mpi_source) 
     print *, "partial sum", partial_sum, "returned from process", sender 
     summ = summ + partial_sum 
    end do 

    print *, "The grand total is: ", sum 

else 
    call mpi_recv(num_rows_to_receive, 1, mpi_int, root_process, mpi_any_tag, mpi_comm_world,status,ierr) 

    call mpi_recv(vector2,num_rows_to_received, mpi_real,root_process,mpi_any_tag,mpi_comm_world,status,ierr) 

    num_rows_received = num_rows_to_receive 

    partial_sum = 0.0 
    do ii=1,num_rows_received 
     partial_sum = partial_sum + vector2(ii) 
    end do 

    call mpi_send(partial_sum,1,mpi_real,root_process,return_data_tag,mpi_comm_world,ierr) 
endif 

call mpi_finalize(ierr) 
stop 
end 

ответ

1

Вам не хватает IMPLICIT NONE, и у вас есть большое количество необъявленных переменных.

сообщил об ошибке, потому что

send_data_tag = 2001, return_data_tag = 2002 

неявно real переменные и не integer s. Но у вас, вероятно, еще много проблем.

Сначала добавьте IMPLICIT NONE и объявите или переменные. Также я настоятельно рекомендую поставить use mpi вместо include '/usr/include/mpi/mpif.h', это, скорее всего, поможет вам найти больше проблем.


Теперь я вижу, что код скопирован с некоторого веб-сайта. Я бы не стал доверять этому сайту, потому что коды явно ошибочны.

+1

У нас есть много вопросов на этой неделе с той же основной проблемой. 'IMPLICIT NONE' ** важно ** !!! –

+0

После IMPLICIT NONE и объявления необъявленных переменных он работал нормально. Пришел к Fortran из python. (если это не очевидно) Спасибо! –

Смежные вопросы