ホストの 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) が機能します。ただし、より永続的な解決策が必要です。私のコードで何がうまくいかないのか、誰でも光を当てることができますか?
ありがとう