使用 MPI 从数组中提取值时的垃圾值
Garbage values on extracting values from an array while using MPI
我正在尝试使用 MPI 进行矩阵矩阵乘法。我现在正在使用一种非常硬编码的方法。我已经在排名 0 的处理器中初始化了一个数组。我将这个数组发送到所有其他处理器,即排名 1 和排名 2 的处理器。
现在,当我尝试在临时数组中提取一些信息时,我得到了一些垃圾值。我想不通为什么。
代码如下:
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&world_size);;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
if(rank == 0){
int mat_a[9] = {1,1,1,2,2,2,3,3,3};
int mat_b[9] = {1,1,1,2,2,2,3,3,3};
for(i = 1;i<world_size;i++){
MPI_Send(&mat_a[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
//MPI_Send(&mat_b[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
}
}
if(rank!=0){
MPI_Recv(&mat_a[0],9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
//MPI_Recv(&mat_b[0],9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
}
for(i = rank;i<9;i=i+3){
temp_1[num] = mat_a[i];
num++;
}
num = 0;
/* for(i = rank;i<9;i=i*3){
temp_2[num] = mat_b[i];
num++;
}
num = 0;
*/
for(i = 0;i<3;i++){
printf("in rank %d with val at temp_1 = %d\n",rank,temp_1[i]);
}
这是我的输出:
in rank 0 with val at temp_1 = 550149432
in rank 0 with val at temp_1 = 0
in rank 0 with val at temp_1 = 4965952
in rank 1 with val at temp_1 = 1
in rank 1 with val at temp_1 = 2
in rank 2 with val at temp_1 = 1
in rank 2 with val at temp_1 = 2
in rank 2 with val at temp_1 = 3
in rank 1 with val at temp_1 = 3
Job complete
请帮忙
在等级 0 上,mat_a
初始化的范围限于条件
if(rank == 0){
int mat_a[9] = {1,1,1,2,2,2,3,3,3};
int mat_b[9] = {1,1,1,2,2,2,3,3,3};
for(i = 1;i<world_size;i++){
MPI_Send(&mat_a[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
//MPI_Send(&mat_b[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
}
}
在此范围之外,变量 mat_a
被声明为未初始化。
这就是为什么输出对于具有正秩的进程是正确的而对于具有 rank=0
的进程不正确的原因。
不幸的是,GCC 无法识别这个错误。即使明明是变量没有初始化就被使用了。
您可以在 following link 找到重现此错误的完整示例。
要以最少的更改解决此问题,您可以按如下方式进行:
if(rank == 0){
int tmp_a[9] = {1,1,1,2,2,2,3,3,3};
int tmp_b[9] = {1,1,1,2,2,2,3,3,3};
for(i=0;i<9;i++) {
mat_a[i] = tmp_a[i];
mat_b[i] = tmp_b[i];
}
for(i = 1;i<world_size;i++){
MPI_Send(&mat_a[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
//MPI_Send(&mat_b[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
}
}
我正在尝试使用 MPI 进行矩阵矩阵乘法。我现在正在使用一种非常硬编码的方法。我已经在排名 0 的处理器中初始化了一个数组。我将这个数组发送到所有其他处理器,即排名 1 和排名 2 的处理器。
现在,当我尝试在临时数组中提取一些信息时,我得到了一些垃圾值。我想不通为什么。
代码如下:
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&world_size);;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
if(rank == 0){
int mat_a[9] = {1,1,1,2,2,2,3,3,3};
int mat_b[9] = {1,1,1,2,2,2,3,3,3};
for(i = 1;i<world_size;i++){
MPI_Send(&mat_a[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
//MPI_Send(&mat_b[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
}
}
if(rank!=0){
MPI_Recv(&mat_a[0],9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
//MPI_Recv(&mat_b[0],9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
}
for(i = rank;i<9;i=i+3){
temp_1[num] = mat_a[i];
num++;
}
num = 0;
/* for(i = rank;i<9;i=i*3){
temp_2[num] = mat_b[i];
num++;
}
num = 0;
*/
for(i = 0;i<3;i++){
printf("in rank %d with val at temp_1 = %d\n",rank,temp_1[i]);
}
这是我的输出:
in rank 0 with val at temp_1 = 550149432
in rank 0 with val at temp_1 = 0
in rank 0 with val at temp_1 = 4965952
in rank 1 with val at temp_1 = 1
in rank 1 with val at temp_1 = 2
in rank 2 with val at temp_1 = 1
in rank 2 with val at temp_1 = 2
in rank 2 with val at temp_1 = 3
in rank 1 with val at temp_1 = 3
Job complete
请帮忙
在等级 0 上,mat_a
初始化的范围限于条件
if(rank == 0){
int mat_a[9] = {1,1,1,2,2,2,3,3,3};
int mat_b[9] = {1,1,1,2,2,2,3,3,3};
for(i = 1;i<world_size;i++){
MPI_Send(&mat_a[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
//MPI_Send(&mat_b[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
}
}
在此范围之外,变量 mat_a
被声明为未初始化。
这就是为什么输出对于具有正秩的进程是正确的而对于具有 rank=0
的进程不正确的原因。
不幸的是,GCC 无法识别这个错误。即使明明是变量没有初始化就被使用了。
您可以在 following link 找到重现此错误的完整示例。
要以最少的更改解决此问题,您可以按如下方式进行:
if(rank == 0){
int tmp_a[9] = {1,1,1,2,2,2,3,3,3};
int tmp_b[9] = {1,1,1,2,2,2,3,3,3};
for(i=0;i<9;i++) {
mat_a[i] = tmp_a[i];
mat_b[i] = tmp_b[i];
}
for(i = 1;i<world_size;i++){
MPI_Send(&mat_a[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
//MPI_Send(&mat_b[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
}
}