自己实现的水版MPI_Bcast(使用binomial tree,跟mpich2实现思路一样)

二项树见http://hi.baidu.com/isswangqing/item/8e0908273e773d54c38d59bc非常适合bcast这个过程,因为没有额外的通信开销,集合的增加通信并行度。之前想到的,实现完了发现mpi也用了这个,而且还有其他的方法。过两天分析一下源码。

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>

int mpiSize, mpiRank;

void bcast (void *data, int size)
{
	void * p = data;
	int start = 0;
	int end = mpiSize - 1;
	while (1)
	{
		if (start == end)
		{
			break;
		}
		int mid = (start + end + 1) / 2;
		if (mpiRank >= start && mpiRank <= mid - 1)// front half
		{
			if (start == mpiRank)
			{
				MPI_Send (data, size, MPI_BYTE, mid, 0, MPI_COMM_WORLD);//data start to mid size mid - start
			}
			end = mid - 1;
		}
		else if (mpiRank >= mid && mpiRank <= end)
		{
			if (mpiRank == mid)
			{
				MPI_Status s;
				MPI_Recv(data, size, MPI_BYTE, start, 0, MPI_COMM_WORLD, &s);//receive from start
			}
			start = mid;
//			p = p + mid - start;
//			printf ("%c \n",((char*) p)[0]);
		}
		
	}

}
void main (int argc, char **argv)
{
	MPI_Init (&argc, &argv);
	MPI_Comm_size (MPI_COMM_WORLD, &mpiSize);
	MPI_Comm_rank (MPI_COMM_WORLD, &mpiRank);

	char *data = (char *) malloc (mpiSize);
	if (0 == mpiRank)
	{
		for (int i = 0; i < mpiSize; ++i)
		{
			data[i] = 'a' + i;
		}
	}

	bcast (data, mpiSize);

	printf("%d : %s \n", mpiRank, data); 

	free (data);
	MPI_Finalize ();
	return;
}


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值