使用 Streams 在 CUDA 上调用内核延迟
Kernel invoking delay on CUDA with Streams
我从头开始为 CUDA 创建了扫描算法,并尝试将其用于小于 80,000 字节的较小数据量。
创建了两个单独的实例,一个在可能的情况下使用流运行内核,另一个仅在默认流中运行。
我观察到的是,对于这个范围的数据大小,与其他方法相比,运行 流需要更长的时间来完成任务。
使用 nvprofiler 进行分析时,观察到的是对于较小的数据量,流中的 运行 不会为单独的内核提供并行性
没有流
有流
但是当数据量增加时,可以获得某种并行性
具有 400,000 字节的流
我的问题是,是否有一些额外的参数可以减少此内核调用时间延迟,或者对于使用流不利的较小数据大小具有这种行为是否正常
更新:
我也包含了运行时 API 调用时间轴以阐明答案
通常情况下,您的数据太小,无法在第一种情况下充分利用 GPU。如果您检查 nvvp 中 'Runtime API' 的时间线(您没有在图中显示),您会发现启动内核需要几微秒。如果流 13 中的第一个内核太短,流 14 中的第二个内核可能尚未启动,因此流之间没有并行性。
由于这些开销,如果数据很小,您可能会发现在 CPU 上 运行 您的程序会更快。
我从头开始为 CUDA 创建了扫描算法,并尝试将其用于小于 80,000 字节的较小数据量。
创建了两个单独的实例,一个在可能的情况下使用流运行内核,另一个仅在默认流中运行。
我观察到的是,对于这个范围的数据大小,与其他方法相比,运行 流需要更长的时间来完成任务。
使用 nvprofiler 进行分析时,观察到的是对于较小的数据量,流中的 运行 不会为单独的内核提供并行性
没有流
有流
但是当数据量增加时,可以获得某种并行性
具有 400,000 字节的流
我的问题是,是否有一些额外的参数可以减少此内核调用时间延迟,或者对于使用流不利的较小数据大小具有这种行为是否正常
更新:
我也包含了运行时 API 调用时间轴以阐明答案
通常情况下,您的数据太小,无法在第一种情况下充分利用 GPU。如果您检查 nvvp 中 'Runtime API' 的时间线(您没有在图中显示),您会发现启动内核需要几微秒。如果流 13 中的第一个内核太短,流 14 中的第二个内核可能尚未启动,因此流之间没有并行性。
由于这些开销,如果数据很小,您可能会发现在 CPU 上 运行 您的程序会更快。