这个写了很长时间了,但是一直没有顾上额。把这个版本稍微修改一下,只需要加上一个指令,我们就可以得到不错的效率奥。
看代码吧:
// 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
这样,我们只是加入了几个指导语句,剩下的事是编译器帮我们做的奥,你原先的测试程序并不需要任何改变奥。
我之前讲过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*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
这样a和b两个矩阵就可只是传输到gpu上,而c传到gpu,计算结束后会倍传回来。
在copy()中,a[0:m*n],表示从第0个元素一共计算m*n个元素,第一个是起始位置,第二个量表示数据长度。
大家把代码拷贝走,去试试吧!!!
