인텔 DPC++ 호환성 도구로 Spectrum 3D Globe를 DPC++로 이전
목차
- 이 작업에 대한 서론
- Spectrum 3D Globe에 대한 간단한 소개
- Spectrum 3D Globe을 데이터 병렬 C++로 이전하는 동기
- Intel 데이터 병렬 C++ 호환성 도구 소개
- 응용 프로그램 이전을 위한 일반적인 워크플로우
- 성능 비교 및 요약
- OpenCL에서의 소프트웨어 문제점과 해결법
- 호환성 도구의 변환 진단 메시지 해석
- 특정 응용 프로그램에 대한 추가적인 문제와 해결법
- Data Parallel C++의 장점과 가능성
🌍 2. Spectrum 3D Globe에 대한 간단한 소개
Spectrum 3D Globe은 전 세계와 지역적인 지진파 전파를 시뮬레이션하는 소프트웨어 패키지입니다. Fortran, MPI, C, Ruby 코드로 구성되어 있으며, OpenCL 및 CUDA 코드를 생성하는 자동화된 도구인 Boost를 사용합니다.
2.1 Spectrum 3D Globe 소프트웨어 패키지 소개
Spectrum 3D Globe은 글로벌 및 지역적인 지진파 전파를 시뮬레이션하는 소프트웨어 패키지입니다. 이 패키지는 Fortran, MPI 및 C로 작성된 코드로 구성되어 있습니다. 또한 Boost라는 자동화된 도구를 사용하여 OpenCL 및 CUDA 코드를 생성하는 데에도 사용됩니다. Spectrum 3D Globe은 고성능 그래픽 카드를 중심으로 개발되었으며, 특정 워크로드에 대해 메모리 사용량 및 시뮬레이션 시간 등을 분석합니다.
2.2 작업에 사용된 워크로드 소개
이 작업에서는 Intel Gen9 HD Graphics 카드에서 작동하는 커플의 워크로드만을 분석했습니다. 메모리 요구 사항 및 시뮬레이션 시간을 고려하여 일부 워크로드를 선택했습니다. Workload 1은 64x64 그리드 크기로 구성된 균등한 프레미스(prems)이며, 워크로드 2는 보다 복잡한 지구를 시뮬레이션하기 위한 것이므로 그리드 크기를 80x80으로 축소했습니다.
2.3 데이터 병렬 C++으로 이전하는 동기
데이터 병렬 C++로의 이전은 기존의 OpenCL 코드의 데이터 전송 시간 문제를 해결하기 위해 시작되었습니다. OpenCL 버전은 문제 해결 시간은 비교적 적정하지만 데이터 전송에 많은 시간이 소요되는 것으로 나타났습니다. 따라서 데이터 병렬 C++ 호환성 도구를 사용하여 이러한 문제를 해결하고자 했습니다. 또한 해당 응용 프로그램을 데이터 병렬 C++로 이전해야 하는 동기는 Intel의 Gen9 HD Graphics 카드에 특히 최적화되어 있기 때문입니다.
🛠️ 3. Intel 데이터 병렬 C++ 호환성 도구 소개
Intel 데이터 병렬 C++ 호환성 도구는 개발자가 CUDA 소스 코드를 데이터 병렬 C++ 코드로 마이그레이션하는 데 도움을 주는 도구입니다. 대부분의 코드는 자동으로 마이그레이션되며, 마이그레이션되지 않은 코드에 대해서는 주석을 남기고 진단 메시지를 제공합니다.
3.1 데이터 병렬 C++ 호환성 도구를 활용한 일반적인 워크플로우
응용 프로그램 마이그레이션의 일반적인 워크플로우는 다음과 같습니다.
3.1.1 마이그레이션 준비 단계
먼저, 원본 소스 코드를 가져옵니다. 그리고 CUDA 소스 코드로 구성된 경로를 제공하여 해당 소스 코드를 구성합니다. 마지막으로 CUDA 9 브랜치로 코드를 구성하기 위해 필요한 라이브 코드 라이브러리 및 MPI 포함 헤더를 제공합니다.
3.1.2 코드 마이그레이션 단계
두 번째 단계는 데이터 병렬 C++ 호환성 도구가 포함된 컴파일 명령들(json 파일)을 실행하는 것입니다. 이 단계에서 대부분의 코드가 자동으로 마이그레이션되며, 마이그레이션되지 않은 코드는 진단 메시지와 함께 주석 처리됩니다.
3.1.3 코드 검토 및 수정 단계
마지막 단계는 마이그레이션된 코드의 진단 메시지를 검토하고 직접 수정하는 것입니다. 이 단계에서는 소스 코드의 기능 판별 메세지와 진단 번호를 확인하고 수정해야 할 부분을 식별합니다.
✨ 4. 응용 프로그램 이전을 위한 일반적인 워크플로우
Spectrum 3D Globe와 같은 응용 프로그램을 이전하는 일반적인 워크플로우는 다음과 같습니다.
- 코드 준비: 원본 소스 코드를 가져옵니다.
- 구성: CUDA 소스 코드와 동일한 방식으로 코드를 구성합니다.
- 컴파일 명령 등록:
compile commands.json
파일에 컴파일 명령을 등록합니다.
- 마이그레이션: 데이터 병렬 C++ 호환성 도구를 사용하여 코드를 자동으로 마이그레이션합니다.
- 코드 검토 및 수정: 마이그레이션된 코드를 검토하고 필요한 수정을 진행합니다.
- 검증: 수정된 코드를 컴파일하고 실행하여 정확성을 확인합니다.
이러한 일반적인 워크플로우를 따라 간단한 응용 프로그램의 이전이 가능합니다.
🚀 5. 성능 비교 및 요약
데이터 병렬 C++로 마이그레이션된 Spectrum 3D Globe 코드를 Intel Gen9 HD Graphics GPU에서 실행한 결과, 열전송 속도가 크게 개선된 것을 확인할 수 있었습니다. OpenCL로 실행한 경우보다 전체 벽 시계 시간이 크게 단축되었습니다. 이를 통해 데이터 병렬 C++이 성능과 이식성을 모두 갖춘 최적의 선택지임을 알 수 있습니다.
❓ 자주 묻는 질문
Q: OpenCL에서의 작은 버퍼 데이터 전송 속도 문제는 데이터 병렬 C++과의 비교에서의 문제인가요, 아니면 실행 시간 및 드라이버 문제인가요?
A: OpenCL에서의 작은 버퍼 데이터 전송 속도 문제는 주로 OpenCL의 구현에 기인한 문제입니다. OpenCL의 작은 버퍼 복사 방식은 수많은 작은 버퍼를 하나 하나 복사하는 방식이라서 전체적인 전송 시간이 많이 소요됩니다. 반면, 데이터 병렬 C++을 사용할 경우 Level Zero와 같은 백엔드를 활용함으로써 작은 버퍼 복사 시간이 크게 감소되므로 이 문제를 해결할 수 있습니다.
Q: 문제가 발생한 경우, 호환성 도구의 진단 메시지를 어떻게 해석하면 될까요?
A: 호환성 도구의 진단 메시지를 해석하기 위해서는 해당 메시지가 나타난 소스 파일, 경고 메시지 자체, 진단 번호 등을 확인해야 합니다. 또한 호환성 도구 팀에서 제공하는 진단 참조 가이드를 참고하여 메시지의 해결 방법을 파악할 수 있습니다. 진단 메시지와 함께 제공되는 번호를 활용하여 작업을 완료하는 데 도움을 받을 수 있습니다.
Q: 응용 프로그램 마이그레이션 중에 발생한 특정 문제를 해결하려면 어떻게 해야 할까요?
A: 응용 프로그램 마이그레이션 중에 발생한 특정 문제에 대해서는 맞춤형 해결 방법을 찾아야 합니다. CUDA 소스 코드에서는 사용되는 함수 포인터, 텍스처 메모리 API, GPU 비동기 복사 등과 관련된 문제가 발생할 수 있습니다. 호환성 도구가 자동으로 처리하지 못하는 이러한 문제들은 수동으로 코드를 수정하여 해결해야 합니다.
ℹ️ 자세한 내용은 아래 링크를 참고하세요.
- Spectrum 3D Globe 공식 레포지토리: 링크
- Intel 데이터 병렬 C++ 호환성 도구: 링크