作为更大代码的一部分,我有一个CUDA RK4求解器,它并行地集成了大量的ODE(可以是1000+)。此操作的一个步骤是计算“xdot”,这对于每个等式(或数据元素)都是不同的。到目前为止,我已经有了一个switch-case分支设置来计算内核中每个数据元素的值。所有不同的线程都使用相同的3-6个数据元素来计算它们的输出,但方式不同。例如,对于线程1,它可以是
xdot = data*data + data1;
而对于线程2,它可能是,
xdot = -2*data + data2;
诸若此类。因此,如果我有100个数据元素,每个元素的执行路径都是不同的。
在这种情况下,有没有办法避免/减少线程发散的损失?每个块只运行一个线程会有什么帮助吗?
发布于 2013-07-20 17:52:57
在每个块中运行一个线程只会在您启动的单个warp中清空31/32个线程,并浪费大量的周期和机会来隐藏延迟。我永远不会推荐你这样做,不管你的代码有多大的分支发散损失。
您的应用程序听起来与基本的CUDA编程范例完全不同,实际上您无法做太多事情来避免分支分歧的惩罚。一种可以稍微改善情况的方法是对每个方程的表达式执行一些先验分析,并将具有共同算术项的表达式分组在一起。最近的硬件可以同时运行多个内核,因此将共享类似项的计算分组到不同的内核中并同时启动它们可能是有利可图的,而不是单个大型内核。CUDA支持C++模板,这是从相对较窄的基础上生成大量内核代码的一种好方法,并使许多逻辑可静态求值,这可以帮助编译器。但不要期待奇迹--你的问题可能更适合不同的架构,而不是GPU (例如,Intel的Xeon Phi )。
https://stackoverflow.com/questions/17751346
复制相似问题