例如,如果我在m x n
矩阵上操作,我很可能需要将m
和n
传递给我的内核。
如果我还需要了解总分数N = m*n
,我应该将N
作为参数传递(并消耗带宽)或计算{{ 1}}在内核本地为每个线程(并且消耗大量重复操作的处理能力,即使N
只需要计算一次)?
在这里,我正在谈论为大量数据集集合启动1000次的内核,所以真的试图提升性能。
Stride是另一个例子,你在启动内核之前知道TBP和BPG,因此可以预先计算。
答案 0 :(得分:1)
为了回答这个问题,你至少需要知道一件事。
我的限制因素是什么?
基本上你有两个选择:
你的内核是内存绑定的 - 这意味着你可以从/向全局内存读取/写入(通常)和/或与已访问的内存相比具有少量计算 - >你不必担心这种优化
你的内核是计算绑定的 - 这意味着r / w流量完全被计算次数隐藏 - >您所描述的优化可能有所帮助,但不一定
了解运行探查器和运行内核分析的最佳选择。