Adding Basic Intel® ITT Instrumentation to Your Application
The Intel® GPA Platform Analyzer is an instrumentation-based tool. It obtains its data from gpa_trace files, which are generated by Intel® GPA while profiling an application that has been instrumented with ITT API calls.
To get started, you will need to use the following API calls:
- __itt_domain_create(): Creates a domain required in most Intel ITT API calls. You need to define at least one domain.
- __itt_string_handle_create(): Creates string handles for identifying your tasks. String handles are more efficient for identifying traces than strings.
- __itt_task_begin(): Marks the beginning of a task.
- __itt_task_end(): Marks the end of a task.
The following sample shows how these four basic Intel ITT API functions are used in a multi threaded application.
#include <windows.h>
#include <ittnotify.h>
// Forward declaration of a thread function.
DWORD WINAPI workerthread(LPVOID);
bool g_done = false;
// Create a domain that is visible globally: we will use it in our example.
__itt_domain* domain = __itt_domain_create(“Example.Domain.Global”);
// Create string handles which associates with the “main” task.
__itt_string_handle* handle_main = __itt_string_handle_create(“main”);
__itt_string_handle* handle_exe_name = __itt_string_handle_create(“ExeName”);
__itt_string_handle* handle_createthread = __itt_string_handle_create(“CreateThread”);
void main(int, char* argv[])
{
// Create a task associated with the “main” routine.
__itt_task_begin(domain, __itt_null, __itt_null, handle_main);
// Save the name of the app’s exe that we can show when analyzing traces.
__itt_metadata_str_add(domain, __itt_null, handle_exe_name, argv[0], 0);
// Now we’ll create 4 worker threads
for (int i = 0; i < 4; i++)
{
// We might be curious about the cost of CreateThread. We add tracing to do the measurement.
__itt_task_begin(domain, __itt_null, __itt_null, handle_createthread);
::CreateThread(NULL, 0, workerthread, (LPVOID)i, 0, NULL);
__itt_task_end(domain);
}
// Wait a while,…
::Sleep(5000);
g_done = true;
// Mark the end of the main task
__itt_task_end(domain);
}
// Create string handle for the work task.
__itt_string_handle* handle_work = __itt_string_handle_create(“work”);
DWORD WINAPI workerthread(LPVOID data)
{
// Set the name of this thread so it shows up in the UI as something meaningful
char threadname[32];
wsprintf(threadname, “Worker Thread %d”, data);
__itt_thread_set_name(threadname);
// Each worker thread does some number of “work” tasks
while(!g_done)
{
__itt_task_begin(domain, __itt_null, __itt_null, handle_work);
::Sleep(150);
__itt_task_end(domain);
}
return 0;
}
See Also
__itt_domain_create
__itt_string_handle_create
__itt_task_begin
__itt_task_end