perf_event with openMP

时间:2015-10-08 06:39:26

标签: openmp performancecounter perf

我正在使用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

0 个答案:

没有答案