インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーをターゲットとする場合にのみ適用されます。
デフォルトでは、OFFLOAD ディレクティブを使用すると、ディレクティブに到達した CPU スレッドは次の文へ進む前にオフロードの完了を待機します。CPU がオフロードを開始してすぐに次の文へ進むように指定することで、非同期オフロード計算を実行できます。
非同期オフロード計算を指定するには、OFFLOAD ディレクティブで signal 節を指定して計算を開始し、続いて OFFLOAD_WAIT ディレクティブを使用してオフロード計算の完了を待機します。
または、非ブロック API OFFLOAD_SIGNALED() を使用して、特定のターゲットデバイスでオフロードコードのセクションの実行が完了したかどうか判断することもできます。
インテル® AVX MIC アーキテクチャー上では、signal 節と wait 節、OFFLOAD_WAIT 構造、および OFFLOAD_SIGNALED() API は、特定のターゲットデバイスに関連するため、target() 節で target-number を指定する必要があります。
シグナルが開始される前にシグナルを照会すると、未定義の動作を引き起こし、アプリケーションはランタイムアボートします。例えば、ターゲットデバイス 1 で開始されたシグナル (SIG1) をターゲットデバイス 0 で照会する場合について考えてみます。シグナルはターゲットデバイス 1 で開始されているため、ターゲットデバイス 0 に関連付けられたシグナル (SIG1) はなく、アプリケーションはアボートします。
次の例では、別の CPU スレッドを追加することなく、CPU はオフロード計算を行い、同時に処理を続行します。
integer signal_var
integer counter
counter = 10000
!DIR$ ATTRIBUTES OFFLOAD:MIC :: long_running_mic_compute
do while (counter .gt. 0)
!DIR$ OFFLOAD TARGET(MIC:0) SIGNAL(signal_var)
call long_running_mic_compute()
call concurrent_cpu_activity()
!DIR$ OFFLOAD_WAIT TARGET(MIC:0) WAIT (signal_var)
counter = counter - 1
end do
end