CUDA:将参数传递给内核是否会减慢内核的启动速度?

时间:2011-06-28 12:30:42

标签: gpgpu cuda

CUDA初学者。

在我的代码中,我目前正在主机代码的循环中多次启动内核。 (因为我需要块之间的同步)。所以我想知道我是否能够优化内核启动。

我的内核启动看起来像这样:

MyKernel<<<blocks,threadsperblock>>>(double_ptr, double_ptr, int N, double x);

因此,为了启动内核,显然必须从CPU到GPU,但我想知道参数的传递是否会使这个过程明显变慢。

内核的参数每次都是相同的,所以也许我可以通过复制它们来节省时间,通过

定义的名称在内核中访问它们
__device__ int N;
<and somehow (how?) copy the value to this name N on the GPU once>

并简单地启动没有参数的内核

MyKernel<<<blocks,threadsperblock>>>();

这会让我的节目更快吗? 这样做的最佳方式是什么? AFAIK参数存储在一些常量全局内存中。如何确保手动传输的值存储在快速或更快的内存中?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

我希望这种优化的好处相当小。在理智的平台上(即除了WDDM之外的任何东西),内核启动开销只有10-20微秒的数量级,所以可能没有太多的改进空间。

话虽如此,如果你想尝试,影响它的逻辑方法是使用常量内存。在翻译单元范围将每个参数定义为__constant__符号,然后使用cudaMemcpyToSymbol函数将值从主机复制到设备常量内存。

答案 1 :(得分:3)

简单回答:不。

更详细一点:无论如何,您需要从主机向GPU发送一些信号,以启动内核本身。此时,几个字节的参数数据就不再重要了。