使用布尔代数和传递的参数在CUDA中实现类似内核的两个版本是否有效?

时间:2015-12-02 15:50:30

标签: performance cuda

我有以下CUDA核心,执行计算成本高的计算,然后用于两个操作。

有时,我希望在没有myKernel的情况下运行operationOne。我知道代码分支通常是一个坏主意,但如果所有线程运行相同的分支,是否仍存在实质性的低效率?即以下是一个坏主意?

__global__ void myKernel(bool doOpOne, ...) {
    // usefulValue is computed

    if(doOpOne) {
         // perform operation one
    }
    // perform operation two
}

1 个答案:

答案 0 :(得分:5)

这不一定是个坏主意。根据你所展示的内容和你的规定,我不应该看到任何明显的扭曲分歧。

但是,您可能还会考虑here描述的模板(我相信您的问题几乎与该问题重复 - 也许这个问题应该标记为该问题的副本)。这将允许您为在编译时优化的这样一个简单示例(只有两个选项)创建内核,因此使用Thread obj = new Thread( new ThreadStart(new ThreadStart(() => VoidFuncName(...parameters....))); obj.IsBackground = true; obj.Start(); Response.Redirect("~/someaspxsite.aspx"); 将不会产生分支。