- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
背景:我正在编写 I/O 系统调用的 MPI 版本,它基于 collfs项目。
代码在单个节点上的多个处理器上运行无误。
但是,在多个节点上运行会导致段错误...具有 2 个进程的错误消息,每个节点 1 个进程如下:
$ qsub test.sub
$ cat test.e291810
0: pasc_open(./libSDL.so, 0, 0)
1: pasc_open(./libSDL.so, 0, 0)
1: mptr[0]=0 mptr[len-1]=0
1: MPI_Bcast(mptr=eed11000, len=435104, MPI_BYTE, 0, MPI_COMM_WORLD)
0: mptr[0]=127 mptr[len-1]=0
0: MPI_Bcast(mptr=eeb11000, len=435104, MPI_BYTE, 0, MPI_COMM_WORLD)
_pmiu_daemon(SIGCHLD): [NID 00632] [c3-0c0s14n0] [Sun May 18 13:10:30 2014] PE RANK 0 exit signal Segmentation fault
[NID 00632] 2014-05-18 13:10:30 Apid 8283706: initiated application termination
The function where the error occurs is the following:
static int nextfd = BASE_FD;
#define next_fd() (nextfd++)
int pasc_open(const char *pathname, int flags, mode_t mode)
{
int rank;
int err;
if(!init)
return ((pasc_open_fp) def.open)(pathname, flags, mode);
if(MPI_Comm_rank(MPI_COMM_WORLD, &rank) != MPI_SUCCESS)
return -1;
dprintf("%d: %s(%s, %x, %x)\n", rank, __FUNCTION__, pathname, flags, mode);
/* Handle just read-only access for now. */
if(flags == O_RDONLY || flags == (O_RDONLY | O_CLOEXEC)) {
int fd, len, xlen, mptr_is_null;
void *mptr;
struct mpi_buf { int len, en; } buf;
struct file_entry *file;
if(rank == 0) {
len = -1;
fd = ((pasc_open_fp) def.open)(pathname, flags, mode);
/* Call stat to get file size and check for errors */
if(fd >= 0) {
struct stat st;
if(fstat(fd, &st) >= 0)
len = st.st_size;
else
((pasc_close_fp) def.close)(fd);
}
/* Record them */
buf.len = len;
buf.en = errno;
}
/* Propagate file size and errno */
if(MPI_Bcast(&buf, 2, MPI_INT, 0, MPI_COMM_WORLD) != MPI_SUCCESS)
return -1;
len = buf.len;
if(len < 0) {
dprintf("error opening file, len < 0");
return -1;
}
/* Get the page-aligned size */
xlen = page_extend(len);
/* `mmap` the file into memory */
if(rank == 0) {
mptr = ((pasc_mmap_fp) def.mmap)(0, xlen, PROT_READ, MAP_PRIVATE,
fd, 0);
} else {
fd = next_fd();
mptr = ((pasc_mmap_fp) def.mmap)(0, xlen, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, fd, 0);
}
((pasc_lseek_fp) def.lseek)(fd, 0, SEEK_SET);
/* Ensure success on all aux. processes */
if(rank != 0)
mptr_is_null = !mptr;
MPI_Allreduce(MPI_IN_PLACE, &mptr_is_null, 1, MPI_INT, MPI_LAND,
MPI_COMM_WORLD);
if(mptr_is_null) {
if(mptr)
((pasc_munmap_fp) def.munmap)(mptr, xlen);
dprintf("%d: error: mmap/malloc error\n", rank);
return -1;
}
dprintf("%d: mptr[0]=%d mptr[len-1]=%d\n", rank, ((char*)mptr)[0], ((char*)mptr)[len-1]);
/* Propagate file contents */
dprintf("%d: MPI_Bcast(mptr=%x, len=%d, MPI_BYTE, 0, MPI_COMM_WORLD)\n",
rank, mptr, len);
if(MPI_Bcast(mptr, len, MPI_BYTE, 0, MPI_COMM_WORLD) != MPI_SUCCESS)
return -1;
if(rank != 0)
fd = next_fd();
/* Register the file in the linked list */
file = malloc(sizeof(struct file_entry));
file->fd = fd;
file->refcnt = 1;
strncpy(file->fn, pathname, PASC_FNMAX);
file->mptr = mptr;
file->len = len;
file->xlen = xlen;
file->offset = 0;
/* Reverse stack */
file->next = open_files;
open_files = file;
return fd;
}
/* Fall back to independent access */
return ((pasc_open_fp) def.open)(pathname, flags, mode);
}
错误发生在最后的 MPI_Bcast
调用中。我不知道为什么会这样:我可以很好地取消引用它复制的内存。
我在运行 SUSE Linux x86_64 的自定义 Cray XC30 机器上使用 MPICH。
谢谢!
编辑:我尝试用 MPI_Send
/MPI_Recv
对替换 MPI_Bcast
调用,结果是一样的。
最佳答案
出于性能原因,Cray MPI 实现可能有一些神奇之处。在不了解内部结构的情况下,大部分答案都是猜测。
节点间通信可能不使用网络堆栈,依赖于某种共享内存通信。当您尝试通过网络堆栈发送 mmap
-ed 缓冲区时,某处出现问题 - DMA 引擎(我在这里疯狂猜测)无法处理这种情况。
您可以尝试对 mmaped 缓冲区进行页锁定 - 也许 mlock
可以正常工作。如果失败,则继续将数据复制到 malloc
ed 缓冲区中。
关于c - 多个节点上的 MPI_Bcast 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23722165/
所以我有一些代码,我使用 MPI_Bcast 将信息从根节点发送到所有节点,但我想让我的 P0 将数组块发送到各个进程。 如何使用 MPI_Send 和 MPI_Receive 执行此操作? 我以前从
我正在尝试在二维数组中广播我的第一行。这是代码: double *chunkPtr = malloc(sizeof(double) * columns); if (rank == 0) { c
我正在尝试 MPI,当我在命令行上通过 mpirun 运行它时,我不断收到此错误。 ----------------------------------------------------------
我按照 Jonathan 的代码从这里 ( MPI_Bcast a dynamic 2d array ) 到 MPI_Bcast 动态分配的二维结构数组。结构如下: typedef struct {
我试图让每个进程都以这种方式广播到所有其余进程 #include "mpi.h" #include int main(argc,argv) int argc; char **argv; { in
我收到 MPI_Bcast 错误(我认为这是一个旧错误)我不确定为什么会这样。错误如下: An error occurred in MPI_Bcast on communicator MPI_C
我在使用 MPI_Bcast 时遇到问题。一个处理器初始化类,然后必须将其发送给其他处理器。这是我的课: class A{ private: unsigned rows, cols; std::vec
我正在使用 MPI 并行乘以两个矩阵(二维数组),方法是将行平均划分并将它们分散在子进程中。主人也处理一大块行。我了解如何执行此操作并使用 MPI_Send/MPI_Recv 成功完成,但现在我正在尝
我试图在一台计算机上输入一个数字,然后使用 MPI 将其广播到所有其他计算机。 #include #include #include "mpi.h" int main (int argc, cha
这个问题在这里已经有了答案: Using MPI_Bcast for MPI communication (2 个答案) 关闭 7 年前。 我使用 MPI_Bcast 函数编写了简单的 MPI 程序
我有以下问题,我正在尝试发送 2 种类型的数据,1 种 int 和 2 种字符,这是我程序的一部分 #define Send(send_data, count, type, dest, tag) MP
我是 Open MPI 的新手,我正在尝试使用它来运行一个使用字典攻击的强力密码破解器(我实际上并不是在破解密码,这只是一个练习)。我使用的字典是 vector其中单词由空终止符分隔。 使用 MPI_
我正在尝试将带有 bcast 的动态二维数组传递给所有级别。我有以下代码。 #include #include int main(int argc, char **argv) { fl
我正在广播一个指向数组的指针 MPI_Bcast(&xd_sim_send, Nooflines_Sim, MPI_FLOAT, root, MPI_COMM_WORLD); 来自进程 0 并从 0
为什么这段mpi代码没有发生死锁? int main(int argc, char *argv[]) { int rank,size; MPI_Init(&argc,
调用 MPI_BCAST 时,是否有隐含的同步?例如,如果发送方进程要在其他人之前到达 MPI_BCAST,它是否可以执行 BCAST,然后在没有任何确认的情况下继续?最近的一些测试代码如下: pro
MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm) 此函数不需要等级参数。它如
我知道这段代码是正确的 #include #include "mpi.h" int main(int argc, char * argv[]){ int my_rank, p, n;
是 MPI_Bcast()阻塞还是非阻塞?换句话说,当根发送数据时,是否所有处理器都阻塞,直到每个处理器都收到该数据?如果没有,如何同步(阻止)所有这些,以便在所有接收到相同数据之前没有人继续。 最佳
我正在尝试 MPI_Bcast 将消息广播到多个节点,但遇到段错误,有时错误:139 或错误:255。以下是我的代码: char proposal[20]; char rep; int size, r
我是一名优秀的程序员,十分优秀!