gpt4 book ai didi

c - 内联 asm 代码组织

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:08 25 4
gpt4 key购买 nike

我刚刚编写了一些小的内联 asm 例程来查询 x86 中的时间戳计数器,以便我可以分析一小部分代码。我真的很想将这些例程放在 header 中,以便我可以在许多不同的源文件中重用它们所以基本上我的问题是我是否应该只在宏中组织它们或使它们成为内联函数,我对内联的怀疑是它不是必然的情况是编译器实际上会内联它并且因为它是一个性能敏感的调用我宁愿跳过函数调用开销,另一方面使用宏整个类型安全消失并且我将严格需要一个 32 位 int ,我假设我可以在评论中添加规范,但由于有很多警告,我仍然尽量避免使用宏。这是代码:

inline void rdtsc(uint64_t* cycles)
{
uint32_t cycles_high, cycles_low;

asm volatile (
".att_syntax\n"
"CPUID\n\t" //Serialize
"RDTSC\n\t" //Read clock and cpuid
"mov %%edx, %0 \n\t"
"mov %%eax, %1 \n\t"
: "=r" (cycles_high), "=r" (cycles_low)
:: "%edx", "%eax");

*cycles = ((uint64_t) cycles_high << 32) | cycles_low;
}

欢迎就此提出任何建议。我只是想弄清楚在这种情况下首选的风格是什么。

最佳答案

由于您将测量部分代码的性能,不一定总是整个函数,因此您不应尝试内联您的性能计数器。是否有调用开销并不重要。重要的是测量是一致的,这意味着您要么希望始终存在调用开销,要么永远不存在。第一个比前者更容易实现。

让代码的每一部分都有相同的调用开销。

关于c - 内联 asm 代码组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27214156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com