我有以下CUDA核心,执行计算成本高的计算,然后用于两个操作。
有时,我希望在没有myKernel
的情况下运行operationOne
。我知道代码分支通常是一个坏主意,但如果所有线程运行相同的分支,是否仍存在实质性的低效率?即以下是一个坏主意?
__global__ void myKernel(bool doOpOne, ...) {
// usefulValue is computed
if(doOpOne) {
// perform operation one
}
// perform operation two
}
答案 0 :(得分:5)
这不一定是个坏主意。根据你所展示的内容和你的规定,我不应该看到任何明显的扭曲分歧。
但是,您可能还会考虑here描述的模板(我相信您的问题几乎与该问题重复 - 也许这个问题应该标记为该问题的副本)。这将允许您为在编译时优化的这样一个简单示例(只有两个选项)创建内核,因此使用Thread obj = new Thread(
new ThreadStart(new ThreadStart(() => VoidFuncName(...parameters....)));
obj.IsBackground = true;
obj.Start();
Response.Redirect("~/someaspxsite.aspx");
将不会产生分支。