当前位置: 首页 > 知识库问答 >
问题:

结果为0但不破坏依赖关系的指令[重复]

慕震博
2023-03-14

开发了一个小基准。这个基准中循环的结果应该转换为零,我的下一轮计算应该取决于之前循环的零“结果”来测量代码的延迟,而不是它的通过。将结果移动到另一个寄存器和异或本身不起作用,因为今天的CPU认识到与自身的异或不依赖于之前的指令。所以我试图从自身中减去寄存器,希望CPU(Ryzen Threadripper 3990X)没有像异或那样的快捷方式。我用一个单独的程序对此进行了评估:

#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,3GHz)中执行大约六个子eax。

那么有没有一种方法可以让一条指令导致零,并且该指令依赖于moderen CPU上之前的指令?

共有1个答案

糜单弓
2023-03-14

使用立即为零的

and eax, 0

指令异或eax,eax和子eax,eax都被认为是零习惯用法,不会起作用。

 类似资料:
  • Remove wrapper, open mouth, insert muffin, eat. — Instructions on 7-11 muffin packaging 为确保事物以正确的顺序发生,你可以在 Puppet 中指定一个资源依赖另一个资源, 例如:你必须先安装软件包 X 然后再启动它提供的服务,因此应该标记这项服务依赖于软件包 X。 Puppet 会按要求的顺序排出它遇到的所有依

  • 我有一个Gradle构建脚本,包含以下依赖项(其他不多):

  • 我最近遇到了一个问题。我看了一段关于数据依赖性的视频。讲师说,通过对指令重新排序,可以解决数据依赖性问题。写入后读取危险示例: 在这种情况下,第二条指令有两个档位。通过重新排序指令: 我们消除了先读后写的危险。从技术上讲,这是正确的。但是,我想知道,第二种方法是否在逻辑上是错误的,并且会引入错误的结果? 如果我错了,请纠正我,因为我是新手。

  • 编写的PHP扩展需要需要依赖另外一个扩展,在PHP-X中可以调用Extension->require来实现。 PHPX_EXTENSION() { Extension *ext = new Extension("test", "0.0.1"); ext->require("swoole"); ext->require("sockets"); return ext;

  • 依赖关系 这是一个非常轻量级的模块,没有其他依赖项。希望大家在JVM或Android上使用以太坊的RLP编码的项目时会选择使用这个模块,而不再编写自己的实现。

  • 依赖关系 ABI一个非常轻量级的模块,唯一的第三方依赖是 Bouncy Castle,用于hash加密 (Spongy Castle on Android)。 最后希望java和安卓开发者,在JVM或Android上有以太坊ABI合作的项目时会选择使用这个模块,而不是再编写自己的实现。