在时间线报告中标注“用户任务”的起始和终止

在VTune™ Amplifier XE 产品中提供了一组用户API接口,包含支持性能数据采集的控制,线程的重命名,循环中每一"帧"的数据采集设置,自定义的同步对象的识别,等。
这里要介绍的是有关"用户关注"的代码(也可称之为"用户任务")在时间线报告上的识别。

我们知道时间线报告给出了程序在运行过程中线程的活动情况,包含状态(运行/等待),CPU的利用率,线程的并发度,线程的转换,等。

当我们的应用程序的含有大量代码而本身有比较复杂时,如何在时间线报告中标出"用户任务"呢?

首先在代码中要使用ittnotify.h

Windows* - Amplifier XE 2011\include\ittnotify.h

Linux* - vtune_amplifier_xe_2011/include/ittnotify.h
 

其次在链接库中加入库函数

Windows* - Amplifier XE 2011\lib32(lib64)\ittnotify.lib

Linux* - vtune_amplifier_xe_2011/lib32(lib64)/libittnotify.a


以下是一个简单的参考代码示例

...

#include <ittnotify.h>

...


__itt_event event_mark_winthread;

void Serial_Pi()

{

   double x, sum = 0.0;

   int i;

 

   for (i=0; i< num_steps; i++){

      x = (i+0.5)*step;

      sum = sum + 4.0/(1.0 + x*x);

   }

 

   pi = step * sum;

 

}

DWORD WINAPI threadFunction(LPVOID pArg)

{

 

    double partialSum = 0.0, x;  // local variables for each thread

    int myNum = *((int *)pArg);

 

    __itt_event_start(event_mark_winthread); // 开始自定义任务

    for ( int i=myNum; i<num_steps; i+=num_threads ) 

    {

        x = (i + 0.5)*step;

        partialSum += 4.0 / (1.0 + x*x); 

    }

    __itt_event_end(event_mark_winthread); // 结束自定义任务

 

    EnterCriticalSection(&cs);

      pi += partialSum * step;  // accumulate partial result to global

    LeaveCriticalSection(&cs);

 

    return 0;

}

 

void WinThread_Pi()

{

    HANDLE threadHandles[num_threads];

    int tNum[num_threads];

 

    InitializeCriticalSection(&cs);

    for ( int i=0; i<num_threads; ++i )

    {

        tNum[i] = i;

        threadHandles[i] = CreateThread( NULL,            // Security attributes

                                         0,               // Stack size

                                         threadFunction,  // Thread function

                                         (LPVOID)&tNum[i],// Data for thread func()

                                         0,               // Thread start mode

                                         NULL);           // Returned thread ID

    }

    WaitForMultipleObjects(num_threads, threadHandles, TRUE, INFINITE);

 

}

int main()
{

 ...
 event_mark_winthread = __itt_event_create ("Mark WinThread", 14);
 if ( !event_mark_winthread )
  return;
 ...
 Serial_Pi();
 WinThread_Pi();
 ... 


user-task.jpg

有关编译器优化的更完整信息,请参阅优化通知