• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

一步步做程序优化【2】OpenACC指令

mysql 搞代码 4年前 (2022-01-09) 14次浏览 已收录 0个评论

这个写了很长时间了,但是一直没有顾上额。把这个版本稍微修改一下,只需要加上一个指令,我们就可以得到不错的效率奥。 看代码吧: // C = alpha*A*B + beta*Cvoid mySgemm(int m, int n, int k, float alpha, float beta,\ float *A, float *B, float *C){

这个写了很长时间了,但是一直没有顾上额。把这个版本稍微修改一下,只需要加上一个指令,我们就可以得到不错的效率奥。

看代码吧:

// C = alpha*A*B + beta*Cvoid mySgemm(int m, int n, int k, float alpha, float beta,\			 float *A,  float *B, float *C){	int i, j, l;	float ab;#pragma acc kernels copy(A[0:m*n],B[0:m*n],C[0:m*n])#pragma acc loop independent	for(j = 0; j < m; j++) 	{#pragma acc loop independent		for(i = 0 ;i < k ;i++)		{			ab = 0.0f;			for(l = 0 ;l < n ;l++)			{				ab += A[j*n+l] * B[l*k+i];			}			C[j*k+i] = alpha*ab + beta*C[j*k+i];		}	}}

这样,我们只是加入了几个指导语句,剩下的事是编译器帮我们做的奥,你原先的测本文来源gao@daima#com搞(%代@#码@网&试程序并不需要任何改变奥。

我之前讲过HMPP编译器的安装和使用,http://blog.gaodaima.com/bendanban/article/details/7662583大家可以使用HMPP编译器编译这段代码,在Linux下(安装好CUDA,HMPP之后)我们可以使用一下命令编译:

$hmpp –codelet-required gcc your_program.c

执行一下,你会发现速度相当的快了(你要有支持CUDA的显卡才行奥)

大家可以写一个测试程序来调用这个函数,随便你用什么编译器,只要你可以在你的测试程序里找到本文中提供的程序,你完全可以使用高效的函数奥。

为了得到更高的效率,我修改一下这个代码:

// C = alpha*A*B + beta*Cvoid mySgemm(int m, int n, int k, float alpha, float beta,\			 float *A,  float *B, float *C){	int i, j, l;	float ab;#pragma acc kernels copyin(A[0:m*n],B[0:m*n]) copy(C[0:m*n])#pragma acc loop independent	for(j = 0; j < m; j++) 	{#pragma acc loop independent		for(i = 0 ;i < k ;i++)		{			ab = 0.0f;			for(l = 0 ;l < n ;l++)			{				ab += A[j*n+l] * B[l*k+i];			}			C[j*k+i] = alpha*ab + beta*C[j*k+i];		}	}}

这样A和B两个矩阵就可只是传输到GPU上,而C传到GPU,计算结束后会倍传回来。

在copy()中,A[0:m*n],表示从第0个元素一共计算m*n个元素,第一个是起始位置,第二个量表示数据长度。

大家把代码拷贝走,去试试吧!!!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:一步步做程序优化【2】OpenACC指令

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址