我在Linux代码中没有找unlikely和likely的定义.
在源代码中搜索出来很多无法找.
请各位赐教!
谢谢!
7 个解决方案
#1
指令优化的东西
控制CPU的指令预取
控制CPU的指令预取
#2
指令优化的东西
控制CPU的指令预取
?
怎么优化呀?举个例好吗?
THX
控制CPU的指令预取
?
怎么优化呀?举个例好吗?
THX
#3
内核里有很多线程的代码啊
其实就是告诉编译器哪个分支在实际运行时更可能运行以便产生分支预测相关的机器指令。
用likely 标记那些极有可能运行的分支,而用unlikely标记很少运行的分支来实现优化
其实就是告诉编译器哪个分支在实际运行时更可能运行以便产生分支预测相关的机器指令。
用likely 标记那些极有可能运行的分支,而用unlikely标记很少运行的分支来实现优化
#4
是GCC对C的扩展,unlikely和likely分别表示一个表达式不太可能为真或很可能为真,这样编译器能够更好的优化指令预取,提高运行效率。
例如在写类似断言或检查错误状态的时候经常使用,因为一般情况下错误总是不大可能发生的。
例如在写类似断言或检查错误状态的时候经常使用,因为一般情况下错误总是不大可能发生的。
#5
下面节自《Linux Kernel Development》 2nd , 第二章
(书可以在http://elinux.cn下载)
Branch Annotation
The gcc C compiler has a built-in directive that optimizes conditional branches as either very likely taken or very unlikely taken. The compiler uses the directive to appropriately optimize the branch. The kernel wraps the directive in very easy-to-use macros, likely() and unlikely().
For example, consider an if statement such as the following:
if (foo) {
/* ... */
}
To mark this branch as very unlikely taken (that is, likely not taken):
/* we predict foo is nearly always zero ... */
if (unlikely(foo)) {
/* ... */
}
Conversely, to mark a branch as very likely taken:
/* we predict foo is nearly always nonzero ... */
if (likely(foo)) {
/* ... */
}
You should only use these directives when the branch direction is overwhelmingly a known priori or when you want to optimize a specific case at the cost of the other case. This is an important point: These directives result in a performance boost when the branch is correctly predicted, but a performance loss when the branch is mispredicted. A very common usage for unlikely() and likely() is error conditions. As one might expect, unlikely() finds much more use in the kernel because if statements tend to indicate a special case.
(书可以在http://elinux.cn下载)
Branch Annotation
The gcc C compiler has a built-in directive that optimizes conditional branches as either very likely taken or very unlikely taken. The compiler uses the directive to appropriately optimize the branch. The kernel wraps the directive in very easy-to-use macros, likely() and unlikely().
For example, consider an if statement such as the following:
if (foo) {
/* ... */
}
To mark this branch as very unlikely taken (that is, likely not taken):
/* we predict foo is nearly always zero ... */
if (unlikely(foo)) {
/* ... */
}
Conversely, to mark a branch as very likely taken:
/* we predict foo is nearly always nonzero ... */
if (likely(foo)) {
/* ... */
}
You should only use these directives when the branch direction is overwhelmingly a known priori or when you want to optimize a specific case at the cost of the other case. This is an important point: These directives result in a performance boost when the branch is correctly predicted, but a performance loss when the branch is mispredicted. A very common usage for unlikely() and likely() is error conditions. As one might expect, unlikely() finds much more use in the kernel because if statements tend to indicate a special case.
#6
ls正解,内核的模块很多都是这样的,比如内核地址空间地址fixup,
.section .fixup
.previous
不大可能出现的代码被编译器安排到远的地方,这样可以充分利用CPU的流水线技术。
.section .fixup
.previous
不大可能出现的代码被编译器安排到远的地方,这样可以充分利用CPU的流水线技术。
#7
现学现卖。。呵呵。。
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
likely是一个宏, __builtin_expect 才是gcc 扩展。
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
likely是一个宏, __builtin_expect 才是gcc 扩展。
#1
指令优化的东西
控制CPU的指令预取
控制CPU的指令预取
#2
指令优化的东西
控制CPU的指令预取
?
怎么优化呀?举个例好吗?
THX
控制CPU的指令预取
?
怎么优化呀?举个例好吗?
THX
#3
内核里有很多线程的代码啊
其实就是告诉编译器哪个分支在实际运行时更可能运行以便产生分支预测相关的机器指令。
用likely 标记那些极有可能运行的分支,而用unlikely标记很少运行的分支来实现优化
其实就是告诉编译器哪个分支在实际运行时更可能运行以便产生分支预测相关的机器指令。
用likely 标记那些极有可能运行的分支,而用unlikely标记很少运行的分支来实现优化
#4
是GCC对C的扩展,unlikely和likely分别表示一个表达式不太可能为真或很可能为真,这样编译器能够更好的优化指令预取,提高运行效率。
例如在写类似断言或检查错误状态的时候经常使用,因为一般情况下错误总是不大可能发生的。
例如在写类似断言或检查错误状态的时候经常使用,因为一般情况下错误总是不大可能发生的。
#5
下面节自《Linux Kernel Development》 2nd , 第二章
(书可以在http://elinux.cn下载)
Branch Annotation
The gcc C compiler has a built-in directive that optimizes conditional branches as either very likely taken or very unlikely taken. The compiler uses the directive to appropriately optimize the branch. The kernel wraps the directive in very easy-to-use macros, likely() and unlikely().
For example, consider an if statement such as the following:
if (foo) {
/* ... */
}
To mark this branch as very unlikely taken (that is, likely not taken):
/* we predict foo is nearly always zero ... */
if (unlikely(foo)) {
/* ... */
}
Conversely, to mark a branch as very likely taken:
/* we predict foo is nearly always nonzero ... */
if (likely(foo)) {
/* ... */
}
You should only use these directives when the branch direction is overwhelmingly a known priori or when you want to optimize a specific case at the cost of the other case. This is an important point: These directives result in a performance boost when the branch is correctly predicted, but a performance loss when the branch is mispredicted. A very common usage for unlikely() and likely() is error conditions. As one might expect, unlikely() finds much more use in the kernel because if statements tend to indicate a special case.
(书可以在http://elinux.cn下载)
Branch Annotation
The gcc C compiler has a built-in directive that optimizes conditional branches as either very likely taken or very unlikely taken. The compiler uses the directive to appropriately optimize the branch. The kernel wraps the directive in very easy-to-use macros, likely() and unlikely().
For example, consider an if statement such as the following:
if (foo) {
/* ... */
}
To mark this branch as very unlikely taken (that is, likely not taken):
/* we predict foo is nearly always zero ... */
if (unlikely(foo)) {
/* ... */
}
Conversely, to mark a branch as very likely taken:
/* we predict foo is nearly always nonzero ... */
if (likely(foo)) {
/* ... */
}
You should only use these directives when the branch direction is overwhelmingly a known priori or when you want to optimize a specific case at the cost of the other case. This is an important point: These directives result in a performance boost when the branch is correctly predicted, but a performance loss when the branch is mispredicted. A very common usage for unlikely() and likely() is error conditions. As one might expect, unlikely() finds much more use in the kernel because if statements tend to indicate a special case.
#6
ls正解,内核的模块很多都是这样的,比如内核地址空间地址fixup,
.section .fixup
.previous
不大可能出现的代码被编译器安排到远的地方,这样可以充分利用CPU的流水线技术。
.section .fixup
.previous
不大可能出现的代码被编译器安排到远的地方,这样可以充分利用CPU的流水线技术。
#7
现学现卖。。呵呵。。
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
likely是一个宏, __builtin_expect 才是gcc 扩展。
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
likely是一个宏, __builtin_expect 才是gcc 扩展。