インテル® VTune™ プロファイラー・ユーザーガイド
タスクは、特定のスレッドで実行されるワークの論理単位です。タスクは入れ子にできます。そのため、通常、タスクは関数、スコープ、または 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() を呼び出すとタスク・インスタンスは終了します。 パラメーター:
|
||||||||||||
void __itt_task_end (const __itt_domain *domain) |
現在のタスクの終了を示します。
|
結果にユーザータスクを表示するには、[解析の設定] で [ユーザータスクの解析] チェックボックスをオンにします。
次の表は、タスク API プリミティブで使用するパラメーターを定義します。
パラメーター |
説明 |
---|---|
__itt_domain |
タスクのドメイン。 |
__itt_id taskid |
予約済みのパラメーター。 |
__itt_id parentid |
予約済みのパラメーター。 |
__itt_string_handle |
タスク文字列のハンドル。 |
タスク API を使用するには、次の手順に従ってください。
次のコードは、グローバルスコープでドメインと 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, ¤t_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