如何从循环中获取NSight内核启动时序

时间:2013-08-08 18:10:01

标签: performance cuda profiling nsight

*这是我已经问过的更具体,更好形成的问题。我删除了另一个。

所以我正在尝试从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函数的引用,然后运行那些?我现在就去尝试,如果我到了任何地方,请回复一下。

1 个答案:

答案 0 :(得分:0)

使用nvprof,您应该能够获得每个单独调用的组合结果(min,max,avg)或跟踪(使用--print-gpu-trace)。你想要的是介于两者之间的东西,你想要将时间分组。由于你的内核只有一个名称,所以这个工具不可能独立完成,因此它无法区分这些组(它需要检查参数,这将是一个很大的开销)。

获得所需内容的一种方法是对完整的GPU跟踪进行后处理,以手动对各个调用进行分组 - 跟踪按时间顺序排列,因此应该很简单。

另一种方法是模拟内核,例如使用测试编号。即使你实际上没有在你的内核中使用模板参数,它也会强制每个测试都有一个不同的内核名称,这使得nvprof(和nsight)中的默认聚合可以做你想要的。