0

ホストの openMP コードで intel のオフロード プラグマを使用しています。コードは次のようになります

int s1 = f(a,b,c);

#prama offload singnal(s1) in (...) out(x:len)
{
    for (int i = 0; i < len; ++i)
    {
        x[i] = ...
    }   
}

#pragma omp parallel default(shared)
{
    #pragma omp for schedule(dynamic) nowait
    for (int i = 0; i < count; ++i)
    {
        /* code */
    }

    #pragma omp for schedule(dynamic) 
    for (int j = 0; j < count2; ++j)
    {
        /* code */
    }
}

#pragma offload wait(s1)
{
    /* code */
}

MIC への $x$ のコード オフロード計算。このコードは、一部の openMP を CPU コアに割り当ててビジー状態に保ちます。上記のコードは期待どおりに機能します。ただし、最初のオフロード プラグマは時間がかかり、ボトルネックになっています。それにもかかわらず、全体として、$x$ の計算を MIC にオフロードすることは報われます。私が試みているこの遅延の問題を潜在的に克服する1つの方法は次のとおりです

int s1 = f(a,b,c);

#pragma omp parallel default(shared)
{
    #pragma omp single nowait
    {
        #prama offload singnal(s1) in (...) out(x:len)
        {
            for (int i = 0; i < len; ++i)
            {
                x[i] = ...
            }   
        }

    }

    #pragma omp for schedule(dynamic) nowait
    for (int i = 0; i < count; ++i)
    {
        /* code */
    }

    #pragma omp for schedule(dynamic) 
    for (int j = 0; j < count2; ++j)
    {
        /* code */
    }
}

#pragma offload wait(s1)
{
    /* code */
}

SO この新しいコードは、オフロードを実行するスレッドを割り当てますが、他の openmp スレッドは他のワークシェアリング構造に使用できます。ただし、このコードは機能しません。次のエラーメッセージが表示されます

device 1 does not have a pending signal for wait(0x1)

オフロード レポートは、上記のコードが主な原因であることを示しています。一時的な回避策の 1 つは、信号として定数を使用することです。つまり、signal(0) が機能します。ただし、より永続的な解決策が必要です。私のコードで何がうまくいかないのか、誰でも光を当てることができますか?

ありがとう

4

2 に答える 2

1

テイラーの返事を少し補足させてください。

最初のオフロードは、初期化が行われているため、後続のオフロードよりも時間がかかります。テイラーはそこで起こっていることのいくつかをスケッチしました. 環境変数 OFFLOAD_INIT=on_start を使用すると、ダミーのオフロードを回避できます。これにより、ランタイム システムは事前にすべての初期化を行うことができます。このオーバーヘッドはなくなりませんが、最初のオフロードからアプリケーションの初期化に移行します。

2 番目のコード スニペットの問題は、オフロードが別のデバイスをターゲットにしているようです。シグナルと待機が機能するのは、シグナルと待機が同じターゲット デバイスに対して発生した場合のみです。オフロードで句を明示的に使用しないためtarget(mic:0)、ランタイム システムが異なるターゲット デバイスを選択する可能性が高くなります。

1 つの推奨事項は、シグナリングに単純な整数を使用しないことです。通常、信号は特定のバッファの準備ができていることを示します。このような場合、バッファー ポインターをシグナル ハンドルとして使用することをお勧めします。これは、異なるバッファーで動作する同時オフロードに対して一意であるためです。

乾杯 - マイケル

于 2014-04-25T07:47:32.620 に答える