*这是我已经问过的更具体,更好形成的问题。我删除了另一个。
所以我正在尝试从CUDA库中收集内核时序数据......
该库为每种算法都有不同类型的基准,它们的工作原理如下:
有一个2d数组,它有一对数组大小和数组。测试迭代。例如:
const int Tests[][2] = {
{ 10000, 10000 },
{ 50000, 5000 },
{ 100000, 5000 },
{ 200000, 2000 }
// ...
};
然后在main中会有一个循环
// get context ptr
for(int test = 0; test < numTests; ++test)
BenchmarkMyAlg(Tests[test][0], Tests[test][1], *context);
BenchmarkMyAlg设置数据和所有内容,然后在循环中运行内核(测试[test] [1]次)
我想要做的是获取每个测试参数对的“CUDA启动摘要”数据,特别是“以微秒为单位执行设备功能的平均持续时间”。即对于main中该循环的每次迭代。
就像现在一样,我只能得到整个主循环的平均时间。换句话说,我只能在应用程序执行后得到1行NSight数据,并且我想要numTests数据行。
如果在main中测试第二个不同的算法,则NSight将生成另一行数据。 e.g ...
for(int test = 0; test < numTests; ++test)
BenchmarkMyAlg(Tests[test][0], Tests[test][1], *context);
for(int test = 0; test < numTests; ++test)
BenchmarkMyOtherAlg(Tests[test][0], Tests[test][1], *context);
但同样,新的数据行指向整个循环,当我想要2 * numTests数据行时,给我2行数据。
我已经尝试过挖掘NSight中的设置了,我还修改了一些nvprof,但我没有取得任何进展。
我认为有一种方法可以重新编码文件,以便NSight将每个测试迭代识别为新的/不同的内核,就像它实际切换到不同的内核时一样(如我的第二个例子)。也许初始化numTests分开对BenchmarkMyAlg函数的引用,然后运行那些?我现在就去尝试,如果我到了任何地方,请回复一下。
答案 0 :(得分:0)
使用nvprof,您应该能够获得每个单独调用的组合结果(min,max,avg)或跟踪(使用--print-gpu-trace)。你想要的是介于两者之间的东西,你想要将时间分组。由于你的内核只有一个名称,所以这个工具不可能独立完成,因此它无法区分这些组(它需要检查参数,这将是一个很大的开销)。
获得所需内容的一种方法是对完整的GPU跟踪进行后处理,以手动对各个调用进行分组 - 跟踪按时间顺序排列,因此应该很简单。
另一种方法是模拟内核,例如使用测试编号。即使你实际上没有在你的内核中使用模板参数,它也会强制每个测试都有一个不同的内核名称,这使得nvprof(和nsight)中的默认聚合可以做你想要的。