首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指令,其结果为0,但不破坏依赖关系。

指令,其结果为0,但不破坏依赖关系。
EN

Stack Overflow用户
提问于 2022-03-11 12:53:09
回答 1查看 81关注 0票数 4

我开发了一个小小的基准。这个基准内循环的结果应该转换为零,下一轮我的计算应该依赖于循环之前的零“结果”来度量代码的延迟,而不是它的输出。MOVing将结果转到另一个寄存器,而XORing本身则无法工作,因为今天的CPU认识到,具有自身的XOR不依赖于前面的说明。因此,我试图从寄存器本身减去,希望CPU (RyzenThreadrap3990X)没有像XOR那样的快捷方式。我用一个单独的程序对此进行了评估:

代码语言:javascript
复制
#include <iostream>
#include <chrono>

using namespace std;
using namespace chrono;

int main()
{
    auto start = high_resolution_clock::now();
    for( size_t i = 1'000'000'000; i--; )
        __asm
        {
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
        }
    double ns = (int64_t)duration_cast<nanoseconds>( high_resolution_clock::now() - start ).count() / 10'000'000'000.0;
    cout << ns << endl;
}

不幸的是,CPU在这里也做了一个快捷方式,每条指令大约需要0.06ns,即。CPU在每个时钟周期(4,3 the )做大约6个子eax,eax。

那么,是否有一种方法可以使指令产生零,并且该指令依赖于之前的指令,而该指令依赖于一个慢速CPU?

EN

回答 1

Stack Overflow用户

发布于 2022-03-11 12:59:18

使用即时为零的and

代码语言:javascript
复制
and eax, 0

xor eax, eaxsub eax, eax这两种指令都被认为是归零成语,但不会起作用。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71438825

复制
相关文章

相似问题

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