gpt4 book ai didi

c - 名为 connect() 的函数如何阻止 MPI C 程序运行?

转载 作者:太空狗 更新时间:2023-10-29 14:58:48 25 4
gpt4 key购买 nike

我正在为并行编程类(class)编写一个使用 MPI 的项目,并决定将我的一个函数命名为 connect() .但每当我尝试 mpirun程序(在 Linux 和 OS X 上使用最新版本的 Open MPI),我会收到来自 connect() 的输出函数,即使我没有调用 connect()来自 main() ;此外,来自 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()阻止程序正常运行。这也可能是 mpirun 的问题吗?/打开 RTE?

可能的线索:

  • 有一个 connect()<sys/socket.h> 中发挥作用, 但我还没有在 MPI 头文件中找到它。
  • 还有一个 Connect() "ompi/mpi/cxx/intracomm.h" 中的函数(带有大写字母 C) <mpi.h> 间接包含,但我认为 C/C++ 中的大小写很重要,它看起来像 C++ 类的方法。
  • 如果我尝试像正常程序一样执行该程序,它在 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 库有一个两级命名空间,所以不同库中的符号不​​会相互冲突。

如果您将函数设置为静态的,那也可能会避免该问题。

关于c - 名为 connect() 的函数如何阻止 MPI C 程序运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30224388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com