主要内容

内核分析

对于GPU代码生成,创建CUDA的主要机制®籽粒是由使用的循环。你在MATLAB中写循环的方式®代码对所创建的内核数量以及所生成代码的性能都有重大影响。当你生成GPU代码时,检查诊断报告,看看你的循环段是否有不循环并行化通知。在代码中调用MATLAB函数也可能有-包含这些通知的循环。为了获得最大的性能,您需要确保代码中的计算密集型循环段映射到内核并并行执行。下面的建议可以帮助您实现这一目标并生成高效的CUDA内核。

将嵌套循环映射到内核

条件

考虑一个嵌套的函数循环。

函数y = foo (x)...i1 = 1: N1i2 = 1: N2i3 = 1: N3当= 1:陶瓷...结束结束结束结束

假设中间循环中的一个i3不是可平行的。当执行循环分析以创建内核时,GPU Coder™只考虑最外层的并行循环i1、i2并创建一个具有外部循环维度的内核N1、N2.的循环i3,预告都在内核体内,并按顺序执行。然而,如果最里面预告较大(迭代),那么可以通过为最内部的循环创建内核来获得更好的性能。

行动

有三种方法可以并行化最里面的循环:

  • 重写代码,使最内部的代码段不在嵌套循环中。

  • 如果外部循环的迭代大小较小,则将循环附加到coder.unroll函数。函数展开-循环,为每次循环迭代复制一个循环体。有关更多信息,请参见coder.unroll

    函数y = foo (x)...i1 = coder.unroll (1: N1)...结束
  • 使外环尺寸为动态边界。通过这种方式,并行循环分析在外部循环上失败,而在内部循环上成功。

    函数y = foo (x, N1)...i1 = 1: N1...结束

for循环和打破

条件

不支持带break的循环。

(我< N)......如果(cond2)......打破结束结束

行动

通过创建一个保护变量和条件来删除中断。

气孔导度= true;(我< N)如果(电导率)......如果(cond2) cond = false;结束结束结束

相关性分析并行回路检查失败

条件

核提取采用并行回路依赖性分析。在某些情况下,循环相关性分析无法检测到并行for循环。的coder.gpu.kernel允许GPU Coder覆盖依赖分析和强制内核创建。需要注意的是,用户要确保循环是“for-all”循环,没有迭代间的依赖关系。

行动

使用coder.gpu.kernel在每个for循环上显式地使用Pragma。

数组的逻辑索引

条件

当使用逻辑索引访问数组元素时,GPU Coder可能不会创建内核。

I = (mag ~= 0);vx (i) = vx(我)。/ mag(我);v (i) = v (i)。/ mag(我);

行动

通过使用循环体并使用适当的条件进行保护来重写代码。

i = 1:元素个数(mag)如果(mag(i) ~= 0) vx(i) = vx(i)./mag(i);v (i) = v (i)。/ mag(我);结束结束

不支持的功能

条件

在循环中使用不支持的函数、编码器语法、工具箱函数等可以防止它们成为内核。

行动

尝试用纯MATLAB重写不支持的函数。

循环交换

条件

如果一个循环嵌套中的更小的循环是最外层的循环,那么可以用嵌套中的一个循环子集创建一个内核。如果算法允许,总是把最大的循环放在最外层的嵌套中。

行动

重写循环嵌套,使用更大的循环作为外循环。

相关的话题

Baidu
map