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参数存储在一些常量全局内存中.如何确保手动传输的值存储在快速或更快的内存中?
在此先感谢您的帮助.
我希望这种优化的好处相当小.在理智的平台上(即除了WDDM之外的任何东西),内核启动开销只有大约10-20微秒的数量级,因此可能没有太多的改进空间.
话虽如此,如果你想尝试,影响这一点的逻辑方法是使用常量内存.将每个参数定义为__constant__转换单元范围内的符号,然后使用cudaMemcpyToSymbol函数将值从主机复制到设备常量内存.