インテル® VTune™ プロファイラー・ユーザーガイド

タスク API

タスクは、特定のスレッドで実行されるワークの論理単位です。タスクは入れ子にできます。そのため、通常、タスクは関数、スコープ、または switch 文の case ブロックに対応します。タスクをスレッドに割り当てるためタスク API を使用できます。

タスク API は再開状態で動作するスレッド単位の関数です。この関数はポーズ状態では動作しません。

タスク API により、スレッドが現在のタスクをサスペンドして異なるタスクに切り替えたり (タスクスイッチ)、またはタスクが異なるスレッドに移動 (タスクスチール) することはありません。

タスクのインスタンスは、ある期間に特定のスレッドが実行するワークを表します。タスクは同一スレッドで __itt_task_begin()__itt_task_end() で囲んで定義します。

使用するプリミティブ

説明

void __itt_task_begin (const __itt_domain *domain,__itt_id taskid, __itt_id parentid, __itt_string_handle *name)

スレッドのタスク・インスタンスを作成します。これは、スレッドの現在のタスク・インスタンスとなります。同じスレッドで __itt_task_end() を呼び出すとタスク・インスタンスは終了します。

パラメーター:

[in]

domain

このタスクのドメインです。

[in]

taskid

このパラメーターは予約済みであり、__itt_null である必要があります。

[in]

parentid

このタスクが属する親インスタンス、または __itt_null

[in]

name

タスクの名前です。

void __itt_task_end (const __itt_domain *domain)

現在のタスクの終了を示します。

[in]

domain

このタスクのドメインです。

結果にユーザータスクを表示するには、[解析の設定] で [ユーザータスクの解析] チェックボックスをオンにします。

ITTAPI__itt_task_* 関数のパラメーター

次の表は、タスク API プリミティブで使用するパラメーターを定義します。

パラメーター

説明

__itt_domain

タスクのドメイン。

__itt_id taskid

予約済みのパラメーター。

__itt_id parentid

予約済みのパラメーター。

__itt_string_handle

タスク文字列のハンドル。

タスク API を有効にする

タスク API を使用するには、次の手順に従ってください。

  1. ittnotify.h ヘッダーをインクルードします。
  2. タスクのドメインと文字列ハンドルを作成します。
  3. コードにタスクの begin と end マーカーを挿入します。
  4. libittnotify.lib (Windows*) または libittnotify.a (Linux*) とリンクします。
  5. プロファイルを開始する前に、[ユーザータスク、イベントおよびカウンターを解析] オプションを有効にします。詳細については、「タスク解析」をご覧ください。

使用例

次のコードは、グローバルスコープでドメインと 2 つのタスクを生成します。


#include "ittnotify.h"

void do_foo(double seconds);

__itt_domain* domain = __itt_domain_create("MyTraces.MyDomain");
__itt_string_handle* shMyTask = __itt_string_handle_create("My Task");
__itt_string_handle* shMySubtask = __itt_string_handle_create("My SubTask");

void BeginFrame() {
     __itt_task_begin(domain, __itt_null, __itt_null, shMyTask);
     do_foo(1);
}

void DoWork() {
     __itt_task_begin(domain, __itt_null, __itt_null, shMySubtask);
     do_foo(1);
     __itt_task_end(domain);
}
void EndFrame() {
     do_foo(1);
     __itt_task_end(domain);
}

int main() {
    BeginFrame();
    DoWork();
    EndFrame();
    return 0;
}

#ifdef _WIN32
#include <ctime>

void do_foo(double seconds) {
    clock_t goal = (clock_t)((double)clock() + seconds * CLOCKS_PER_SEC);
    while (goal > clock());
}
#else
#include <time.h>

#define NSEC 1000000000
#define TYPE long

void do_foo(double sec) {
      struct timespec start_time;
      struct timespec current_time;

      clock_gettime(CLOCK_REALTIME, &start_time);
      while(1) {
          clock_gettime(CLOCK_REALTIME, &current_time);
          TYPE cur_nsec=(long)((current_time.tv_sec-start_time.tv_sec-sec)*NSEC + current_time.tv_nsec - start_time.tv_nsec);
          if(cur_nsec>=0)
                break;
      }
}
#endif

関連情報