2016-12-26 4 views
0

저는 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();과 같은 작업을 수행 할 수 있습니까 (소프트웨어가 어떤 카드에서 실행되고 있는지 확실하게 알 수 있습니까?).

답변

0

두 번째 OpenMP 코드 블록은 메모리를 다시 할당합니다. 두 블록을 모두 #pragma omp target data map(from:data[0:size])에 넣거나 첫 번째 블록 앞에 #pragma omp target enter data map(alloc:data[0:size])을 추가하여 데이터를 장치 데이터 환경에 매핑해야합니다.

테스트 컴퓨터에는 두 개의 인텔 파이 카드가 있습니다. 2 번째를 사용하고 싶기 때문에 #pragma omp target device (1) .... 이것이 맞습니까?

AFAIK, device (0)는 기본 카드를 의미하고 device (1)은 첫 번째 카드를 의미하고 device (2)는 두 번째 카드를 의미합니다.

#pragma omp target device (5)를 수행하면 코드가 여전히 작동합니다! 성능도 비슷하기 때문에 Phi 카드 중 하나 (CPU가 아님)에서 실행됩니다. 왜 그런가요?

liboffload does this (liboffload는 gcc와 icc에 사용되는 런타임 라이브러리이므로). 그러나 OpenMP 표준은 이러한 동작을 보장하지 않습니다.

또한 제온 피가없는 컴퓨터에서 내 소프트웨어 (OpenMP 버전)를 사용해 보았는데 CPU에서 제대로 실행되었습니다. 이게 보장 되나요? 기기에 가속기가없는 경우 대상 장치 (1)가 무시됩니까?

예. 표준에 대해서는 확신 할 수 없지만 icc 및 gcc에서 오프 로딩하는 방식은 이러한 방식으로 구현됩니다.

는 표준과 같이 :: cout을 < < print_phi_card_name_or_uid()를 수행하는 것이 가능; OpenMP 오프로드 지역 (내 소프트웨어가 어떤 카드에서 실행되는지 확실하게 알 수 있습니다)?

OpenMP 4.5는 호스트와 가속기를 구별하는 기능 만 제공합니다 (omp_is_initial_device()). 인텔의 특정 인터페이스가있을 수 있습니다.

관련 문제