linux-kernel - 我们可以将分支预测与原子操作一起使用吗?
问题描述
我想知道我们是否可以将分支预测宏(可能/不太可能)与任何原子操作一起使用。以下语句有副作用吗?
atomic_t v = ATOMIC_INIT(0);
atomic_inc(&v);
if (unlikely(atomic_read(&v)) == 2) {
/* Some Operation */
}
解决方案
在原子操作和非原子操作上使用likely
/没有区别。unlikely
这些宏的目的只是生成在条件的两个分支之一更有可能的情况下执行更好的代码。
因此,对于“正常”操作,您将拥有例如:
if (unlikely(--x)) if (likely(--x))
do_a(); do_a();
else else
do_b(); do_b();
*decrement x* *decrement x*
jnz not_zero jz zero
call do_b call do_a
not_zero: zero:
call do_a call do_b
而在原子操作的情况下,您只需:
if (unlikely(atomic_sub_and_test(&x))) if (likely(atomic_sub_and_test(&x)))
do_a(); do_a();
else else
do_b(); do_b();
*atomically decrement x* *atomically decrement x*
jnz not_zero jz zero
call do_b call do_a
not_zero: zero:
call do_a call do_b
推荐阅读
- python - 熊猫根据列中的重复值对数据框中的行进行分组,并在 Uniqe ID 值之后重复所有行
- python-3.x - 所有 mp3 文件的持续时间如何
- android - 从 fire-base 检索数据时出现错误
- python - 使用 selenium 抓取带有随机字符串的元素?
- java - Java regex lookbehind 不能作为 js regex lookbehind 工作
- java - 如何在String Android中获取一些字符
- symfony - 身份验证问题(身份验证成功但在另一个页面中转到“n/A”
- java - java useDelimeter 拆分-
- javascript - 要求未定义
- agda - 这个模数的公式是一个集合吗?