我有一个算法,它包含两个主要任务。这两项任务都令人尴尬地平行。所以我可以通过以下方式之一在CUDA上移植这个算法。
>Kernel<<<
Block,Threads>>>() \\\For task1
cudaThreadSynchronize();
>Kerne2<<<
Block,Threads>>>() \\\For task2
或者我可以做以下事情。
>Kernel<<<
Block,Threads>>>()
{
1.Threads work on task 1.
2.syncronizes across device.
3.Start for task 2.
}
可以注意到,在第一种方法中,我们必须回到CPU,而在第二种趋势中,我们必须在CUDA中的所有块中使用同步。 IPDPS 10中的论文说第二种方法,经过适当的护理可以表现得更好。但一般来说应遵循哪种方法?
答案 0 :(得分:2)
目前还没有任何官方支持的方法可以在CUDA编程模型中通过单个内核执行来跨线程块进行同步。根据我的经验,这样做的方法导致脆弱的代码,在不断变化的情况下可能导致不正确的行为,例如在不同的硬件上运行,更改驱动程序和CUDA发布版本等。
仅仅因为在学术出版物中发布了某些内容并不意味着它对于生产代码是一个安全的想法。
我建议你坚持使用方法1,我问你:你确定将计算分成两个独立的内核真的会导致性能问题吗?第二个内核发布的成本肯定是瓶颈吗?