2012-10-21 51 views
1

我异型我的MATLAB代码,以确定最耗时的功能,他们大多是gradientKron MATLAB功能in this file,以便将它们写入CUDA内核然后PTX他们从MATLAB叫他们FN键CUDA。任何想法或文章将good.also的b的calcution似乎是可分离让他们很好的候选人被分配到不同的块,这里是代码from the fileMATLAB使用PTX或nvmex

i2w=g0*aff(i2,a0); 
[ix,iy]=grad(i2w); 

ix=ix.*region;iy=iy.*region; 
ix2=ix.^2;iy2=iy.^2;ixiy=ix.*iy; 
it=i1-i2w; 

m1=sum(sum(kron(ones(1,limy)',(1-centx:limx-centx).^2).*ix2)); 
m2=sum(sum(kron((1-centy:limy-centy)',(1-centx:limx-centx)).*ix2)); 

PS的扣:我最近读了约NVMEX左右我们将不胜感激这种代码的一些帮助 - 先前提到过 - 。

+1

我想你可能已经知道这一点,但如果你想在MATLAB中调用cuda函数,[你不必再使用mex接口](http://www.mathworks.com/帮助/ distcomp /执行-CUDA的或-PTX-代码 - 上的-gpu.html)。 cuda C/C +(或PTX)函数可直接从matlab函数调用。 –

+0

tnx的评论,但我说问题可能是执行kron,cuda内核中的渐变......我认为整个函数可以在cuda中重写,因为m和b的计算是可分的 – pyCuda

回答

1

这是一个在一篇文章中回答太长的问题,但我会给你两个提示。

如果你依赖于该代码的性能不够花约2星期,以书面和测试CUDA代码,让我告诉你关于我的方法来加速Matlab代码:

提示1:

首先以这种方式重新编写函数(在matlab中),它只使用循环,存储器访问以及可以在CUDA手册中找到的基本函数,如添加,乘法等。 -matlab-code

function result_array = MyFunctionToParallelise(constants,source_arrays) 
    for x_idx=xcoords 
    for y_idx=ycoords 
     local_result=inner_function(x_idx,y_idx,constants,source_arrays(x_idx,y_idx)); 
     store(local_result to result_array(x_idx,y_idx)); 
    end 
    end 

如果你这样做,你的“inner_function”是可并行化的(独立于其他local_results,并且可以按照x_idx,y_idx等的顺序获得),你就在家!

  1. C写你的“inner_function”(你知道C和墨西哥,对吧?),并确保它是编译,返回正确的结果,并使用常规环路内y_idx和OpenMP在MEX文件工作外部x_idx循环的循环。如果你这样做,你通常会得到4倍的加速度! (由于4核CPU上的openMP)。无需工具箱和其他付费东西 - 默认情况下,您可以在Matlab和MEX中获得。

  2. 为“inner_function”写一个CUDA启动器。不需要商业工具箱。这是简单的部分!只需用线程和块代替“for循环”即可。 。 。 。并将其插入到您以前拥有常规功能的mex文件中。在此步骤中,预计C会比C高10倍--100倍。

按照这种方法,您将能够在每一个小步骤进行调试和验证正确性。根据我的经验,管理缓冲区指针和缓冲区大小的代码中的错字是崩溃和错误结果的主要来源。在获得错误结果方面没有任何意义!

提示2:对于某些复杂函数(如kron),如果输入和输出的大小是固定的,则可以获得寄存器级优化,线性,非迭代,非分支代码使用像Wolfram Mathematica这样的计算机代数系统。这样的代码在GPU上执行超快速。例如:Example use of Mathematica's formula optimising compiler

+0

你是如此有用这样的想法,我希望我敦请求更多,如果我希望你看到我现在站在[解决问题](http://stackoverflow.com/questions/13249520/parallel-kronecker-tensor-product-on- GPU-使用-CUDA) – pyCuda