主要内容

提高基于元素的MATLAB函数在GPU上的性能arrayfun

这个例子展示了如何通过在GPU上运行MATLAB®函数来提高代码的性能arrayfun

当MATLAB函数包含许多元素操作时,使用arrayfun可以提供比直接在GPU上执行MATLAB函数更好的性能gpuArray输入数据。与之兼容的函数arrayfun它必须能够操作输入数组的单个元素,以使用标量运算和算术计算输出数组的单个元素。

在这个例子中,您比较了一个函数在CPU上执行的时间,在GPU上执行的时间arrayfun,以及使用的GPUarrayfun

定义测试函数

根据狭义相对论的原理,洛伦兹因子决定了一个物体在运动时的物理性质如何变化。对于以一定速度运动的物体 v 相对于观察者,洛伦兹因子 γ 定义为

γ 1 1 - v 2 c 2 1 1 - β 2

β v c ,在那里 c 就是真空中的光速。的洛伦兹函数,定义在示例的最后,计算洛伦兹因子如下。

Y = 1./√(1-B.*B);

为GPU执行准备函数

大多数MATLAB函数默认在CPU上执行。执行洛伦兹在GPU上,提供一个gpuArray对象作为输入。gpuArray对象表示存储在GPU内存中的数组。因为很多函数都支持万博1manbetxgpuArray输入,你通常可以在GPU上运行你的代码,而对代码的修改很少。欲了解更多信息,在图形处理器上运行MATLAB函数

因为洛伦兹包含单独的元素操作,在GPU上一次执行每个操作不会产生显著的性能提升。中的所有操作都可以提高性能洛伦兹立即使用arrayfun

运行洛伦兹函数在GPU上使用arrayfun,定义函数的句柄。

lorentzFcn = @lorentz;

设置对比参数

类的执行时间进行比较洛伦兹函数对包含 10 4 10 8 5 元素。设置要运行的比较次数,以及要传递给函数的数组大小的上限和下限。

numComp = 15;lowerLimit = 4;upperLimit = 8.5;

指定要作为对数间隔数组传递给函数的数组的大小。这个示例可能需要几分钟才能运行。为了减少执行时间,可以减小数组大小的上限。

arraySize = ceil(logspace(lowerLimit,upperLimit,numComp));

CPU和GPU的时间执行

为不同的执行模式计时:

  1. 生成随机的、单精度的不断增大的输入数据。

  2. 时间多长洛伦兹在CPU上执行时间

  3. 将输入数据发送给GPU使用gpuArray

  4. Time执行的持续时间洛伦兹在GPU上使用gputimeit

  5. Time执行的持续时间洛伦兹在GPU上使用arrayfun使用gputimeit

i = 1:numComp fprintf('大小为%d \n的输入数组的定时函数'arraySize(我));创建随机输入数据data = rand(arraySize(i),1,“单身”);CPU执行百分比tcpu(i) = timeit(@() lorentzFcn(data));%向GPU发送数据gdata = gpuArray(data);% GPU执行仅使用gpuArray对象tgpuObject(i) = gputimeit(@() lorentzFcn(gdata));% GPU执行使用gpuArray对象和arrayfuntgpuArrayfun(i) = gputimeit(@() arrayfun(lorentzFcn,gdata));结束
时间函数输入数组的大小10000定时函数输入数组的大小20962定时函数输入数组的大小43940定时函数输入数组的大小92106定时函数输入数组的大小193070定时函数输入数组的大小404709定时函数输入数组的大小848343定时函数输入数组的大小1778280定时函数输入数组大小1778280定时函数输入数组的大小7813708时间函数对输入数组of size 16378938 Timing function for input array of size 34333201 Timing function for input array of size 71968568 Timing function for input array of size 150859071 Timing function for input array of size 316227767

比较结果

要比较结果,可以将执行时间与数据元素的数量进行对比。

重对数(arraySize [tgpuObject;tgpuArrayfun;tcpu])包含(“输入数组大小”) ylabel (“执行时间(秒)”)传说([“GPU执行”“GPU执行\fontname{courier}arrayfun”“CPU执行”),...位置=“东南”

对于较小的数组,CPU执行函数的速度比GPU快。随着输入数组的增大,GPU的性能相对于CPU的性能有所提高。超过阈值数组大小,GPU执行函数的速度比CPU快。GPU性能超过CPU性能的阈值取决于您使用的硬件和执行的功能。

计算CPU执行时间与GPU执行时间的比值,以及使用arrayfun分别。

gpuObjectSpeedup = tcpu./tgpuObject;gpuArrayfunSpeedup = tpu ./tgpuArrayfun;

绘制与输入数组大小的比值。

semilogx (arraySize [gpuObjectSpeedup; gpuArrayfunSpeedup])包含(“输入数组大小”) ylabel (CPU与GPU执行时间之比)传说([“GPU执行”“GPU执行\fontname{courier}arrayfun”),位置=“东南”

执行洛伦兹使用arrayfun始终比仅在GPU上执行快。当您将本例中描述的技术应用于您自己的代码时,性能改进将很大程度上依赖于您的硬件和所运行的代码。

万博1manbetx支持功能

洛伦兹函数 β 并根据这个方程计算洛伦兹因子

γ 1 1 - v 2 c 2 1 1 - β 2

函数Y =洛伦兹(B) Y = 1./√(1-B.*B);结束

另请参阅

||

相关的话题