我是CUDA编程的新手,由于性能原因,我主要使用每个块的共享内存。我的程序现在的结构方式,我使用一个内核加载共享内存和另一个内核来读取预加载的共享内存。但是,据我所知,共享内存不能在两个不同的内核之间存在。
我有两个解决方案;我不确定第一个,第二个可能很慢。
第一个解决方案:我使用一个内核而不是使用两个内核。加载共享内存后,内核可能会等待主机的输入,执行操作,然后将值返回给主机。我不确定内核是否可以等待来自主机的信号。
第二个解决方案:加载共享内存后,将共享内存值复制到全局内存中。启动下一个内核时,将值从全局内存复制回共享内存,然后执行操作。
请评论两种解决方案的可行性。
答案 0 :(得分:2)
我会使用您提出的第一个解决方案的变体:正如您已经怀疑的那样,您不能等待内核中的主机输入 - 但您可以在某个时刻同步内核。只需调用“__syncthreads();”将数据加载到共享内存后,在内核中。
我真的不明白你的第二个解决方案:为什么你要将数据复制到共享内存只是为了将它复制回第一个内核中的全局内存?或者这个第一个内核也会计算一些东西?在这种情况下,我想首先将初步结果存储在共享内存中是没有用的,我宁愿将它们直接存储在全局内存中(但是,这可能取决于算法)。