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

Esk*_*kil 6 cuda gpgpu

CUDA初学者在这里.

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

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

MyKernel<<<blocks,threadsperblock>>>(double_ptr, double_ptr, int N, double x);
Run Code Online (Sandbox Code Playgroud)

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

内核的参数每次都是相同的,所以也许我可以通过复制它们来节省时间,通过由内核定义的名称在内核中访问它们.

__device__ int N;
<and somehow (how?) copy the value to this name N on the GPU once>
Run Code Online (Sandbox Code Playgroud)

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

MyKernel<<<blocks,threadsperblock>>>();
Run Code Online (Sandbox Code Playgroud)

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

在此先感谢您的帮助.

tal*_*ies 5

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

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