当我在一些原始图像处理操作中尝试使用SIMD指令内在函数时,我正在构建一个微基准来衡量性能变化。但是,编写有用的微基准很困难,所以我想首先了解(并尽可能消除)尽可能多的变化和错误来源。我必须考虑的一个因素是测量代码本身的开销。我正在使用RDTSC进行测量,并且正在使用以下代码来查找测量开销:externinlineunsignedlonglong__attribute__((always_inline))rdtsc64(){unsignedinthi,lo;__asm____volatile__("xorl%%eax,%%eax\n\t""cpuid\n\t""rdtsc":"=a"(
假设我们正在尝试使用tsc进行性能监控,并且我们希望防止指令重新排序。这些是我们的选择:1:rdtscp是一个序列化调用。它可以防止围绕对rdtscp的调用进行重新排序。__asm____volatile__("rdtscp;"//serializingreadoftsc"shl$32,%%rdx;"//shifthigher32bitsstoredinrdxup"or%%rdx,%%rax"//andorontorax:"=a"(tsc)//outputtotscvariable::"%rcx","%rdx");//rcxandrdxareclobbered但是,rdtscp仅在较新
我从一个线程发送网络数据包,并在另一个CPU内核上运行的第二个线程接收回复。我的过程测量每个数据包的发送和接收之间的时间(类似于ping)。我正在使用rdtsc来获得高分辨率、低开销的时序,这是我的实现所需要的。所有测量结果看起来都很可靠。尽管如此,我还是担心跨内核的rdtsc准确性,因为我一直在阅读一些暗示tsc在内核之间不同步的文本。我找到了以下关于TSCinwikipedia的信息ConstantTSCbehaviorensuresthatthedurationofeachclocktickisuniformandsupportstheuseoftheTSCasawallcloc