Cuda 向内核传递参数的有效方法?

Cuda 向内核传递参数的有效方法?,cuda,Cuda,CUDA提供了三种指定内核参数的方法 通过在内核()的每个参数上提供一个由N个指针组成的数组 通过提供一个缓冲区,其中N个参数已打包到内核()中 通过使用一组cudaSetupArgument()后跟culunch(),但我认为这种方式不可取 从严格的性能角度来看,我想知道一种方法是否比另一种更好。是否有人知道: 备选案文1。将导致N个GPU访问,而选项2。只会导致一个 如果选项1为true,CUDA是否会在几个内核调用之间重新访问GPU以设置参数,即使其值没有更改 这些问题背后的真正问题是

CUDA提供了三种指定内核参数的方法

  • 通过在内核()的每个参数上提供一个由N个指针组成的数组
  • 通过提供一个缓冲区,其中N个参数已打包到内核()中
  • 通过使用一组cudaSetupArgument()后跟culunch(),但我认为这种方式不可取
  • 从严格的性能角度来看,我想知道一种方法是否比另一种更好。是否有人知道:

    • 备选案文1。将导致N个GPU访问,而选项2。只会导致一个
    • 如果选项1为true,CUDA是否会在几个内核调用之间重新访问GPU以设置参数,即使其值没有更改
    这些问题背后的真正问题是,我的内核相当“简单”,包含大量参数,这些参数被多次调用(几乎)使用相同的参数值,我想知道仅仅传递参数是否会对性能产生真正的影响

    答案并不能完全回答我的问题


    编辑:还有,有人知道nvprof测量的是内核时间,还是参数传递+内核时间

    内核启动的驱动程序开销足够高,因此参数传递方法的影响可以忽略不计


    如果您的内核参数集足够大,并且变化很小,那么您可以通过手动将参数复制到设备内存(或恒定内存,如果您喜欢的话)中获得一些好处。

    正如公认的答案所说,
    内核启动开销只有10-20微秒左右,所以可能没有太多的改进余地
    我看不出这个问题有什么意义。如果你的应用程序运行缓慢,原因可能会隐藏在其他地方。是的,但它太模糊了。我想知道这个时间(尽可能小)是否与给内核的参数数量成正比。我从来没有抱怨过我的应用程序太慢。我也不这么认为。从内存读取参数会比从寄存器读取参数昂贵得多吗?事实上,nVidia最佳实践指南指出“对于半扭曲的所有线程,只要所有线程读取相同的地址,从常量缓存读取的速度与从寄存器读取的速度一样快“所以这应该没问题。不要相信NVIDIA关于内存性能的所有说法:-),但对于参数传递,它可以正常工作,除非您尝试同时运行多个内核实例或其他什么。在任何情况下,CPU(运行驱动程序)都会读取并将指定给内核()的参数复制到GPU为启动内核而读取的命令缓冲区中。因此,操作将远离GPU寄存器,直到内核读取它们。