调用CUDA内核时的性能处罚[英] Performance penalty when invoking a cuda kernel

本文是小编为大家收集整理的关于调用CUDA内核时的性能处罚的处理方法,想解了调用CUDA内核时的性能处罚的问题怎么解决?调用CUDA内核时的性能处罚问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我想知道执行cuda内核调用的开销是在C/C ++中,例如以下内容:

somekernel1<<<blocks,threads>>>(args);
somekernel2<<<blocks,threads>>>(args);
somekernel3<<<blocks,threads>>>(args);

我之所以问这个问题是因为我正在构建的应用程序当前重复调用多个内核(没有记忆被重新阅读/写入呼叫之间的设备),我想知道是否将这些内核调用包装到单个内核调用(具有SomeKernel1-3成为设备功能)将在性能上带来任何有意义的差异.

推荐答案

在非WDDM Windows平台上,运行时API的内核启动的主机侧仅约为15-30微秒.在WDDM平台(我不使用)上,我知道它可能会更高,更高,此外,驱动程序中有某种批处理机制试图通过在单个驾驶员侧操作中进行多次操作来摊销成本.

通常,"融合"多个数据操作的性能会提高,否则这些数据将在单独的内核中完成,将算法允许. GPU的算术峰值性能比峰值存储器带宽要高得多,因此,每个内存事务可以执行的失败(以及每个内核"设置代码"),内核的性能越好.另一方面,试图编写"瑞士军刀"风格的内核,该样式的内核试图将完全截然不同的操作塞入单个代码中,这绝不是一个特别好主意,因为它会增加寄存器压力并降低诸如L1,诸如L1的效率,恒定的内存和纹理缓存.

您选择去哪种方式应真正由代码/算法的性质指导.我不认为在所有情况下都可以应用一个"正确"答案.

其他推荐答案

如果您在Windows上使用Visual Studio Pro,我使用NVIDIA的平行Nsight运行测试应用程序,我认为它可以告诉您方法呼叫的时间戳记到真实执行是固有的,但是如果您的内核持续足够长的时间,则可以忽略不计.

本文地址:https://www.itbaoku.cn/post/359277.html