Cuda 为了在sm_21上运行,是否可以更换shfl_xor?

Cuda 为了在sm_21上运行,是否可以更换shfl_xor?,cuda,gpgpu,sift,Cuda,Gpgpu,Sift,正在尝试运行以下操作: 在NVS4200M上,这是sm_21,而不是要求的sm_35。 运行上述项目的唯一问题是该代码(cudaSiftD.cu:205): 对于(inti=1;i好吧,几乎所有CUDA内在函数都可以被替换,所以我将把你的问题解释为 能否在SM_21 GPU上便宜地更换\u shfl\u xor 答案是:不一定;你会受到惩罚。正如@RobertCrovella的评论所建议的,你最好的选择是使用共享内存: 每个通道将其数据写入共享内存中的一个位置(设置这些连续的4字节大小的值以避

正在尝试运行以下操作: 在NVS4200M上,这是sm_21,而不是要求的sm_35。 运行上述项目的唯一问题是该代码(cudaSiftD.cu:205):


对于(inti=1;i好吧,几乎所有CUDA内在函数都可以被替换,所以我将把你的问题解释为

能否在SM_21 GPU上便宜地更换
\u shfl\u xor

答案是:不一定;你会受到惩罚。正如@RobertCrovella的评论所建议的,你最好的选择是使用共享内存:

  • 每个通道将其数据写入共享内存中的一个位置(设置这些连续的4字节大小的值以避免)
  • 执行某种类型的同步(可能需要
    \uu syncthreads()
  • 每个通道从共享内存位置读取数据,该位置是它想要写入其值的通道所在的位置
我没有说出不让你失去乐趣的密码:-)


编辑:虽然洗牌的执行更加复杂,但至少在语义上,它仍然是对寄存器的操作;而且它不需要同步。因此,共享内存的替代方案会更慢。

如果问题更多的是如何用与sm_21兼容的代码替换这段代码,那么您可能需要关注CUB,即块缩减部分。其中一个模板参数是设备的架构


\uuuuu CUDA\u ARCH\uuuuu
宏可以帮助您选择最合适的实现,请参阅。

是的,如果您愿意编写它的话。几乎可以通过共享内存操作完成洗牌操作的任何操作,这也允许线程间通信。我并不是说实现是相同的,只是说有一个使用共享内存的“可能的等效代码”。@Talonmes这个注释如何帮助操作?这是一个非平凡的问题,因为我不认为洗牌本质是CUDA的一个简单特征。我不认为洗牌是一个时钟周期有两个原因:1)在多处理器上每个周期有32个可发布的洗牌。[、和2)洗牌操作由管理共享内存的缓存执行。本质上,使用洗牌大约是共享内存性能的两倍-请参阅[@FlorentDUGUET:Edited以反映您的评论。虽然您的链接不起作用,但我认为您的括号中有一些拼写错误。上面评论中的断开链接:@FlorentDUGUET:comment+1指出无序执行涉及访问共享内存的机制。是的,我知道这是有“代价”(又名惩罚)的。问题是-我不熟悉CUDA API,所以我不适合自己编写代码,至少现在是这样。我只是在寻找可以与Python一起使用的CUDA加速的SIFT实现。我找到了它,但遇到了问题中描述的问题。无论如何,感谢您尝试帮助我!