Slime\Emacs comint 在启动 mpi 进程时挂起
Slime\Emacs comint hangs when launching mpi process
我有一个简单的 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
但是,当我 运行 从 slime 中执行相同操作时,slime repl 就会挂起。如果我直接 运行 可执行文件,而不是通过 mpirun
启动器,那么一切都 运行 没问题:
CL-USER> (uiop:run-program '("./hello_world")
:output :string)
"Hello from rank[0/1]
"
NIL
0
我在 linux 工作站上使用 sbcl-1.4.5 和 slime 2.20。有没有人知道这个问题的解决方案或从哪里开始寻找?
更新:
问题源于 emacs comint
模式,这是 slime 的基础。如果我通过 make-comint-in-buffer
启动 sbcl
然后使用 uiop:run-program
.
,我会观察到相同的挂起行为
更新 2:
在阅读了一些关于 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
知道这意味着什么吗?
估计是openmpi或者libevent中redirected stdin/stdout的问题(以前有过这样的问题,例如bugzilla.redhat.com/show_bug.cgi?id= 1235044)。您使用哪个版本?
我有一个简单的 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
但是,当我 运行 从 slime 中执行相同操作时,slime repl 就会挂起。如果我直接 运行 可执行文件,而不是通过 mpirun
启动器,那么一切都 运行 没问题:
CL-USER> (uiop:run-program '("./hello_world")
:output :string)
"Hello from rank[0/1]
"
NIL
0
我在 linux 工作站上使用 sbcl-1.4.5 和 slime 2.20。有没有人知道这个问题的解决方案或从哪里开始寻找?
更新:
问题源于 emacs comint
模式,这是 slime 的基础。如果我通过 make-comint-in-buffer
启动 sbcl
然后使用 uiop:run-program
.
更新 2:
在阅读了一些关于 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
知道这意味着什么吗?
估计是openmpi或者libevent中redirected stdin/stdout的问题(以前有过这样的问题,例如bugzilla.redhat.com/show_bug.cgi?id= 1235044)。您使用哪个版本?