C++ RDTSC:返回循环结束前的时间

C++ RDTSC:返回循环结束前的时间,c++,rdtsc,C++,Rdtsc,我试图测量函数的性能 double microbenchmark\u get\u sqrt\u latency() { myInt64开始,结束; 列表周期列表; int num_runs=40; 双循环=0。; 双乘数=1。; 双x=500; //重复测量1000次 对于(尺寸i=0;i

我试图测量函数的性能

double microbenchmark\u get\u sqrt\u latency()
{
myInt64开始,结束;
列表周期列表;
int num_runs=40;
双循环=0。;
双乘数=1。;
双x=500;
//重复测量1000次
对于(尺寸i=0;i<1000;i++)
{
//测量。。。
start=start_tsc();
对于(大小j=0;j
这里的问题是,对于变量
end
,它表示自第一条
rdtsc
指令以来发生的循环数始终等于22-24,即使
num_runs
的变化量高达10000。对此我没有任何解释,除了指令可能在for循环的第一次迭代之后移动

我使用的编译器和编译器标志是:
-O3-fno-tree-vectorize-march=skylake-std=c++17

下面是
start\u tsc()
stop\u tsc()
的实现:

#定义RDTSC(cpu#c)\
ASM挥发性(“rdtsc”\
:“=a”((cpu_c.int32.lo),“=d”((cpu_c.int32.hi))
#定义CPUID()\
ASM易失性(“cpuid”\
:        \
:“a”(0)\
:“bx”、“cx”、“dx”)
无符号长启动\u tsc(无效)
{
tsc_计数器启动;
CPUID();
RDTSC(start);
返回计数器值(启动);
}
无符号长时间停止(无符号长时间启动)
{
tsc_计数器端;
RDTSC(结束);
CPUID();
返回计数器值(结束)-开始;
}

代码有什么问题?我希望
end
变量与
num\u runs
成比例,但它不在这里。有什么想法吗?< /P>我不是一个程序组,而是类型双关(这就是你使用<代码> TSCCUBAUT/<代码>)在C++中是不合法的,所以编译器可能会做一些你不期望的事情。您是否可以将两个
std::uint32\u t
提供给
rdtsc
,然后在返回时(通过
ing)合并结果?另外,使函数返回
std::uint64\u t
,而不是
unsigned long
(即使可能是相同的事情)。是否需要
myInt64
?在使用
无符号long-long
的计算中使用它,因此也可以使用
std::uint64\u t
。不需要
myInt64
。我忘了在代码中更改它。我现在就做这些修改,看看是否更好。
sqrtsd(x)
有副作用吗?如果不是,编译器可能只是对其进行了优化。由于没有对返回值执行任何操作,因此假设
sqrtsd
没有副作用,调用它1000次、调用它1次和调用它0次都会给出相同的行为。编译器只需设置
j=num\u runs
并继续。我建议查看函数的反汇编,也许。建议改用内置的
\uu rdtsc()
。我用
g++
clang++
对它进行了测试,结果很好。答案中的
include
s表明它也适用于MSVC。sqrt的定义如下:
cpp静态双sqrtsd(double x){double r;u asm_u(“sqrtsd%1,%0”:“=x”(r):“x”(x));返回r;}