我在主機openMP代碼中使用了intel的卸載編譯指示。代碼如下所示從主機openMP並行區域執行Xeon-Phi異步卸載
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 */
}
將$ x $代碼卸載計算到MIC。代碼通過確定一些openMP到CPU核心來保持自己的繁忙。上面的代碼按預期工作。然而,第一個卸載雜注花費很多時間,併成爲瓶頸。儘管如此,總的來說,它可以將$ x $的計算轉移到MIC上。潛在克服我想這個延遲問題的一種方法是如下
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 */
}
所以這個新的代碼,分配一個線程來完成卸載,而其他的OpenMP線程可用於其它工作分享結構。但是,此代碼不起作用。我收到以下錯誤消息
device 1 does not have a pending signal for wait(0x1)
卸載報告指出上面的一段代碼是主要的罪魁禍首。一個臨時工作是使用常數作爲信號,即信號(0),該信號起作用。但是,我需要一個更持久的解決方案。任何人都可以爲我的代碼中出現問題的地方提供照明。
謝謝
這是https://software.intel.com/en-us/forums/topic/509845 – Jeff