首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分支指令和谓词指令

分支指令和谓词指令
EN

Stack Overflow用户
提问于 2015-05-17 15:37:06
回答 1查看 5.5K关注 0票数 16

“数据自动化系统C编程指南”的第5.4.2节指出,分支分歧要么由“分支指令”处理,要么在某些条件下由“预测指令”处理。我不明白两者之间的区别,以及为什么其中一种比另一种更好。

这句话建议,分支指令会导致更多的执行指令,因为“分支地址解析和获取”而停滞,而由于“分支本身”和“为发散而簿记”而导致开销,而谓词指令只会产生“指令执行延迟来执行条件测试和设置谓词”。为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-17 16:24:07

指令预测是指根据谓词由线程有条件地执行指令。谓词为true的线程执行指令,其余线程不执行任何操作。

例如:

代码语言:javascript
复制
var = 0;

// Not taken by all threads
if (condition) {
    var = 1;
} else {
    var = 2;
}

output = var;

将导致(而不是实际的编译器输出):

代码语言:javascript
复制
       mov.s32 var, 0;       // Executed by all threads.
       setp pred, condition; // Executed by all threads, sets predicate.

@pred  mov.s32 var, 1;       // Executed only by threads where pred is true.
@!pred mov.s32 var, 2;       // Executed only by threads where pred is false.
       mov.s32 output, var;  // Executed by all threads.

总之,这是if的3个指令,没有分支。很有效率。

具有分支的等效代码如下所示:

代码语言:javascript
复制
       mov.s32 var, 0;       // Executed by all threads.
       setp pred, condition; // Executed by all threads, sets predicate.

@!pred bra IF_FALSE;         // Conditional branches are predicated instructions.
IF_TRUE:                    // Label for clarity, not actually used.
       mov.s32 var, 1;
       bra IF_END;
IF_FALSE:
       mov.s32 var, 2;
IF_END:
       mov.s32 output, var;

注意它还有多长时间(if的5条指令)。条件分支要求禁用部分翘曲,执行第一个路径,然后回滚到翘曲发散点,并执行第二个路径,直到两者都收敛为止。这需要更长的时间,需要额外的簿记、更多的代码加载(特别是在需要执行许多指令的情况下),因此需要更多的内存请求。所有这一切使分支比简单的预测慢。

实际上,在这个非常简单的条件赋值的情况下,编译器可以做得更好,只需对if执行两个指令。

代码语言:javascript
复制
mov.s32 var, 0;       // Executed by all threads.
setp pred, condition; // Executed by all threads, sets predicate.
selp var, 1, 2, pred; // Sets var depending on predicate (true: 1, false: 2).
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30288669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档