호스트 OpenMP 코드에서 인텔의 오프로드 플러그 마스크를 사용하고 있습니다. 코드는 다음과 같습니다.호스트 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 */
}
MIC에 대한 코드 오프로드 계산은 $ x $입니다. 이 코드는 CPU 코어에 대한 일부 openMP를 설정하여 스스로를 바쁘게 유지합니다. 위의 코드는 예상대로 작동합니다. 그러나 첫 번째 오프로드 pragma는 많은 시간이 걸리고 병목 현상이되었습니다. 그럼에도 불구하고 전반적으로 MIC에 $ x $의 계산 부담을 덜어줍니다. , SO이 새로운 코드
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