インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

ストリームを使用したオフロード

このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーをターゲットとする場合にのみ適用されます。

複数の同時処理を 1 つの CPU スレッドからインテル® MIC アーキテクチャー上のデバイスへオフロードするのにストリームを使用できます。

ストリームとは、オフロードの論理キューです。同じストリーム内のオフロードは、ストリームへ送られた順に完了します。

この機能を使用するには、#pragma offload または #pragma offload_transferstream 節を指定します。

ストリームへのすべてのオフロードを待機するように指定するには、#pragma offload_waitstream 節を指定します。

ストリームの定義

次の 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) …

関連情報