我正在实现一个将执行一些耗时任务的函数,我想通过更改指示我的函数开始执行的 CPU 时间的变量来稍微修改基准测试部分。这是代码:
#if defined(_MSC_VER)
#pragma intrinsic(__rdtsc)
#else
static __inline__ uint64_t __rdtsc() {
uint32_t hi, lo;
__asm__ volatile
(
"rdtsc"
: "=a"(lo), "=d"(hi)
);
return (((uint64_t) hi) << 32) | ((uint64_t) lo);
}
#endif
int arg = 42;
uint64_t start_tSC, end_tSC;
// Get total clock cycles for func
start_tSC = __rdtsc();
func(arg);
end_tSC = __rdtsc();
double func_tSC = end_tSC - start_tSC; // <---- let's minimize this
基本上,我想设置start_tSC
之前的所有任务已完成,当前时钟时间戳右内func
。
void func(int arg) {
perform_tasks(arg);
/* black magic that resets start_tSC in the CALLER */
}
由于局部变量和函数参数倾向于存储在堆栈中,我可以start_tSC
通过查看 的地址以某种方式推断出驻留的位置arg
吗?
系统信息
~ $ uname -a
Linux hive30 4.15.0-36-generic #39~16.04.1-Ubuntu SMP Tue Sep 25 08:59:23 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
另请注意,我可以以普通用户身份访问目标系统,这意味着我可以构建可执行文件并通过gcc -S
. 如果相关,这里是一些硬件信息。