CUDA:具有公共(共享)参数的内核并发
我有使用一个公共(共享)参数的内核,但是,每个内核都做独立的事情:它们不重叠。如何使它们重叠 CUDA代码看起来像(k0和k1在专用流str[i]中启动): 这就是arg2的doubleconst*const,希望此提示能够帮助nvcc nvvp显示,k2在str[1]中运行,而在k1已完成在str[0]中运行之后 内核不重叠:这与公共参数(arg2)有关吗?如果是,在这种情况下如何使内核相互重叠 更新 我使用开普勒K20m:CUDA:具有公共(共享)参数的内核并发,cuda,Cuda,我有使用一个公共(共享)参数的内核,但是,每个内核都做独立的事情:它们不重叠。如何使它们重叠 CUDA代码看起来像(k0和k1在专用流str[i]中启动): 这就是arg2的doubleconst*const,希望此提示能够帮助nvcc nvvp显示,k2在str[1]中运行,而在k1已完成在str[0]中运行之后 内核不重叠:这与公共参数(arg2)有关吗?如果是,在这种情况下如何使内核相互重叠 更新 我使用开普勒K20m: 计算能力为3.5 支持内核并发( 我正在开发的上一个版本[我们称之
- 计算能力为3.5
- 支持内核并发( 我正在开发的上一个版本[我们称之为v0]实现了 不同的策略,其中内核重叠[使用nvvp检查],但 小得多:对于v0,内核似乎太小而无法发挥效率 [内核启动时间>=内核运行时间])
从v0开始,我实现了另一个版本v1以“使内核更大”:现在,关于
const
问题,我有了内核启动时间(根据nvvp为50微秒),如果你的目标是开普勒及以上,你可以更好地通过使用双*const\uuuuuuuuuuuuuu限制arg2向nvcc表明它是只读的,这将提示使用。关于const
问题,如果您的目标是开普勒及以上,您可以通过使用double*const\uuuuu restrict\uuuuu arg2
更好地向nvcc指示它是只读的,这将提示使用
内核不重叠:这与公共参数(arg2)有关吗
不,这不是因为他们共享一个输入参数
通过使用CUDA流,程序员明确表示k0和k1可以并发执行,因此即使用arg3替换arg5,硬件仍然可以并发执行它们
由于这种情况没有发生:
请记住,只有当第一个内核没有填满GPU时,内核才会同时运行,因此请检查网格大小-如果第一个内核填满了整个GPU,那么在第二个内核完成之前,将没有资源运行第二个内核(第一个内核耗尽,第二个内核启动时,可能会有一个微小的重叠)
你在哪个GPU上运行这个?并发内核要求compute capability 2.0或更高版本,您可以检查要检查的concurrentKernels
设备属性(例如,请参阅deviceQuery
示例)
根据您提供的其他信息(请不要将其他信息作为答案发布,您应该修改您的问题或评论),我们可以得出以下结论:(1)这里就是这种情况。在启动下一个内核之前,工作调度器将调度一个内核的所有块;由于第一个内核需要几毫秒来执行,并且由许多线程块组成,因此第二个内核只会在最后一个块开始完成时开始执行
占用率是SM管理的扭曲数量的度量,占用率为30%,这意味着其他一些因素限制了可以调度的扭曲数量(例如,寄存器使用率、共享内存使用率)-这并不意味着我们可以运行第二个内核。您可以使用CUDA入住率计算器电子表格进一步调查入住率
有关并发内核的更多信息,您还可以查看
内核不重叠:这与公共参数(arg2)有关吗
不,这不是因为他们共享一个输入参数
通过使用CUDA流,程序员明确表示k0和k1可以并发执行,因此即使用arg3替换arg5,硬件仍然可以并发执行它们
由于这种情况没有发生:
请记住,只有当第一个内核没有填满GPU时,内核才会同时运行,因此请检查网格大小-如果第一个内核填满了整个GPU,那么在第二个内核完成之前,将没有资源运行第二个内核(第一个内核耗尽,第二个内核启动时,可能会有一个微小的重叠)
你在哪个GPU上运行这个?并发内核要求compute capability 2.0或更高版本,您可以检查要检查的concurrentKernels
设备属性(例如,请参阅deviceQuery
示例)
根据您提供的其他信息(请不要将其他信息作为答案发布,您应该修改您的问题或评论),我们可以得出以下结论:(1)这里就是这种情况。在启动下一个内核之前,工作调度器将调度一个内核的所有块;由于第一个内核需要几毫秒来执行,并且由许多线程块组成,因此第二个内核只会在最后一个块开始完成时开始执行
占用率是SM管理的扭曲数量的度量,占用率为30%,这意味着其他一些因素限制了可以调度的扭曲数量(例如,寄存器使用率、共享内存使用率)-这并不意味着我们可以运行第二个内核。您可以使用CUDA入住率计算器电子表格进一步调查入住率
有关并发内核的更多信息,您还可以查看。k0运行多长时间?您的目标是什么计算能力?k0运行多长时间?您的目标是什么计算能力?
k0<<<..., str[0]>>>(arg1, arg2, arg3);
k1<<<..., str[1]>>>(arg4, arg2, arg5); // k2 uses also arg2
k0(double const * const arg1, double const * const arg2, double * arg3);
k1(double const * const arg1, double const * const arg2, double * arg3);