名为 connect() 的函数如何阻止 MPI C 程序运行 运行?
How does function named connect() prevent MPI C program from running?
我正在为并行编程课程编写一个使用 MPI 的项目,并决定命名我的一个函数 connect()
。但是每当我尝试 mpirun
程序(在 Linux 和 OS X 上使用最新版本的 Open MPI)时,我都会收到 connect()
函数的输出,即使我没有从 main()
打电话给 connect()
;此外,main()
的一些输出不会出现。
这是一个简化的程序,存在以下问题:
#include <stdlib.h>
#include <stdio.h>
#include <mpi.h>
void connect(); //function name breaks mpi
int main(void) {
int comm_sz, my_rank;
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
printf("my_rank is %d\n", my_rank);
fflush(stdout);
MPI_Finalize();
return EXIT_SUCCESS;
}
void connect() {
printf("\nNot main! \n");
return;
}
和输出:
[me@host ~]$ mpicc bad.c -Wall
[me@host ~]$ mpirun -n 1 a.out
Not main!
--------------------------------------------------------------------------
orterun noticed that process rank 0 with PID 17245 on node host exited on signal 13 (Broken pipe).
--------------------------------------------------------------------------
一开始我正要在 Stack Overflow 上问问题出在哪里,直到我发现重命名函数可以解决问题。所以我现在很好奇的是,为什么将函数命名为 connect()
会阻止程序正确地 运行ning。 mpirun
/Open RTE 也有问题吗?
可能的线索:
<sys/socket.h>
中有一个connect()
函数,但我还没有在MPI头文件中找到它。
"ompi/mpi/cxx/intracomm.h"
中还有一个 Connect()
函数(带有大写 C),它被 <mpi.h>
间接包含,但我认为 C/C++ 中的大小写很重要, 它看起来像 C++ class. 的方法
- 如果我尝试像正常程序一样执行程序,它在 OS X 上 运行 时有效,但在 Linux 上无效:
mac:~ me$ ./a.out
my_rank is 0
对
[me@linux ~]$ ./a.out
Not main!
我猜你调用的 MPI 函数之一反过来调用了 connect()
系统调用。但是由于 ELF 可执行文件有一个用于符号的平面命名空间,所以你的 connect()
被调用了。
在Mac OS上没有出现这个问题,因为Mach-O库有一个两级命名空间,所以不同库中的符号不会相互冲突。
如果您将函数设置为静态的,那么也可能会避免该问题。
我正在为并行编程课程编写一个使用 MPI 的项目,并决定命名我的一个函数 connect()
。但是每当我尝试 mpirun
程序(在 Linux 和 OS X 上使用最新版本的 Open MPI)时,我都会收到 connect()
函数的输出,即使我没有从 main()
打电话给 connect()
;此外,main()
的一些输出不会出现。
这是一个简化的程序,存在以下问题:
#include <stdlib.h>
#include <stdio.h>
#include <mpi.h>
void connect(); //function name breaks mpi
int main(void) {
int comm_sz, my_rank;
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
printf("my_rank is %d\n", my_rank);
fflush(stdout);
MPI_Finalize();
return EXIT_SUCCESS;
}
void connect() {
printf("\nNot main! \n");
return;
}
和输出:
[me@host ~]$ mpicc bad.c -Wall
[me@host ~]$ mpirun -n 1 a.out
Not main!
--------------------------------------------------------------------------
orterun noticed that process rank 0 with PID 17245 on node host exited on signal 13 (Broken pipe).
--------------------------------------------------------------------------
一开始我正要在 Stack Overflow 上问问题出在哪里,直到我发现重命名函数可以解决问题。所以我现在很好奇的是,为什么将函数命名为 connect()
会阻止程序正确地 运行ning。 mpirun
/Open RTE 也有问题吗?
可能的线索:
<sys/socket.h>
中有一个connect()
函数,但我还没有在MPI头文件中找到它。"ompi/mpi/cxx/intracomm.h"
中还有一个Connect()
函数(带有大写 C),它被<mpi.h>
间接包含,但我认为 C/C++ 中的大小写很重要, 它看起来像 C++ class. 的方法
- 如果我尝试像正常程序一样执行程序,它在 OS X 上 运行 时有效,但在 Linux 上无效:
mac:~ me$ ./a.out
my_rank is 0
对
[me@linux ~]$ ./a.out
Not main!
我猜你调用的 MPI 函数之一反过来调用了 connect()
系统调用。但是由于 ELF 可执行文件有一个用于符号的平面命名空间,所以你的 connect()
被调用了。
在Mac OS上没有出现这个问题,因为Mach-O库有一个两级命名空间,所以不同库中的符号不会相互冲突。
如果您将函数设置为静态的,那么也可能会避免该问题。