CPU核心间同步延迟测试:AMD与Intel平台rdtsc指令影响差异问询
核心间同步延迟测试:AMD与Intel平台rdtsc监控的差异
我正在开展CPU不同核心间消息同步延迟的测试,具体测量CPU2检测到CPU1修改共享数据所需的时钟周期数。CPU1与CPU2均使用rdtsc指令记录时序,发现AMD与Intel CPU平台的表现存在明显不一致,特寻求相关见解与建议。
测试逻辑
程序包含分别运行在CPU1和CPU2上的"ping"与"pong"两个线程,二者通过轮流递增共享数组shd_data的对应元素实现乒乓循环,最终总运行时间取ts_end-ts_start与tb_end-tb_start的最小值。为测量"ping"操作的平均耗时,我在while循环内添加了rdtsc(tsc_start[loop]);与rdtsc(tsc_end[loop]);两行监控代码,但这两行代码在AMD平台上显著影响了总运行时间:平均乒乓循环耗时从约180周期增至290周期;而在Intel平台上,监控代码完全不影响整体耗时,始终维持在约400周期。
测试代码
#define MAX_LOOPS 10 #define BIDX 0 #define SIDX 15 static volatile int start_flag = 0; static int shd_data[16]; unsigned long tb_start , tb_end, ts_start, ts_end; unsigned long gap[12]; unsigned long tsc_start[MAX_LOOPS]; unsigned long tsc_end[MAX_LOOPS]; void* ping(void *args) { int loop=0; int old = 0; int cur = 0; memset(tsc_start, 0, MAX_LOOPS*sizeof(unsigned long)); memset(shd_data, 0, 64); // preheat while (start_flag == 0) ; // sync. start rdtsc(tb_start); while (++loop < MAX_LOOPS) { rdtsc(tsc_start[loop]); WRITE_ONCE(shd_data[BIDX], shd_data[BIDX]+1); do { cur = READ_ONCE(shd_data[SIDX]); } while (cur <= old); old = cur; } WRITE_ONCE(shd_data[BIDX], shd_data[BIDX]+1); rdtsc(tb_end); return NULL; } void* pong(void *args) { int loop=0; int old = 0; int cur = 0; memset(tsc_end, 0, MAX_LOOPS*sizeof(unsigned long)); memset(shd_data, 0, 64); //preheat while (start_flag == 0) ; // sync. start rdtsc(ts_start); while (++loop < MAX_LOOPS) { do { cur = READ_ONCE(shd_data[BIDX]); rdtsc(tsc_end[loop]); } while (cur <= old); old = cur; WRITE_ONCE(shd_data[SIDX], shd_data[SIDX]+1); } WRITE_ONCE(shd_data[SIDX], shd_data[SIDX]+1); rdtsc(ts_end); return NULL; }
实验环境
- AMD平台:AMD 3910X,编译器gcc-9.4.0
- Intel平台:Intel i9-9900
- 已调整两台机器的CPU Frequency Scaling,将CPU频率固定在3.6GHz基准频率
内容的提问来源于stack exchange,提问作者foool
相关产品推荐
相关产品推荐

