我开发了一个小小的基准。这个基准内循环的结果应该转换为零,下一轮我的计算应该依赖于循环之前的零“结果”来度量代码的延迟,而不是它的输出。MOVing将结果转到另一个寄存器,而XORing本身则无法工作,因为今天的CPU认识到,具有自身的XOR不依赖于前面的说明。因此,我试图从寄存器本身减去,希望CPU (RyzenThreadrap3990X)没有像XOR那样的快捷方式。我用一个单独的程序对此进行了评估:
#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?
发布于 2022-03-11 12:59:18
使用即时为零的and。
and eax, 0xor eax, eax和sub eax, eax这两种指令都被认为是归零成语,但不会起作用。
https://stackoverflow.com/questions/71438825
复制相似问题