Cuda 持久性GPU共享内存

Cuda 持久性GPU共享内存,cuda,gpu,shared-memory,persistent,Cuda,Gpu,Shared Memory,Persistent,我是CUDA编程新手,由于性能原因,我主要使用每个块的共享内存。按照我现在的程序结构,我使用一个内核加载共享内存,另一个内核读取预加载的共享内存。但是,据我所知,共享内存不能在两个不同的内核之间持久存在 我有两个解决方案;我不确定第一个,第二个可能很慢 第一个解决方案:我使用一个内核,而不是使用两个内核。加载共享内存后,内核可能会等待主机的输入,执行操作,然后将值返回给主机。我不确定内核是否可以等待来自主机的信号 第二种解决方案:加载共享内存后,将共享内存值复制到全局内存中。启动下一个内核时,将

我是CUDA编程新手,由于性能原因,我主要使用每个块的共享内存。按照我现在的程序结构,我使用一个内核加载共享内存,另一个内核读取预加载的共享内存。但是,据我所知,共享内存不能在两个不同的内核之间持久存在

我有两个解决方案;我不确定第一个,第二个可能很慢

第一个解决方案:我使用一个内核,而不是使用两个内核。加载共享内存后,内核可能会等待主机的输入,执行操作,然后将值返回给主机。我不确定内核是否可以等待来自主机的信号

第二种解决方案:加载共享内存后,将共享内存值复制到全局内存中。启动下一个内核时,将值从全局内存复制回共享内存,然后执行该操作


请评论这两种解决方案的可行性。

我将使用您建议的第一种解决方案的一种变体:正如您已经怀疑的,您不能等待主机在内核中输入—但您可以在某一点上同步您的内核。将数据加载到共享内存后,只需在内核中调用“uu syncthreads();”


我真的不理解您的第二个解决方案:为什么您要将数据复制到共享内存,而只是在第一个内核中将其复制回全局内存?或者第一个内核也会计算一些东西吗?在这种情况下,我想先将初步结果存储在共享内存中是没有帮助的,我宁愿将它们直接存储在全局内存中(不过,这可能取决于算法).

启动内核后,为什么需要等待主机输入?听起来您可能试图将共享内存硬塞进一个不适合的用途中。如果您的目标设备的计算能力>=2.0,我会说,一开始不要担心使用共享内存。相反,使用
cudaFuncSetCacheConfig(MyKernel,cudaFuncCachePreferL1)
设置一级缓存的首选项。当你的算法工作时,在CUDA档案器中运行你的应用程序,并检查它是否内存受限。如果它是内存绑定的,那么考虑是否有任何方法可以通过使用共享内存或更有效地使用L1来提高性能。