这是一个在一篇文章中回答太长的问题,但我会给你两个提示。
如果你依赖于该代码的性能不够花约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等的顺序获得),你就在家!
C写你的“inner_function”(你知道C和墨西哥,对吧?),并确保它是编译,返回正确的结果,并使用常规环路内y_idx和OpenMP在MEX文件工作外部x_idx循环的循环。如果你这样做,你通常会得到4倍的加速度! (由于4核CPU上的openMP)。无需工具箱和其他付费东西 - 默认情况下,您可以在Matlab和MEX中获得。
为“inner_function”写一个CUDA启动器。不需要商业工具箱。这是简单的部分!只需用线程和块代替“for循环”即可。 。 。 。并将其插入到您以前拥有常规功能的mex文件中。在此步骤中,预计C会比C高10倍--100倍。
按照这种方法,您将能够在每一个小步骤进行调试和验证正确性。根据我的经验,管理缓冲区指针和缓冲区大小的代码中的错字是崩溃和错误结果的主要来源。在获得错误结果方面没有任何意义!
提示2:对于某些复杂函数(如kron),如果输入和输出的大小是固定的,则可以获得寄存器级优化,线性,非迭代,非分支代码使用像Wolfram Mathematica这样的计算机代数系统。这样的代码在GPU上执行超快速。例如:Example use of Mathematica's formula optimising compiler
我想你可能已经知道这一点,但如果你想在MATLAB中调用cuda函数,[你不必再使用mex接口](http://www.mathworks.com/帮助/ distcomp /执行-CUDA的或-PTX-代码 - 上的-gpu.html)。 cuda C/C +(或PTX)函数可直接从matlab函数调用。 –
tnx的评论,但我说问题可能是执行kron,cuda内核中的渐变......我认为整个函数可以在cuda中重写,因为m和b的计算是可分的 – pyCuda