cuda - 当 MPI_FLOAT 的 count > 64 时,MPI_send 和 MPI_recv 挂起
问题描述
MPI_Send
使用and时遇到问题MPI_Recv
。当数量为 时count <= 64
,整体问题运行没有任何问题,而对于count > 64
程序则挂起。
有什么解决办法吗?该地址位于两个 GPU 上的全局内存地址上。
这是我使用的代码。当我设置n<=64
它时,它会起作用,否则它会挂起。
#include <stdio.h>
#include <string.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
char *d_msg;
int myrank, tag=99;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
const int n = 65; // <-- number of FLOATs
const int num_GPUs = 2;
cudaMalloc((void**)&d_msg, n*sizeof(float));
MPI_Send(d_msg, n, MPI_FLOAT, (myrank + 1)%num_GPUs, tag, MPI_COMM_WORLD);
MPI_Recv(d_msg, n, MPI_FLOAT, (myrank - 1 + num_GPUs)%num_GPUs, tag, MPI_COMM_WORLD, &status);
MPI_Finalize();
return 0;
}
解决方案
MPI_Send
是阻塞调用。您的进程都在MPI_Send
等待对方调用MPI_Recv
。MPI_Send
对于小消息可以是非阻塞的,这就是它适用于 <= 64 个元素的原因。
可能的解决方案是:
- 呼叫
MPI_Send
并MPI_Recv
在交流队伍中交替排列 - 采用
MPI_Sendrecv
- 使用非阻塞通信 (
MPI_Isend
/MPI_Irecv
)
这里最简单的可能只是使用MPI_Sendrecv
和替换MPI_Send
andMPI_Recv
调用
MPI_Sendrecv(d_msg, n, MPI_FLOAT, (myrank + 1)%num_GPUs, tag,
d_msg, n, MPI_FLOAT, (myrank - 1 + num_GPUs)%num_GPUs, tag, MPI_COMM_WORLD, &status);
推荐阅读
- java - 单击 RecycleView 中的图像
- mattermost - 在mattermost中更改“GitLab”登录按钮文本
- php - 显示 WooCommerce 产品变体循环的自定义简码
- laravel - 急切加载:按类别过滤 Laravel 帖子
- python - Python在匹配后用换行符替换单词
- python - 在python中读取大文件
- java - 为什么 shutdownNow() 方法能够在 Callable 对象中打破 for-loop,但在 Runnable 中却不能这样做,除非我们专门调用了 break?
- sqlalchemy - 基于自身列比较的 SQLAlchemy 过滤器
- mysql - MySQL 排序列设置为 varchar(255)
- excel - 如何从用户窗体连续写入数据到excel表vba?