Cuda 向内核传递参数的有效方法?
CUDA提供了三种指定内核参数的方法Cuda 向内核传递参数的有效方法?,cuda,Cuda,CUDA提供了三种指定内核参数的方法 通过在内核()的每个参数上提供一个由N个指针组成的数组 通过提供一个缓冲区,其中N个参数已打包到内核()中 通过使用一组cudaSetupArgument()后跟culunch(),但我认为这种方式不可取 从严格的性能角度来看,我想知道一种方法是否比另一种更好。是否有人知道: 备选案文1。将导致N个GPU访问,而选项2。只会导致一个 如果选项1为true,CUDA是否会在几个内核调用之间重新访问GPU以设置参数,即使其值没有更改 这些问题背后的真正问题是
- 备选案文1。将导致N个GPU访问,而选项2。只会导致一个
- 如果选项1为true,CUDA是否会在几个内核调用之间重新访问GPU以设置参数,即使其值没有更改
编辑:还有,有人知道nvprof测量的是内核时间,还是参数传递+内核时间 内核启动的驱动程序开销足够高,因此参数传递方法的影响可以忽略不计
如果您的内核参数集足够大,并且变化很小,那么您可以通过手动将参数复制到设备内存(或恒定内存,如果您喜欢的话)中获得一些好处。正如公认的答案所说,
内核启动开销只有10-20微秒左右,所以可能没有太多的改进余地
我看不出这个问题有什么意义。如果你的应用程序运行缓慢,原因可能会隐藏在其他地方。是的,但它太模糊了。我想知道这个时间(尽可能小)是否与给内核的参数数量成正比。我从来没有抱怨过我的应用程序太慢。我也不这么认为。从内存读取参数会比从寄存器读取参数昂贵得多吗?事实上,nVidia最佳实践指南指出“对于半扭曲的所有线程,只要所有线程读取相同的地址,从常量缓存读取的速度与从寄存器读取的速度一样快“所以这应该没问题。不要相信NVIDIA关于内存性能的所有说法:-),但对于参数传递,它可以正常工作,除非您尝试同时运行多个内核实例或其他什么。在任何情况下,CPU(运行驱动程序)都会读取并将指定给内核()的参数复制到GPU为启动内核而读取的命令缓冲区中。因此,操作将远离GPU寄存器,直到内核读取它们。