使用PAPI分析缓存未命中的单独pthread

时间:2017-11-14 13:56:21

标签: c++ pthreads profiling perf papi

我正在尝试调查我的程序的性能,而缓存未命中是一个巨大的瓶颈。出于测试目的,在将PAPI实现到目标应用程序之前,我需要验证内容是如何工作的,这就是我发布示例程序的原因。

我的目的是使用PAPI来监视单独线程的缓存未命中。我正在尝试使用PAPI_attach将我的事件集应用于特定的线程ID,但是,当我不使用{{1}时,我测量的缓存未命中仍然相同(或至少非常相似) }。

我为验证我的担忧而做的另一个实验是在这个非常简单的程序运行期间启动Firefox浏览器。这使得测量的缓存未命中数量增加,显然,对于PAPI_attach函数以及我如何使用它有些奇怪。

为我的线程工作者使用以下代码:

PAPI_attach

以下代码产生线程:

void * Slave(void * args)
{

   int rc = 0;
   int tmp, i, j;
   /*must be initialized to PAPI_NULL before calling PAPI_create_event*/
   int EventSet = PAPI_NULL;
   long long values[NUM_EVENTS];
   /*This is where we store the values we read from the eventset */

   /* We use number to keep track of the number of events in the EventSet */ 
   int retval, number;


   pid_t tid;
   tid = syscall(SYS_gettid);

   char errstring[PAPI_MAX_STR_LEN];

   /* get the number of events in the event set */
   number = 0;

   printf("My pid is: %d\n", tid);

   if ( (retval=PAPI_register_thread())!= PAPI_OK )
       ERROR_RETURN(retval);

   if ( (retval = PAPI_create_eventset(&EventSet)) != PAPI_OK)
      ERROR_RETURN(retval);

   /* Add Total Instructions Executed to the EventSet */
   if ( (retval = PAPI_add_event(EventSet, PAPI_L1_TCM)) != PAPI_OK)
      ERROR_RETURN(retval);

   /* Add Total Cycles event to the EventSet */
   if ( (retval = PAPI_add_event(EventSet, PAPI_L2_TCM)) != PAPI_OK)
      ERROR_RETURN(retval);

   if ( (retval = PAPI_add_event(EventSet, PAPI_L3_TCM)) != PAPI_OK)
      ERROR_RETURN(retval);

   number = 0;
   if ( (retval = PAPI_list_events(EventSet, NULL, &number)) != PAPI_OK)
      ERROR_RETURN(retval);

   printf("There are %d events in the event set\n", (unsigned int)number);

   if ((retval = PAPI_attach(EventSet, tid)) != PAPI_OK)
      ERROR_RETURN(retval);
   /* Start counting */

   if ( (retval = PAPI_start(EventSet)) != PAPI_OK)
      ERROR_RETURN(retval);

   /* you can replace your code here */

   tmp=0;
   for (i = 0; i < 200000000; i++)
   {
      tmp = i + tmp;
   }

   if ( (retval=PAPI_read(EventSet, values)) != PAPI_OK)
      ERROR_RETURN(retval);

   printf("L1 misses %lld \n", values[0] );
   printf("L2 misses %lld \n",values[1]);
   printf("L3 misses %lld \n",values[2]);

   if ( (retval = PAPI_stop(EventSet, values)) != PAPI_OK)
      ERROR_RETURN(retval);



   /* free the resources used by PAPI */
   PAPI_shutdown();

}

糟糕的是我没有错误,这表明一切正常。

0 个答案:

没有答案