У меня есть простая программа mpi, чтобы продемонстрировать мою проблему:
#include <stdio.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
int rank, csize;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &csize);
printf("Hello from rank[%d/%d]\n", rank, csize);
MPI_Finalize();
}
После компиляции я могу успешно запустить исполняемый файл, используя mpirun
из sbcl repl:
* (uiop:run-program '("mpirun" "-np" "10" "./hello_world") :output :string)
"Hello from rank[7/10]
Hello from rank[9/10]
Hello from rank[5/10]
Hello from rank[8/10]
Hello from rank[0/10]
Hello from rank[1/10]
Hello from rank[2/10]
Hello from rank[3/10]
Hello from rank[4/10]
Hello from rank[6/10]
"
NIL
0
Однако, когда я запускаю то же самое изнутри слизи, реплика слизи просто зависает. Если я запускаю исполняемый файл напрямую, а не через средство запуска mpirun
, то все работает нормально:
CL-USER> (uiop:run-program '("./hello_world")
:output :string)
"Hello from rank[0/1]
"
NIL
0
Я использую sbcl-1.4.5 и slime 2.20 на рабочей станции Linux. У кого-нибудь есть решение этой проблемы или отправная точка того, где искать?
UPDATE:
Проблема связана с режимом emacs comint
, на котором основана слизь. Я наблюдаю такое же поведение зависания, если запускаю sbcl
через make-comint-in-buffer
, а затем использую uiop:run-program
.
UPDATE2:
Прочитав немного в режиме comint
, я смог зафиксировать некоторые результаты процесса зависания. Этот код Emacs LISP:
(make-comint "foo" "mpirun" nil "-np" "1" "/home/ptb/programming/c/hello_world")
выдает следующую ошибку в зависшем процессе:
[warn] Epoll MOD(1) on fd 14 failed. Old events were 6; read change was 0 (none); write change was 2 (del): Bad file descriptor
[warn] Epoll MOD(4) on fd 14 failed. Old events were 6; read change was 2 (del); write change was 0 (none): Bad file descriptor
Есть идеи, что это значит?