一步步做程序优化【2】OpenACC指令
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了一步步做程序优化【2】OpenACC指令,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2032字,纯文字阅读大概需要3分钟。
内容图文
这个写了很长时间了,但是一直没有顾上额。把这个版本稍微修改一下,只需要加上一个指令,我们就可以得到不错的效率奥。 看代码吧: // 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*C void 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]; } } }
这样,我们只是加入了几个指导语句,剩下的事是编译器帮我们做的奥,你原先的测试程序并不需要任何改变奥。
我之前讲过HMPP编译器的安装和使用,http://blog.csdn.net/bendanban/article/details/7662583大家可以使用HMPP编译器编译这段代码,在Linux下(安装好CUDA,HMPP之后)我们可以使用一下命令编译:
$hmpp --codelet-required gcc your_program.c
执行一下,你会发现速度相当的快了(你要有支持CUDA的显卡才行奥)
大家可以写一个测试程序来调用这个函数,随便你用什么编译器,只要你可以在你的测试程序里找到本文中提供的程序,你完全可以使用高效的函数奥。
为了得到更高的效率,我修改一下这个代码:
// C = alpha*A*B + beta*C void 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个元素,第一个是起始位置,第二个量表示数据长度。
大家把代码拷贝走,去试试吧!!!
内容总结
以上是互联网集市为您收集整理的一步步做程序优化【2】OpenACC指令全部内容,希望文章能够帮你解决一步步做程序优化【2】OpenACC指令所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。