SMP矩阵乘法

矩阵乘法的并行化基本都是用加农算法,但是在共享内存的情况下,我觉得加农并没有优势。

加农保证了在每个变量全局单副本的情况下,并行度的提升。在共享内存时,没有变量复制的成本,所以直接使用带状划分可以避免迭代中间的barrier开销,提高效率。

SMP下实现矩阵乘法

#include "stdafx.h"
#include "matrixOperation.h"
#include <omp.h>

int _tmain(int argc, _TCHAR* argv[])
{
	const int size=5000;
	double **a,**b,**c;
	a=new double*[size];
	b=new double*[size];
	c=new double*[size];
	for(int i=0;i<size;++i)
	{
		a[i]=new double[size];
		b[i]=new double[size];
		c[i]=new double[size];
	}
	cout<<"mem set"<<endl;
	//read file
	cout<<readMatrix("matrix",a,size)<<endl;
	cout<<readMatrix("matrix",b,size)<<endl;
	cout<<compareMatrix(a,b,size)<<endl;
	//for more cache hits 
	//transposition b and place data needed in one cache block
	matrixTransposition(b,size);
	cout<<"data prepared"<<endl<<"calculating"<<endl;
	long start=time(0);
//	omp_set_nested(true);
	#pragma omp parallel for num_threads(16) schedule(dynamic)
	for(int i=0;i<size;++i)
	{
//		#pragma omp parallel for firstprivate(i) num_threads(4)
		for(int j=0;j<size;++j)
		{
			c[i][j]=0;
			for(int k=0;k<size;++k)
			{
				c[i][j]+=a[i][k]*b[j][k];//different from the original formulation
			}
		}
		cout<<".";
	}
	long end=time(0);
	cout<<end-start<<" seconds"<<endl;
	writeMatrix("out",c,size);
	for(int i=0;i<size;++i)
	{
		delete[] a[i];
		delete[] b[i];
		delete[] c[i];
	}
	delete[] a;
	delete[] b;
	delete[] c;
	cin>>start;
	return 0;
}

i7 2600处理器,5000*5000的矩阵相乘上面的参数效果较好,纯计算时间在126秒左右。

matrixOperation头文件见另一个文章:http://blog.csdn.net/pouloghost/article/details/8746913

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值