我正在使用perf_event来衡量效果信息。我确认指令计数器在单核中运行良好。 但是,当我尝试使用openMP进行并行计算时,结果似乎有些不对。 我想如果核心数量改变了,指令计数器是一样的。
for(int i=1; i<=8; i++)
{
cnt=0;
omp_set_num_threads(i);
ioctl(pc_c, PERF_EVENT_IOC_RESET, 0);
ioctl(pc_c, PERF_EVENT_IOC_ENABLE, 0);
#pragma omp parallel for
for(int tid = 0; tid < 1000000; tid++)
{
//sleep(0.2);
cnt ++;
}
ioctl(pc_c, PERF_EVENT_IOC_DISABLE, 0);
read(pc_c, &pc_c_result, sizeof(long long));
}
当我使用睡眠(0.2)时,结果似乎是正常的。
// result
core[1] perf count = 25006756
core[2] perf count = 14681730
core[3] perf count = 10166403
core[4] perf count = 7601514
core[5] perf count = 7165846
core[6] perf count = 4202816
core[7] perf count = 3621566
core[8] perf count = 3247411
我知道这个结果是关于一个核心的。所以,这个结果是正确的。 但是,当我使用cnt ++而不是sleep函数时,结果完全不同。
core[1] perf count = 5735
core[2] perf count = 74244
core[3] perf count = 57295
core[4] perf count = 2976047
core[5] perf count = 35821
core[6] perf count = 2112339
core[7] perf count = 10487
core[8] perf count = 3885038
我找不到关于此结果的任何规则。 是不是有人知道这个?
我提到了这个网站 http://man7.org/linux/man-pages/man2/perf_event_open.2.html#EXAMPLE