c++ - 集群仅使用 MPI 运行 7 个或更少的任务
问题描述
我终于让我的程序使用 MPI 在集群上运行,但是一旦我将它扩展到超过 7 个任务,我就会遇到分段错误。我回到下面的一个超级基本程序,我仍然得到超过 7 个核心的分段错误。为了调试,我在集群上为自己分配了 8 个核心来直接工作,而不是提交 slurm 作业。我使用英特尔编译器和 GCC 得到了这个问题。我以为它会在 8 个处理器时中断,但它是 7 个,我觉得这有点奇怪。但话又说回来,我觉得整个事情很奇怪。关于为什么代码超出一定数量的分配核心(我可能会在同一个节点上添加)的任何想法。
在集群上我使用这个: $salloc -n 8
$enable_lmod
$module 加载 icc/19 impi/19 libstdcxx/4
$mpiicpc -std=c++11 -o MPItest test.cpp
$mpiexec.hydra ./MPItest 测试
#include "mpi.h"
#include <stdio.h>
int main(int argc, char** argv)
{
int numtasks, rank, dest, source, rc, count, tag=1;
double inmsg, outmsg=20.0;
MPI_Status Stat;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0)
{
printf("Number of processors: %d \n",numtasks);
for (int i=1; i<numtasks;i++)
{
dest = i;
outmsg+=outmsg;
rc = MPI_Send(&outmsg, 1, MPI_DOUBLE, dest, tag, MPI_COMM_WORLD);
}
MPI_Barrier(MPI_COMM_WORLD);
for (int i=1; i<numtasks;i++)
{
source = i;
rc = MPI_Recv(&inmsg, 1, MPI_DOUBLE, source, tag, MPI_COMM_WORLD, &Stat);
rc = MPI_Get_count(&Stat, MPI_DOUBLE, &count);
printf("Task %d: Received %d double(s), %f, from task %d with tag %d \n",
rank, count,inmsg, Stat.MPI_SOURCE, Stat.MPI_TAG);
}
}
else
{
dest = 0;
source = 0;
rc = MPI_Recv(&inmsg, 1, MPI_DOUBLE, source, tag, MPI_COMM_WORLD, &Stat);
rc = MPI_Get_count(&Stat, MPI_DOUBLE, &count);
printf("Task %d: Received %d double(s), %f, from task %d with tag %d \n",
rank, count,inmsg, Stat.MPI_SOURCE, Stat.MPI_TAG);
rc = MPI_Send(&inmsg, 1, MPI_DOUBLE, dest, tag, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
解决方案
推荐阅读
- javascript - 多个条目的单个交叉点观察者
- c# - Blazor WebAssembly - 在浏览器关闭时处理不触发
- ruby-on-rails - 如何从 Cloudinary 文件中检索音频文件的长度等音频信息?Rails 应用程序已更新
- javascript - 容器的材质 UI 访问子项
- node.js - redis节点js模拟并在测试中获取值
- sql - 如何检查字符串是否在文本[]中?
- react-native - 测试带有“jest-expo”预设的 react-native 应用程序,在 Jest 环境被拆除后尝试导入文件
- android - 与按钮对齐的Android材质按钮图标
- python - 如何用给定的值列表和索引列表填充python中的数组?
- javascript - 反应如何在安装前检查溢出文本?