0

我有一个包含两个主要任务的算法。这两个任务令人尴尬地并行。所以我可以通过以下方式之一将这个算法移植到 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中的论文说,第二种方法在适当的照顾下可以表现得更好。但总的来说应该遵循哪种方法?

4

1 回答 1

2

目前,在 CUDA 编程模型中,没有任何官方支持的方法可以通过单个内核执行跨线程块进行同步。以我的经验,这样做的方法会导致脆弱的代码,在不断变化的情况下可能导致不正确的行为,例如在不同的硬件上运行、更改驱动程序和 CUDA 发布版本等。

仅仅因为某些东西发表在学术出版物中并不意味着它是生产代码的安全想法。

我建议你坚持你的方法 1,我问你这个问题:你确定将你的计算分成两个独立的内核真的会导致性能问题吗?第二次内核启动的成本肯定是瓶颈吗?

于 2012-08-27T00:09:09.240 回答