gpt4 book ai didi

multithreading - 分支预测和多线程

转载 作者:行者123 更新时间:2023-12-03 12:54:46 27 4
gpt4 key购买 nike

让我们假设一个像这样的简单if:

if (something)
// do_something
else
// do_else

假设此 if-else 语句在不同线程中并行执行,并且每个线程产生不同的结果,但在其自身的生命周期中保持不变。例如,在线程 1 中,条件总是被评估为 false,在线程 2 中,条件总是被评估为 true;在线程 3 中也始终为真,依此类推。

分支预测是否考虑了每个线程的执行上下文来进行统计?因为如果不是(我不这么认为,但很难通过测试来检查),CPU 将看到条件遵循随机模式并且根本不会预测。

最佳答案

如果我们忽略 SMT(例如超线程),大多数架构的每个硬件线程都有一个分支预测器。它与单个核心的获取单元紧密耦合。少数(AMD?)将一些分支预测信息存储在 L1/L2 I 缓存中,但主要针对下一次提取。

因此,如果您不在 SMT 上运行您的代码,您就像在天堂一样,并且每次都会获得 100% 的预测,而代价是一些指令。

如果您在 SMT 上运行您的代码,您通常会发现您的生活一团糟,有 50% 以上的错误预测。

现在您可以轻松解决您的问题,您只需使用更多代码,更早地检查您的条件并调用代码的分支,其中包含 do_something 或 do_else。

如果你有一个循环在你有分支的地方调用你的函数,你可以这样做:

如果(某事) do_something_loop();别的 do_else_loop();

void do_something_loop() { 对于(自动 x : myVec) 做一点事;

这样做的缺点是您需要维护 2 个几乎相等的代码分支。

或者你可以在函数调用 branch_me() 中创建你的分支,你可以创建一个模板函数,并且由于死代码消除的魔力,你不应该在循环中得到任何分支。

C++ 概念代码。

template<bool b_something>
void brancher() {
// do things
if (b_something)
// do_something
else
// do_else
}
// do more things
}

void branch_user() {
if (something) {
for (auto x : myVec)
brancher<true>();
} else {
for (auto x : myVec)
brancher<false>();
}
}

现在您只需要维护外部函数的 2 个分支,希望工作量减少。

关于multithreading - 分支预测和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39557614/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com