インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーをターゲットとする場合にのみ適用されます。
複数の同時処理を 1 つの CPU スレッドからインテル® MIC アーキテクチャー上のデバイスへオフロードするのにストリームを使用できます。
ストリームとは、オフロードの論理キューです。同じストリーム内のオフロードは、ストリームへ送られた順に完了します。
この機能を使用するには、#pragma offload または #pragma offload_transfer で stream 節を指定します。
ストリームへのすべてのオフロードを待機するように指定するには、#pragma offload_wait で stream 節を指定します。
次の API は、ストリームを作成し、そのストリームに割り当てられるスレッド数を指定します。
OFFLOAD_STREAM* handle = _Offload_stream_create( int device, // インテル® MIC アーキテクチャー・ベースのデバイスの番号 int number_of_threads); // ストリームに割り当てられるスレッド
ストリームは作成後、ターゲットデバイスに関連付けられます。そのため、ストリームへオフロードするときにデバイスを指定する必要はありません。一方、ストリームを使用しないオフロードでは、常にターゲットデバイスを指定する必要があります。
次の API は、ストリームを破棄し、以降のストリームが利用できるようにデバイススレッドをプールに戻します。
int _Offload_stream_destroy( _Offload_stream stream); // ストリーム
この API は、ストリームが破棄されると true を返します。
次の構文を使用してオフロードをストリームへ送ることができます。
// オフロードをストリームへ送ります #pragma offload … stream(handle)
signal 節を使用することで、ストリームへ送られた特定のオフロードを識別できます。signal 識別子は、例えば、後で特定のオフロードの完了を待機するのに役立ちます。
// オフロードをストリームへ送り、signal 節で識別します #pragma offload … stream(handle) signal(s)
待機は、ストリームのすべてのオフロードに対して、あるいはストリームへ送られた特定のオフロードに対して指定することができます。
次の例は、1 つのストリームのすべてのオフロードの完了を待機します。
// オフロードをストリームへ送ります #pragma offload … stream(handle) { … } … // 別のオフロードを同じストリームへ送ります #pragma offload … stream(handle) { … } … // そのストリームのすべてのオフロードの完了を待機します #pragma offload_wait stream(handle)
次の例は、1 つのストリームの特定のオフロードの完了を待機します。
// オフロードをストリームへ送り、シグナル値を s1 とします #pragma offload … stream(handle) signal(s1) { … } … // 別のオフロードを同じストリームへ送り、シグナル値を s2 とします #pragma offload … stream(handle) signal(s2) { … } … // シグナル値 s1 のオフロードの完了を待機します #pragma offload_wait stream(handle) wait(s1)
次の例は、すべてのストリームのすべてのオフロードの完了を待機します。
// オフロードをストリーム 1 へ送ります #pragma offload … stream(handle1) { … } … // 別のオフロードをストリーム 2 へ送ります #pragma offload … stream(handle2) { … } … // ハンドル 0 を使用してすべてのストリームのすべてのオフロードの完了を待機します #pragma offload_wait stream(0)
この機能には、次のテストを行ってブール値を返す非ブロック API が含まれます。
特定のデバイスへのすべてのストリームオフロードが完了したかどうか
すべてのデバイスへのすべてのストリームオフロードが完了したかどうか
特定のストリームオフロードが完了したかどうか
次の関数は、特定のストリームへのすべてのオフロードが完了したかどうかをテストします。stream を 0 にすると、すべてのストリームへのオフロードが完了したかどうかテストできます。
int _Offload_stream_completed( _Offload_stream stream); // ストリーム
次の関数は、特定のデバイスへのすべてのオフロードが完了したかどうかをテストします。device を -1 にすると、すべてのデバイスへのすべてのストリームオフロードが完了したかどうかテストできます。
int _Offload_device_streams_completed( int device); // インテル® MIC アーキテクチャー・ベースのデバイスの番号
次の例は、1 つのストリームのすべてのオフロードが完了したかどうか確認します。
// オフロードをストリームへ送ります #pragma offload … stream(handle) { … } … // 別のオフロードを同じストリームへ送ります #pragma offload … stream(handle) { … } … // そのストリームのすべてのオフロードが完了したかどうか確認します if (_Offload_stream_completed(handle)) …
次の例は、1 つのストリームの特定のオフロードが完了したかどうか確認します。
// オフロードをストリームへ送り、シグナル値を s1 とします #pragma offload … stream(handle) signal(s1) { … } … // 別のオフロードを同じストリームへ送り、シグナル値を s2 とします #pragma offload … stream(handle) signal(s2) { … } … // シグナル値 s1 のオフロードの完了を待機します if (_Offload_signaled(s1)) …
次の例は、すべてのストリームのすべてのオフロードが完了したかどうか確認します。
// オフロードをストリーム 1 へ送ります #pragma offload … stream(handle1) { … } … // 別のオフロードをストリーム 2 へ送ります #pragma offload … stream(handle2) { … } … // ハンドル 0 を使用してすべてのストリームのすべてのオフロードが完了したかどうか確認します if (_Offload_stream_completed(0)) …
次の例は、1 つのデバイスのすべてのオフロードが完了したかどうか確認します。
// オフロードをストリーム 1 へ送ります #pragma offload … stream(handle1) { … } … // 別のオフロードをストリーム 2 へ送ります #pragma offload … stream(handle2) { … } … // デバイス 2 のすべてのストリームオフロードが完了したかどうか確認します if (_Offload_device_streams_completed(2) …
次の例は、すべてのデバイスのすべてのオフロードが完了したかどうか確認します。
// オフロードをストリーム 1 へ送ります #pragma offload … stream(handle1) { … } … // 別のオフロードをストリーム 2 へ送ります #pragma offload … stream(handle2) { … } … // デバイス 2 のすべてのストリームオフロードが完了したかどうか確認します if (_Offload_device_streams_completed(-1) … または if (_Offload_stream_completed(0) …