2013-11-15 2 views
0

이상한 동작을보고 있으며 Intel Xeon Phi와 관련이 있는지 알고 싶습니다.Intel MIC와의 메모리 전송 오버 헤드

나는 근본적으로 모두가 알고있는 행렬 곱셈 (세 개의 중첩 된 루프)을 가지고 있습니다. 계산을 OpenMP 4.0 target pragma가있는 Intel MIC로 오프로드하고 map(to:A,B)map(tofrom:C)으로 세 행렬을 매핑합니다.

이제 제가 관찰 한 것은 작은 행렬에 대한 것입니다. 1024x1024 메모리 전송이 매우 오래 걸렸습니다. 네이티브 버전 (동일한 코드, 동일한 병렬화 전략, 오프 로딩 없음)과 비교할 때 오프로드 버전은 약 320ms 더 많은 시간을 소비합니다. 초기화 오버 헤드를 제거하기 위해 워밍업 코드를 실행했습니다.

Nvidia Tesla K20과 비교하면 같은 양의 메모리가 복사되지 않고 복사되는 것에 비해이 320ms는 매우 나쁩니다.

메모리 전송 속도를 향상시킬 수있는 환경 설정이 있습니까?

추가 질문 : OFFLOAD_REPORT 환경 변수를 통해 오프로드보고 기능을 활성화했습니다.

[Offload] [HOST] [Tag 5] [CPU Time]  26.995279(seconds) 
[Offload] [MIC 0] [Tag 5] [CPU->MIC Data] 3221225480 (bytes) 
[Offload] [MIC 0] [Tag 5] [MIC Time]  16.859548(seconds) 
[Offload] [MIC 0] [Tag 5] [MIC->CPU Data] 1073741824 (bytes) 

MIC 시간 (메모리 전송?) 잘

세 번째 질문에없는 그 십초 무엇 : 보고서에 표시된 두 타이밍 결과의 차이점은 무엇입니까. Intel MIC에서 고정 메모리를 사용할 수 있습니까? 그렇다면 어떻게?

답변

1

아마도 MIC에 시간이 걸리는 메모리 할당 일 수 있습니다. 시간이 어디로 가는지 더 잘 이해하기 위해 세 가지 오버 헤드 소스를 시도하고 분리하십시오.

// Device initialization 
#pragma offload_transfer target(mic) 
... 
// Memory allocation and first data transfer 
// This is expected to have overhead proportional to the amount of memory allocated 
// Doing at least one transfer will speed up subsequent transfers 
#pragma offload_transfer target(mic) in(p[0:SIZE] : alloc_if(1) free_if(0)) 

... 
// This transfer should be faster 
// For large sizes, approaching 6 GiB/s 
#pragma offload_transfer target(mic) in(p[0:SIZE] : alloc_if(0) free_if(0)) 
+0

실제로 메모리 할당이 문제입니다. 그들은 메모리 전송에 비해 매우 오래 필요합니다. 이 할당 오버 헤드를 줄이는 방법이 있습니까? Additionaly, 당신은 왜 프리스트 장소에서 발생하는지 설명 할 수 있습니까? –

1

"초기화 오버 헤드를 제거하기 위해 워밍업 코드를 실행했습니다"라고 했으므로 더미 섹션을 오프로드하여 오프로드 런타임을 시작한 것으로 가정합니다. "on_offload"(기본값) 또는 프로그램 초기화시 (OFFLOAD_INIT = on_start) 시작할 조정이 있다는 것을 기억합니다. 아무튼, DMA 엔진에도 빠른 경로가 있습니다. 빠른 경로는 전송할 버퍼가 페이지 크기에 맞춰지면 수행됩니다. 오프로드 애플리케이션의 경우, 임계 값 integerB | K | M | G | T와 함께 환경 변수를 설정할 수 있습니다. 여기서 M은 메가 바이트입니다 (예 : MIC_USE_2MB_BUFFERS = 2M). 이 임계 값은 거대한 페이지가 사용되기 전에 필요한 버퍼의 크기를 정의합니다. 따라서 거대한 페이지와 빠른 전송이라는 두 가지가 있습니다! 이 기능은 투명한 거대한 페이지 (THP)가 보조 프로세서에 도입 되어도 여전히 의미가 있습니다. 후

단순히 노력 OFFLOAD_INIT = on_start 및 MIC_USE_2MB_BUFFERS = 0, 당신은 (그에 따라 호스트 측면에 최대 버퍼를 정렬 할 수 있습니다.의. 벡터 폭 및 페이지 크기 ;-). 추가적인 오프로드 절 (LEO; 그러나 OpenMP 4.0에 대해서는 확실하지 않음)을 기억하십시오. 호스트 버퍼의 정렬은 오프로드 섹션에 의해에 계승되어 입니다. 2MB로 정렬하면 모든 것을 처리 할 수 ​​있지만 (작은 버퍼에 리소스를 낭비하지 않도록 할당을 훨씬 더 똑똑하게 할 수 있습니다). 그것으로 당신은 필요한 경우 배경을 찾기에 충분한 키워드를 가져야합니다.

+0

답장을 보내 주셔서 감사합니다. 적절한 정렬 메모리를 얻기 위해'_mm_alloc'을 사용합니다. 'MIC_USE_2MB_BUFFERS' 힌트는 조금 도움이되는 것 같지만,'MIC_USE_2MB_BUFFERS = 0'을 설정하고 할당량을 2MB로 맞추더라도 메모리 전송은 여전히 ​​250ms가 필요합니다. 나는 MKL을 시험해 보았고 그러한 문제가 발생하지 않았다. 추가 제안 사항은 훌륭합니다. –

+0

다시 신고 해 주셔서 감사합니다.OFFLOAD_INIT = on_start로 확인 했습니까? – hfp

+0

예, 첫 번째 오프로드 영역의 초기화 오버 헤드가 제거됩니다. 그러나 메모리 전송 오버 헤드는 유지됩니다. –