저는 Intel C++ 컴파일러 17.0.01을 사용하며 두 개의 코드 블록을 사용합니다.Intel의 #pragma offload를 Xeon Phi 용 OpenMP로 변환 (성능 문제 및 기타 질문)
첫 번째 코드 블록이 같은 인텔 MIC에 메모리를 할당 :
#pragma offload target(mic:1) nocopy(data[0:size]: alloc_if(1) free_if(0))
제 2 블록이 호스트에 다시 상기 메모리 카피를 평가 :
#pragma offload target(mic:1) out(data[0:size]: alloc_if(0) free_if(0))
이 코드는 잘 실행 하지만 #pragma offload는 Intel의 컴파일러에만 포함됩니다 (필자는 생각합니다). 그래서 OpenMP로 변환하고 싶습니다. 내가 OpenMP의에 첫 번째 블록 변환하는 방법
이
은 다음과 같습니다#pragma omp target device(1) map(alloc:data[0:size])
을 그리고 이것이 내가 OpenMP의 두 번째 블록 변환하는 방법입니다 또한
#pragma omp target device(1) map(from:data[0:size])
을, 내가받을하기 위해 export OFFLOAD_REPORT=2
를 사용 런타임 중에 무슨 일이 일어나고 있는지에 대한 더 나은 아이디어.
- 첫 번째 코드 블록의 OpenMP의 버전은 빠른 속도로 인텔 버전 (
#pragma offload
)와 같은 수 있습니다 : 여기 내 문제/질문입니다. 여기 이상한 건 없어요. - 두 번째 코드 블록의 OpenMP 버전은 Intel 버전보다 5 배 느립니다. 그러나 두 개의
MIC_TIME
은 동일하지만CPU_TIME
은 다릅니다 (OpenMP 버전이 훨씬 높음). 왜 그런가요? - 인텔 지시문이 최적입니까?
- 내 Intel -> OpenMP 번역이 정확하고 최적화되어 있습니까?
- 테스트 시스템에서 나는 두 개의 인텔 피 카드가 :
그리고 여기가, 몇 가지 질문 좀 다른 다른입니다. 두 번째 것을 사용하기 때문에이 작업을 수행합니다 :
#pragma omp target device(1)...
. 그 맞습니까? #pragma omp target device(5)...
코드가 여전히 작동합니다! 성능도 비슷하기 때문에 Phi 카드 중 하나 (CPU가 아님)에서 실행됩니다. 왜 그런가요?- 나는 Xeon Phi가없는 컴퓨터에서 내 소프트웨어 (OpenMP 버전)를 시험해 보았고 CPU에서 잘 돌아갔습니다! 이게 보장 되나요? 기계에 액셀레이터가 없으면
target device(1)
은 무시됩니까? - OpenMP 오프로드 영역 내에
std::cout << print_phi_card_name_or_uid();
과 같은 작업을 수행 할 수 있습니까 (소프트웨어가 어떤 카드에서 실행되고 있는지 확실하게 알 수 있습니까?).