インテル® VTune™ プロファイラーでパフォーマンス・データを収集する際に、ITT API を最大限に活用するには、コードに API を追加して論理タスクを指定する必要があります。これは、ほかの CPU と GPU タスクに関連するコード中のタスク間の関係 (開始と終了を含む) を可視化するのに役立ちます。
最上位レベルのタスクは、特定のスレッドで実行される論理的なワークグループであり、プログラム内のコードのグループに対応しています。__itt_task_begin と __itt_task_end 呼び出しを使用して、論理タスクの始まりと終わりを識別するするためコードをマークアップできます。例えば、"陰影の詳細" とは別に "煙のレンダリング" をトレースするには、それらのコードモジュールに API 呼び出しを追加する必要があります。
次の API 呼び出しから導入することを推奨します。
以下は、マルチスレッド・アプリケーションで使用される 4 つの基本的な ITT API 関数です。
#include <windows.h>
#include <ittnotify.h>
// スレッド関数の前方宣言。
DWORD WINAPI workerthread(LPVOID);
bool g_done = false;
// グローバルに参照可能なドメインを作成: この例ではこれを使用します。
__itt_domain* domain = __itt_domain_create("Example.Domain.Global");
// "main" タスクに関連付ける文字列ハンドルを作成。
__itt_string_handle* handle_main = __itt_string_handle_create("main");
__itt_string_handle* handle_createthread = __itt_string_handle_create("CreateThread");
void main(int, char* argv[])
{
// "main" ルーチンに関連付けるタスクを作成。
__itt_task_begin(domain, __itt_null, __itt_null, handle_main);
// 4 つのワーカースレッドを作成。
for (int i = 0; i < 4; i++)
{
// CreateThread のコストは ? 測定のためトレース API を追加します。
__itt_task_begin(domain, __itt_null, __itt_null, handle_createthread);
::CreateThread(NULL, 0, workerthread, (LPVOID)i, 0, NULL);
__itt_task_end(domain);
}
// 待機...
::Sleep(5000);
g_done = true;
// main タスクの終了をマーク
__itt_task_end(domain);
}
// ワーカータスクの文字列ハンドルを作成。
__itt_string_handle* handle_work = __itt_string_handle_create("work");
DWORD WINAPI workerthread(LPVOID data)
{
// スレッド名を設定して、UI に表示できるようにします
char threadname[32];
wsprintf(threadname, "Worker Thread %d", data);
__itt_thread_set_name(threadname);
// 各ワーカースレッドは、複数のワークタスクを実行します
while(!g_done)
{
__itt_task_begin(domain, __itt_null, __itt_null, handle_work);
::Sleep(150);
__itt_task_end(domain);
}
return 0;
}