t1 = D1.*conj(H1) + D2.*conj(H2);
t2 = abs(H1).^2+abs(H2).^2 ;
上面是我的程序的matlab代码,我把上面的运算写成了一个kernel
global void t1_t2(compx *H1_d,compx *H2_d,compx *D1_d,compx D2_d,compx t1_d,double ,double t2_d,int row,int col){ int i=blockIdx.xblockDim.x+threadIdx.x; int j=blockIdx.yblockDim.y+threadIdx.y; int idx=jcol+i; if(i<row&&j<col) { compx d1 = D1_d[idx]; compx d2 = D2_d[idx]; compx h1 = H1_d[idx]; compx h2 = H2_d[idx]; compx t1; double t2;
t1.real = (d1.real * h1.real + d1.imag * h1.imag)+ d2.real * h2.real + d2.imag * h2.imag; t1.imag = (h1.real * d1.imag - d1.real * h1.imag)+ h2.real * d2.imag - d2.real * h2.imag;
t2 = (h1.real * h1.real + h1.imag * h1.imag) + (h2.real * h2.real + h2.imag * h2.imag);
t1_d[idx] = t1; t2_d[idx] = t2; }}问题如下:(1)老板让我使用cudablas库,他的理由是以后针对新的硬件架构cudablas库还会针对新硬件做更新到时候可以节省软件维护成本,而且他觉得要写出与cudablas库高效的kernel时间上不划算,我现在想知道cuda5.5 代数库的效率如何?(2)我的观点是如果用cuda代数库,计算就会失去灵活性,比如有些运算自己写的kernel可以完成几个库函数完成的功能,而且可以减少cudablas库保存中级结果的开销(cudablas库函数每次计算结果都要保存到显存,如果调用多个库函数的运算在一个kernel中完成,这样中间结果就是register中),我的观点是否正确?(3)我想针对这个计算做个测试给老板看,针对我上面matlab的计算中D1.*conj(H1) 在cudablas库中有没有,共轭点乘的函数?(我找了好像没找到)。(4)针对我上面的的kernel,有没有其他优化的办法?问题比较多,麻烦各位版主了哈?
[table=98%]
[tr=transparent][td]t1 = D1.*conj(H1) + D2.*conj(H2);
t2 = abs(H1).^2+abs(H2).^2 ;
上面是我的计算的matlab代码,我把上面的运算写成了一个kernel
global void t1_t2(compx *H1_d,compx *H2_d,compx *D1_d,compx D2_d,compx t1_d,double ,double t2_d,int row,int col)
{
int i=blockIdx.xblockDim.x+threadIdx.x;
int j=blockIdx.yblockDim.y+threadIdx.y;
int idx=jcol+i;
if(i<row&&j<col)
{
compx d1 = D1_d[idx];
compx d2 = D2_d[idx];
compx h1 = H1_d[idx];
compx h2 = H2_d[idx];
compx t1;
double t2;
t1.real = (d1.real * h1.real + d1.imag * h1.imag)+ d2.real * h2.real + d2.imag * h2.imag;
t1.imag = (h1.real * d1.imag - d1.real * h1.imag)+ h2.real * d2.imag - d2.real * h2.imag;
t2 = (h1.real * h1.real + h1.imag * h1.imag) + (h2.real * h2.real + h2.imag * h2.imag);
t1_d[idx] = t1;
t2_d[idx] = t2;
}
}
问题如下:
(1)老板让我使用cudablas库,他的理由是以后针对新的硬件架构cudablas库还会针对新硬件做更新到时候可以节省软件维护成本,而且他觉得要写出与cudablas库高效的kernel时间上不划算,我现在想知道cuda5.5 代数库的效率如何?
(2)我的观点是如果用cuda代数库,计算就会失去灵活性,比如有些运算自己写的kernel可以完成几个库函数完成的功能,而且可以减少cudablas库保存中级结果的开销(cudablas库函数每次计算结果都要保存到显存,如果调用多个库函数的运算在一个kernel中完成,这样中间结果就是register中),我的观点是否正确?
(3)我想针对这个计算做个测试给老板看,针对我上面matlab的计算中D1.*conj(H1) 在cudablas库中有没有,共轭点乘的函数?(我找了好像没找到)。
(4)针对我上面的的kernel,有没有其他优化的办法?问题比较多,麻烦各位版主了哈?[/td][/tr]
[/table]
首先感谢楼主能够重新排版。
您的此kernel, 我建议您使用cublas或者不使用均可,我的看法分别如下:
(1)不使用cublas, 自己写kernel最大的好处就是,您的计算的中间值无需单独保存一次,就地就能用了,极度方便。而且您的这个kernel, 每个线程处理很少,单独抽取出来真心没必要的。
(2)使用cublas, 自己不写kernel:这最大的好处就是让老板开心。而老板开心比什么都重要。
请您仔细斟酌这点,如果我是你,我会毫不犹豫的按照cublas处理。
感谢您的来访。
网上看到2010年的帖子说cublas效率不是特别高,不知道cuda都跟新了几代了现在的效率怎样?
cuda5.5的cublas库和cudacufft库效率现在怎么样?
cublas曾经经过一次大的改动,据其他第三方的资料说,性能已经提升上来了,很不错。
(请注意,这不代表我的观点,仅供参考)。
cublas比较适合完成那些并行度很高,计算量很大的单步运算,比如说矩阵乘法。这些计算中自己写的代码要达到库里面那些函数的水平并不容易。如果是多步简单运算似乎没有必要用库函数。