タスク API

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

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

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

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

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

タスク API 関数

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

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

現在のタスクの終了をトレースします。

void __itt_task_end (const __itt_domain *domain)

ITTAPI__itt_task_* 関数のパラメーター

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

タイプ

パラメーター

説明

[in]

__itt_domain

タスクのドメイン。

[in]

__itt_id taskid

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

[in]

__itt_id parentid

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

[in]

__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

関連情報