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;}