【问题标题】:CUDA: Does passing arguments to a kernel slow the kernel launch much?CUDA:将参数传递给内核是否会大大降低内核启动速度?
【发布时间】:2011-06-28 12:30:42
【问题描述】:

这里是 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 参数存储在一些恒定的全局内存中。如何确保手动传输的值存储在同样快或更快的内存中?

提前感谢您的帮助。

【问题讨论】:

    标签: gpgpu cuda


    【解决方案1】:

    我预计这种优化的好处是相当小的。在健全的平台上(即除 WDDM 之外的任何平台),内核启动开销仅为 10-20 微秒的数量级,因此可能没有太大的改进空间。

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

    【讨论】:

      【解决方案2】:

      简单的回答:没有。

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

      【讨论】:

      • 在极端情况下,当使用非常“紧”的内核时,这实际上可能很重要,但当然,这只有在同时没有进行其他更高延迟的操作时才是正确的。
      • 即使内核非常紧凑。向 GPU 发送 1 个字节或 10KB 无关紧要。由于延迟而不是吞吐量,这将花费相同的时间。当您开始发送兆字节的数据时,吞吐量可能会发挥作用......
      猜你喜欢
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多