现在来寻找将GPU用于自行编写的MATLAB函数的方法。可以采用arrayfun函数,在GPU上运行自行编写的MATLAB代码。arrayfun通过元素操作将自行编写的函数用于每个数据元素。实际上,arrayfun函数不是GPU专用函数,而是GPU支持函数。因此,可以在5.2节MATLAB并行计算工具箱中的GPU支持函数列表内找到arrayfun函数。
使用arrayfun意味着给并行的GPU运算做了单独的调用,这个调用执行了全部的运算,而不是为各个分离的GPU最优运算产生很多个调用。对于存储在GPU存储器上的gpuArray数据,自行编写的MATLAB函数通过arrayfun可以在GPU上执行,并且将输出存在GPU存储器中。
可采用如下形式使用Arrayfun:
其中,arg1和arg2是myFunction的输入实参,这些输入实参应为用于GPU处理的gpuArray数据。myFunction应为标量(也就是按元素计算)运算,因此不支持向量和矩阵计算。myFunction的输出是result,也同样存储在GPU存储器中。
让我们看看下面这个简单的例子:(www.xing528.com)
代码myFunc.m有4个输入实参(a,b,c,d),均通过test_arrayfun.m中的gpuArray存储在GPU存储器上。非内置函数myFunc.m只由标量运算构成,标量运算可以在GPU内很容易地实现并行化。通过test_arrayfun.m中的arrayfun函数,我们实现了在GPU上运行myFunc函数。
尽管arrayfun的输入函数只能进行元素级运算,但是这并不意味着只允许进行简单运算。反而,通过arrayfun,输入函数可以在GPU上进行任意标量运算和流程控制(例如for-loop、while-loop、break、if等):
然而,需要矩阵元素索引的正则矩阵和向量运算无法通过arrayfun在GPU上运行。
由于myFunc2.m中的矩阵索引运算(matrix indexing operation)test_arrayfun2.m将导致如下错误信息:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。