相关疑难解决方法(0)

与不使用if的测试相比,if语句的效率如何?(C++)

我需要一个程序来获取两个数字中较小的一个,我想知道是否使用标准"如果x小于y"

int a, b, low;
if (a < b) low = a;
else low = b;
Run Code Online (Sandbox Code Playgroud)

或多或少效率高于此:

int a, b, low;
low = b + ((a - b) & ((a - b) >> 31));
Run Code Online (Sandbox Code Playgroud)

(或者放在int delta = a - b顶部并随之重新放置实例的变化a - b).

我只是想知道哪一个更有效(或者如果差异太小而不相关),以及if-else语句与一般的替代方案的效率.

c c++ if-statement micro-optimization

21
推荐指数
5
解决办法
8031
查看次数

是什么特意将x86缓存行标记为脏 - 任何写入,或者是否需要显式更改?

这个问题专门针对现代x86-64缓存一致性架构 - 我很欣赏其他CPU的答案可能会有所不同.

如果我写入内存,MESI协议要求首先将缓存行读入缓存,然后在缓存中进行修改(将值写入缓存行,然后将其标记为脏).在较旧的写入微架构中,这将触发高速缓存行被刷新,在写回期间,被刷新的高速缓存行可能会延迟一段时间,并且一些写入组合可能在两种机制下发生(更可能是回写) .我知道这与访问相同缓存行数据的其他核心如何交互 - 缓存监听等.

我的问题是,如果商店恰好匹配缓存中已有的值,如果没有单个位被翻转,那么任何英特尔微架构都会注意到这一点并且将该行标记为脏,从而可能将该行标记为独占,以及在某些时候跟随的回写内存开销?

当我向更多的循环进行矢量化时,我的矢量化操作组合基元不会明确地检查值的变化,并且在CPU/ALU中这样做似乎很浪费,但我想知道底层缓存电路是否可以在没有显式编码的情况下完成(例如,商店微操作或缓存逻辑本身).由于跨多个内核的共享内存带宽变得更加成为资源瓶颈,这似乎是一种越来越有用的优化(例如,重复调整相同的内存缓冲区 - 如果它们已经存在,我们不会重新读取RAM中的值在缓存中,但强制写回相同的值似乎很浪费).回写缓存本身就是对这类问题的承认.

我可以礼貌地要求阻止"在理论上"或"它确实无关紧要"的答案 - 我知道记忆模型是如何工作的,我正在寻找的是关于如何写出相同价值的硬性事实(而不是避免一个商店)将影响内存总线的争用你可以安全地假设是一台运行多个工作负载的机器几乎总是受内存带宽限制.另一方面,解释为什么芯片不这样做的确切原因(我悲观地假设他们没有这样做)将具有启发性......

更新: 这里的预期线路上的一些答案https://softwareengineering.stackexchange.com/questions/302705/are-there-cpus-that-perform-this-possible-l1-cache-write-optimization但仍然很多推测"它必须很难,因为它没有完成",并说如何在主CPU核心中这样做会很昂贵(但我仍然想知道为什么它不能成为实际缓存逻辑本身的一部分).

x86 x86-64 cpu-architecture cpu-cache memory-bandwidth

8
推荐指数
3
解决办法
577
查看次数

为什么 x[i]=if 比 if... x[i]= 快

这让我感到困惑/好奇,为什么这个代码

[见组装]

void maxArray(double* x, double* y) {
    for (int i = 0; i < 65536; i++) {
        x[i] = ((y[i] > x[i]) ? y[i] : x[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

...比这个代码更快?

[见组装]

void maxArray(double* x, double* y) {
    for (int i = 0; i < 65536; i++) {
        if (y[i] > x[i]) x[i] = y[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

并且作为记录,第一个中的结果程序集与扩展版本相同:

inline double fn(double a, double b) {
    if (a > b) {
        return a;
    } else {
        return b;
    }
}
void maxArray(double* …
Run Code Online (Sandbox Code Playgroud)

c x86 gcc x86-64 compiler-optimization

4
推荐指数
1
解决办法
121
查看次数

基于 BitMask 在数组中设置值的本质

是否有一个内在函数可以在输入数组中的所有位置设置单个值,其中相应位置在提供的 BitMask 中具有 1 位?

10101010 是位掩码

值为 121

它将设置位置 0,2,4,6 值为 121

c x86 bit-manipulation intel intrinsics

0
推荐指数
1
解决办法
1854
查看次数