通信器上的 MPI 分散错误 MPI_COMM_WORLD
MPI Scatter error on communicator MPI_COMM_WORLD
由于我无法修复的 MPI 分散错误,以下代码在运行时失败。在查看文档和其他类似错误页面时,我没有发现任何问题。请帮忙。我正在使用 openmpi/4.0.5-gcc.
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#define UPPER_LIMIT 4
#define master 0
int main(int argc, char *argv[])
{
int *data;
int process_id, total_process, temp_result;
int i, tag, final_result;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &process_id);
MPI_Comm_size(MPI_COMM_WORLD, &total_process);
MPI_Status status;
if ( total_process > UPPER_LIMIT )
{
if ( process_id == 0 )
printf("max allowed processes limit [%d] exceeded.\n", UPPER_LIMIT);
exit(0);
}
final_result = 0;
for ( i = 0; i < total_process; i++){
data[i] = (int)i;
}
int j;
for(j = 0; j < total_process; j++) {
printf("%d ", data[j]);
if(j==total_process-1)
printf("*** %d\n", process_id);
}
MPI_Scatter(data, total_process, MPI_INT, &temp_result, 1, MPI_INT, 0, MPI_COMM_WORLD);
if(process_id!=master){
temp_result = temp_result/process_id;
MPI_Reduce(&temp_result, &final_result, 1, MPI_INT, MPI_SUM, 1, MPI_COMM_WORLD);
}
if(final_result>0){
tag = process_id;
MPI_Send(&final_result, 1, MPI_INT, 0, tag, MPI_COMM_WORLD);
}
if(process_id==master){
MPI_Recv(&final_result, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
}
MPI_Finalize();
return 0;
}
错误日志
0 1 2 3 *** 0
0 1 2 3 *** 1
0 1 2 3 *** 2
0 1 2 3 *** 3
*** An error occurred in MPI_Scatter
*** reported by process [1855324161,0]
*** on communicator MPI_COMM_WORLD
*** MPI_ERR_TRUNCATE: message truncated
*** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
*** and potentially your MPI job)
MPI_Scatter 文档
MPI_Scatter
将数据从一个进程发送到通信器中的所有其他进程
剧情简介
int MPI_Scatter(const void *sendbuf, int sendcount, MPI_Datatype 发送类型,
void *recvbuf, int recvcount, MPI_Datatype recvtype, int root,
MPI_Comm通讯)
输入参数
sendbuf - 发送缓冲区的地址(选择,只在root处有意义)
sendcount - 发送到每个进程的元素数(整数,仅在根处有效)
sendtype - 发送缓冲区元素的数据类型(仅在根处有意义)(句柄)
recvcount - 接收缓冲区中的元素数(整数)
recvtype - 接收缓冲区元素(句柄)的数据类型
root - 发送进程的排名(整数)
comm - 通讯器(句柄)
输出参数
recvbuf - 接收缓冲区的地址(选择)
更新
将 MPI_Scatter 发送计数更新为 1 后,上述错误消失,但程序保持理想状态,它没有打印 MPI_Scatter 行之后的任何内容。
MPI_Scatter(data, 1, MPI_INT, &temp_result, 1, MPI_INT, 0, MPI_COMM_WORLD);
解决方案:
MPI_Reduce
需要被所有处理器调用。因此,从条件块中删除它解决了这个问题。
你引用相关行:“sendcount - 发送到每个进程的元素数(整数)”。所以如果你向每个进程发送 1 个元素,你需要将 sendcount 设置为 1,而不是 total_process
.
由于我无法修复的 MPI 分散错误,以下代码在运行时失败。在查看文档和其他类似错误页面时,我没有发现任何问题。请帮忙。我正在使用 openmpi/4.0.5-gcc.
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#define UPPER_LIMIT 4
#define master 0
int main(int argc, char *argv[])
{
int *data;
int process_id, total_process, temp_result;
int i, tag, final_result;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &process_id);
MPI_Comm_size(MPI_COMM_WORLD, &total_process);
MPI_Status status;
if ( total_process > UPPER_LIMIT )
{
if ( process_id == 0 )
printf("max allowed processes limit [%d] exceeded.\n", UPPER_LIMIT);
exit(0);
}
final_result = 0;
for ( i = 0; i < total_process; i++){
data[i] = (int)i;
}
int j;
for(j = 0; j < total_process; j++) {
printf("%d ", data[j]);
if(j==total_process-1)
printf("*** %d\n", process_id);
}
MPI_Scatter(data, total_process, MPI_INT, &temp_result, 1, MPI_INT, 0, MPI_COMM_WORLD);
if(process_id!=master){
temp_result = temp_result/process_id;
MPI_Reduce(&temp_result, &final_result, 1, MPI_INT, MPI_SUM, 1, MPI_COMM_WORLD);
}
if(final_result>0){
tag = process_id;
MPI_Send(&final_result, 1, MPI_INT, 0, tag, MPI_COMM_WORLD);
}
if(process_id==master){
MPI_Recv(&final_result, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
}
MPI_Finalize();
return 0;
}
错误日志
0 1 2 3 *** 0
0 1 2 3 *** 1
0 1 2 3 *** 2
0 1 2 3 *** 3
*** An error occurred in MPI_Scatter
*** reported by process [1855324161,0]
*** on communicator MPI_COMM_WORLD
*** MPI_ERR_TRUNCATE: message truncated
*** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
*** and potentially your MPI job)
MPI_Scatter 文档
MPI_Scatter 将数据从一个进程发送到通信器中的所有其他进程
剧情简介 int MPI_Scatter(const void *sendbuf, int sendcount, MPI_Datatype 发送类型, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm通讯)
输入参数
sendbuf - 发送缓冲区的地址(选择,只在root处有意义)
sendcount - 发送到每个进程的元素数(整数,仅在根处有效)
sendtype - 发送缓冲区元素的数据类型(仅在根处有意义)(句柄)
recvcount - 接收缓冲区中的元素数(整数)
recvtype - 接收缓冲区元素(句柄)的数据类型
root - 发送进程的排名(整数)
comm - 通讯器(句柄)
输出参数
recvbuf - 接收缓冲区的地址(选择)
更新
将 MPI_Scatter 发送计数更新为 1 后,上述错误消失,但程序保持理想状态,它没有打印 MPI_Scatter 行之后的任何内容。
MPI_Scatter(data, 1, MPI_INT, &temp_result, 1, MPI_INT, 0, MPI_COMM_WORLD);
解决方案:
MPI_Reduce
需要被所有处理器调用。因此,从条件块中删除它解决了这个问题。
你引用相关行:“sendcount - 发送到每个进程的元素数(整数)”。所以如果你向每个进程发送 1 个元素,你需要将 sendcount 设置为 1,而不是 total_process
.