从内核中提取cuda内核的时间?

时间:2015-03-15 14:53:00

标签: cuda

背景

我有一个内核,我在4ms时用Windows QPC(264纳秒刻度率)测量。但我与一位运行我的内核的同事发生了友好的争执,声称需要15毫秒+(我们都是在用特斯拉K40热身之后这样做)。我怀疑他的问题是定制的RHEL,自定义cuda驱动程序,以及他的"实时"线程组,但我不是Linux专家。我知道Windows时钟并不完美,但这是一个太大的差异。 (除了我写的其他内核的所有时间都与他的时间一致,它只是时间不同的内核链中的第一个)。闻到内核以外的东西。

问题:

无论如何有一种方法可以使用CudeDeviceEvents(经过时间)添加到CUDA内核来测量从第一个块开始到最后一个块结束的整个内核时间吗?我想这会让我们开始弄清楚问题出在哪里。从我的阅读来看,看起来cuda设备事件是在主机上完成的,我正在寻找gpu内部的东西。

1 个答案:

答案 0 :(得分:2)

完全在内核中执行时间的唯一方法是使用the programming guide中涵盖的clock()clock64()函数。

由于这些函数对每个多处理器计数器进行采样,并且AFAIK在这些计数器之间没有指定的关系,从一个SM到下一个SM,没有办法确定单独使用这些函数,哪个thread / warp / block是“第一个假设您的GPU有超过1个SM,则执行并执行哪个“最后”。 (即使存在指定的关系,例如“它们在任何给定的周期内都保证是相同的值”,您仍然需要额外的脚手架,如下所述。)

虽然您可以在代码中创建一些额外的脚手架以尝试提出总体执行时间(可能添加原子来确定哪个线程/ warp / block是第一个和最后一个),但仍可能存在功能差距在方法中。鉴于困难,似乎最好的方法,基于你所描述的,只是使用@njuffa在评论中讨论的分析器。任何分析器都可以在任何支持的平台上使用一组简单的命令为您提供内核的执行时间。