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

Performance 如何从循环中获取NSight内核启动时间,performance,cuda,profiling,nsight,Performance,Cuda,Profiling,Nsight,*这是我已经问过的一个更具体、形式更好的问题。我删除了另一个 所以我试图从CUDA库中收集内核计时数据 库中的每种算法都有不同类型的基准,它们的工作原理如下: 有一个2d数组,它具有成对的数组大小和测试迭代。例如: const int Tests[][2] = { { 10000, 10000 }, { 50000, 5000 }, { 100000, 5000 }, { 200000, 2000 } // ... }; 然后主要是一个循环 // get

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

所以我试图从CUDA库中收集内核计时数据

库中的每种算法都有不同类型的基准,它们的工作原理如下:

有一个2d数组,它具有成对的数组大小和测试迭代。例如:

const int Tests[][2] = {
    { 10000, 10000 },
    { 50000, 5000 },
    { 100000, 5000 },
    { 200000, 2000 }
    // ...
};
然后主要是一个循环

// get context ptr
for(int test = 0; test < numTests; ++test)
    BenchmarkMyAlg(Tests[test][0], Tests[test][1], *context);
//获取上下文ptr
对于(int test=0;test
BenchmarkMyAlg设置数据和所有内容,然后在循环中运行内核(Tests[test][1]次)

我想做的是获取每个测试参数对的“CUDA启动摘要”数据,特别是“以微秒为单位执行设备功能的平均持续时间”。即,对于main中该循环的每次迭代

现在,我只能得到整个主循环的平均计时。换句话说,在应用程序执行后,我只能获得1行NSight数据,我需要numTests行数据

如果主要测试第二个不同的算法,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);
for(int-test=0;test
但是,新的数据行引用了整个循环,当我需要2*numTests行数据时,给了我2行数据

我尝试了在NSight中挖掘设置,也修补了一些nvprof,但没有取得任何进展


我想有一种方法可以重新编写文件,这样NSight就可以像实际切换到不同内核时一样,将每个测试迭代识别为一个新的/不同的内核(如我的第二个示例)。也许初始化numtest单独引用BenchmarkMyAlg函数,然后运行这些函数?我现在就去试试,如果有什么进展,我会回复你。

使用nvprof,你应该能够获得每个调用的组合结果(最小值、最大值、平均值)或跟踪(使用--print gpu跟踪)。你想要的是介于两者之间的东西,你想把时间分组。这是不可能的,因为你的内核只有一个名字,因此它无法区分组(它需要检查参数,这将是一个很大的开销)

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


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

感谢您的响应!是的,经过一整天的修修补补,我发现没有一种直接的方法来做我想做的事情。我最后做的是在main中只调用一次BenchmarkMyAlg函数,(size,iterations)对是main的参数,传递给BenchmarkMyAlg函数。然后我可以做“nvprof--csv myprog.exe>>output.txt”,然后我只需为每个大小的迭代对启动程序;数据被附加到该文件中。虽然,从循环中处理完整的gpu跟踪将是一个更好的方法。但是我没有想到模板的事情,这可能比完整的后处理更容易实现。。。但是如果我继续为完整的gpu跟踪做一些解析器,我将有一个很好的开始,为我正在做的事情提供一个有用的小实用程序。