MPICH2 bcast广播函数使用
来源:互联网 发布:代码高亮 源码 编辑:程序博客网 时间:2024/05/22 21:39
代码文件:test5.c
#include "mpi.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
int rank,size,i;
int *arr = NULL;
int len = 6;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
arr = (int*)malloc(len*sizeof(int));
memset(arr, 0, sizeof(int)*len);
if(rank == 0)
{
for(i = 0; i < len; i++)
arr[i] = i + 1;
}
MPI_Bcast(arr, len, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
if(rank != 0)
{
printf("In process %d...\n", rank);
for(i = 0; i < len; i++)
printf("arr[%d]=%d\t", i, arr[i]);
}
free(arr);
MPI_Finalize();
return 0;
}
1)在语义上,可以认为MPI_Bcast是一个“多次发送”的过程,这是没有错误的,但在语法上,不可以将MPI_Bcast等同为多个MPI_Send语句,因此,在MPI程序中,就不能用MPI_Recv去和MPI_Bcast相匹配。
2)MPI_Bcast是组操作,在每一个进程中都必须有相应的MPI_Bcast语句,而不是MPI_Recv语句。
3)由上面的程序,可以看出MPI_Bcast函数处于所有进程的执行流程中。且对于所有进程来说,广播进程(0进程)和其他进程之间的发送/接收缓冲区名字是一致的,如本程序中都是arr,看过的其他程序中也仍然存在这种一致性,这也许是MPI中对MPI_Bcast的一种约定俗成?
带着3)中的疑问,我们不妨将程序test5.c中对数组arr分配内存的部分放到主进程(0进程)中,即:
if(rank == 0)
{
arr = (int*)malloc(len*sizeof(int));
memset(arr, 0, sizeof(int)*len);
for(i = 0; i < len; i++)
arr[i] = i + 1;
}
然后编译,运行程序,启动两个进程,然后输出的运行结果为:
=====================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: 11
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
=====================================================================================
APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
程序运行错误,错误字串为:Segmentation fault(根据经验,这是引用了未分配的内存所造成的)
因为,将对数组arr内存分配的代码放到主进程(0进程)中后,从进程将无法对arr分配内存,而又要执行MPI_Bcast函数接收主进程发送过来的数据而引用未分配的内存空间,所以产生Segmentation fault错误
#include "mpi.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
int rank,size,i;
int *arr = NULL;
int len = 6;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
arr = (int*)malloc(len*sizeof(int));
memset(arr, 0, sizeof(int)*len);
if(rank == 0)
{
for(i = 0; i < len; i++)
arr[i] = i + 1;
}
MPI_Bcast(arr, len, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
if(rank != 0)
{
printf("In process %d...\n", rank);
for(i = 0; i < len; i++)
printf("arr[%d]=%d\t", i, arr[i]);
}
free(arr);
MPI_Finalize();
return 0;
}
1)在语义上,可以认为MPI_Bcast是一个“多次发送”的过程,这是没有错误的,但在语法上,不可以将MPI_Bcast等同为多个MPI_Send语句,因此,在MPI程序中,就不能用MPI_Recv去和MPI_Bcast相匹配。
2)MPI_Bcast是组操作,在每一个进程中都必须有相应的MPI_Bcast语句,而不是MPI_Recv语句。
3)由上面的程序,可以看出MPI_Bcast函数处于所有进程的执行流程中。且对于所有进程来说,广播进程(0进程)和其他进程之间的发送/接收缓冲区名字是一致的,如本程序中都是arr,看过的其他程序中也仍然存在这种一致性,这也许是MPI中对MPI_Bcast的一种约定俗成?
带着3)中的疑问,我们不妨将程序test5.c中对数组arr分配内存的部分放到主进程(0进程)中,即:
if(rank == 0)
{
arr = (int*)malloc(len*sizeof(int));
memset(arr, 0, sizeof(int)*len);
for(i = 0; i < len; i++)
arr[i] = i + 1;
}
然后编译,运行程序,启动两个进程,然后输出的运行结果为:
=====================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: 11
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
=====================================================================================
APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
程序运行错误,错误字串为:Segmentation fault(根据经验,这是引用了未分配的内存所造成的)
因为,将对数组arr内存分配的代码放到主进程(0进程)中后,从进程将无法对arr分配内存,而又要执行MPI_Bcast函数接收主进程发送过来的数据而引用未分配的内存空间,所以产生Segmentation fault错误
0 0
- MPICH2 bcast广播函数使用
- MPICH2
- MPI中的Bcast, Reduce和Gather使用举例
- 资料收集帖(MPICH2安装使用)
- 使用mpich2配置linux服务器集群
- 使用源码安装MPICH2-1.4.1
- inet addr、bcast、mask
- inet addr、bcast、mask
- 广播使用
- mpich2安装
- Broadcast广播的使用
- android 广播的使用
- 广播的使用步骤
- 使用UDP广播
- android广播使用注意
- android 广播的使用
- android 广播的使用
- 使用广播接收器
- YTU 2844: 改错题A-看电影
- Generative Modeling of Convolutional Neural Networks
- Spark优化一则 - 减少Shuffle
- Android 自己自定义监听模式套路
- Myeclipse使用html模板
- MPICH2 bcast广播函数使用
- Invalid bound statement (not found)
- 2016-01-26部署openfire踩坑汇总
- mac cocoa中注册全局快捷键
- Android Studio 无法识别Genymotion插件的解决方法
- C++下std::pair的使用?
- java反射详解
- ACAccountCredential
- 看的一些有用常用的东西,收藏一下