主要内容

内存瓶颈分析

数据一致性

条件

MATLAB是列为主的,但该算法可以实现一个优化的行为主的实现。在生成的代码中,如果变化最快的维度不是最里面的循环,那么内存就没有合并。通常,换位输入矩阵可以简单地解决这个问题。

行动

试着调换数据。

小的数据大小

条件

如果你的问题/数据大小太小,那么将数据移动到GPU的开销(即使只是在I/O边界)会抵消在GPU上运行的任何性能收益。

行动

在更大的数据大小上尝试该算法。

太多cudaMemcpys

条件

如果你只使用coder.gpu.kernel,那么循环之外的一切都将进入CPU。为了将大部分代码保留在GPU上,建议同时使用这两种语法。此外,出现不支持的函数或任何不能在GPU上运行的函数/语句,会导致更多的问题cudaMemcpys生成。

行动

使用coder.gpu.kernelfun除了coder.gpu.kernel

常数输入

建议

如果入口点函数的某些输入是常量,则使用coder.const对象。使用coder.const对象表示这些变量在代码生成期间是恒定的。如果没有这个功能,GPU Coder™将这些输入视为变量,因此将所有由这些变量大小的矩阵视为变维矩阵。GPU Coder不能从变维矩阵中创建好的内核,因为目前还不支持内核的动态大小或动态大小cudaMemcpy函数调用。

栈内存使用

建议

在内核中使用大型堆栈内存会降低生成代码的性能。在这种情况下,可以考虑以一种不同的方式重写算法,或者将其分解为更小的计算,以减少堆栈内存的使用并提高性能。

相关的话题

Baidu
map