c++ 如何使用CPUID作为序列化指令?

fd3cxomn  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(180)

CPUID可以用作序列化指令,如herehere所述。在C++中以这种方式使用它的最小/最简单的asm语法是什么?

// Is that enough?
// What to do with registers and memory?
// Is volatile necessary?
asm volatile("CPUID":::);
z9smfwbn

z9smfwbn1#

如果目标是序列化一段代码,可以执行如下操作:

asm __volatile__ (
      " mfence \n"   // drain the store buffer
      " lfence \n"   // and wait for that instruction to retire, draining the ROB
      ::: "memory"); // block compile-time reordering.
Your code here
  asm __volatile__ (
      " mfence \n"
      " lfence \n"
      ::: "memory" );

就内存和指令重新排序而言,这差不多是从cpuid中获得的序列化程度。但在英特尔的技术术语中,这两个指令都不是正式的序列化指令。
软件预取并不保证按fence指令排序,因此至少在理论上,较早的prefetcht0可能导致数据在lfence之后到达。(但是prefetcht0after 一个lfencelfence完成之前不能执行,因为在lfence之后没有指令被发送到执行单元,直到所有较早的指令都已引退。
lfence阻塞指令重新排序是Intel CPU的一贯工作方式,但AMD仅使用MSR设置。执行Spectre缓解的操作系统会设置MSR:Is LFENCE serializing on AMD processors?

相关问题