2015-02-02 3 views
1

랩에서 우리는 많은 인텔 CPU, 몇 개의 AMD CPU 및 몇 개의 엔비디아 GPU가있는 이기종 클러스터 설정을 가지고 있습니다.CPU에서 OpenCL을 사용할 준비가 되었습니까?

HPC 개발의 경우,이 설정에서 한 번 쓰고 실행할 수있는 것은 OpenCL (Java조차도 알지 못함)입니다.). 그러나 우리는 실험실에서 C 나 Fortran plus MPI를 사용하여 CPU에서 완전히 실행되도록 개발하는 데 익숙합니다. CUDA에서 뭔가를 실행하려면 Nvidia의 노드를 사용해야 할 수도 있습니다.

이제 새 프로젝트를 시작할 때 MPI + OpenCL에서 코드를 작성하고 GPU와 CPU를 모두 분산 처리 할 수 ​​있어야하며 동일한 OpenCL 코드를 실행할 수 있어야한다고 생각했습니다. . 그렇다면 OpenCL 구현이 그러한 작업을 위해 준비 되었습니까? 인텔 SDK가있는 CPU에서 실행되는 OpenCL 코드를 사용하면 인텔 컴파일러로 컴파일 된 멀티 스레드 C 프로그램에서 얻었던 것처럼 좋은 성능을 발휘할 수 있습니까? 비교와 벤치 마크를 가리킬 수 있습니까?

답변

0

CPU와 GPU에서 OpenCL 코드를 이식하는 행운을 빕니다. 내 프로젝트는 Levenberg-Marquardt였습니다. 먼저 C로 디버깅을 해본 다음 Intel CPU의 OpenCL에 포팅하여 결과를 확인하고 디버깅을 한 다음 AMD GPU에서 OpenCL을 수행했습니다.

정말 좋은 OpenCL 코드를 장치에 걸쳐 작성하는 것이 일반적으로 GPU의 병목 현상이므로 CPU를 사용하는 경우에도 전역 메모리를 로컬 메모리에 버퍼링하는 것이 가장 좋습니다. GPU 대 CPU에서 발견 된 두 번째 병목 현상은 커널 크기 였고, CPU는 GPU보다 큰 커널을 처리 할 수 ​​있으므로 상수에 사용하는 메모리 유형, 로컬 메모리 할당량 등에주의하십시오.

약 6 개월이 걸렸으므로 AMD FFT가 Intel CPU, GPU 및 AMD GPU에서 훌륭하게 작동했지만 NVIDIA GPU에서는 작동하지 않았습니다. AMD 포럼에는 일부 벡터 기능을 지원하지 않는 NVIDIA에 기인 한 스레드가있었습니다.

2

OpenCL은 휴대용이지만 성능이 뛰어난 것은 아닙니다. OpenCL이 어디서나 쓰기 - 빨리 실행되는 것을 기대해서는 안됩니다. GPU 용으로 작성된 OpenCL 코드는 CPU에서 제대로 실행되지 않을 수 있으며 GPU, 특히 여러 공급 업체의 GPU에서 균일 한 성능을 기대하지는 않습니다.

많은 질문에 답하기 위해 OpenCL이 인텔 CPU에서 잘 작성된 C + OpenMP를 능가 할 것이라고 기대하지 않습니다. 이것에는 여러 가지 이유가 있습니다.

내 대답의 오류 막대는 질문의 특성이 크기 때문에 매우 크다는 것을 알고 있어야합니다. 당신이 계산하고자하는 것에 대해 더 자세하게 설명하는 것이 도움이 될 것입니다.

1

다른 답변 외에도 한 가지 중요한 점을 다시 강조합니다. 질문은 매우 광범위하며 성능은 질문에서 언급하지 않은 많은 요인에 따라 달라집니다. 이미 이러한 요소를 알고 있을지 모르지만 의심 할 여지없이 this answer에 요약이 나와있을 수 있습니다 (첫눈에 관련이없고 CUDA를 의미하지만 많은 개념이 OpenCL에도 적용됩니다)

하나 OpenCL 뒤에있는 주요 운전 아이디어는heterogeneous computing입니다 (놀랍게도 OpenCL은 언급하지 않습니다). 즉, OpenCL은 개발자에게 단일 ARM 코어에서 수천 개의 코어가있는 여러 개의 하이 엔드 GPU에 이르는 모든 사용 가능한 프로세싱 리소스를 활용할 수있는 가능성을 제공합니다.

이 다재다능 함은 비용이 들게됩니다. 특정 개념은 많은 코어 아키텍처에 대해 암시 적으로 맞춰져 있습니다 (또는 적어도 지금까지 주요 응용 프로그램 영역으로 보입니다).그리고 어떤 경우 든 OpenCL 프로그램을 "최적화"한다는 것은 종종 "하나의 특정 아키텍처에서"을 특히 빠르게 실행하기 위해 조정하는 것을 의미합니다. 벡터화 또는 공유 메모리와 같은 것들은 한 플랫폼에서 유리하거나 다른 플랫폼에서는 사용할 수없는 경우가 있습니다.

이 문제를 피하거나 적어도 하나의 OpenCL 프로그램이 실행될 하드웨어에 대해 더 "불가지론"하게 만들 수있는 몇 가지 가능성이 있습니다. 한 가지 확실한 옵션은 대상 플랫폼 속성 (예 : 기본 벡터 크기 또는 공유 메모리를 사용할 수 있는지 여부)을 쿼리하고 결과에 따라 다른 커널을 시작하는 것입니다. OpenCL의 빌트인 컴파일러 덕분에 커널 소스 코드에 플랫폼 별 최적화 (예 : #define)를 포함시킬 수도 있습니다. 그러나 이런 종류의 최적화를 위해 노력 대비 성능 향상 비율에 대한 일반적인 설명은 어렵습니다. 또한 코어 수가 증가하고 OpenCL 컴파일러가 개선 될 때 "일반적인"OpenCL 구현의 성능 저하 가능성 (완벽하게 조정 된 C 구현과 비교하여)이 조만간 보상되지 않을지 예측하기가 더욱 어렵습니다.

따라서 "대표적인"작업의 벤치 마크를 수행하고 각 장치의 평균 코어 수 (그리고 가장 가능성이 높은 코어 수)를 명심하면서 다른 장치간에 성능이 경쟁적인지 확인하는 것이 좋습니다. 장치의 일반적인 이종 성)이 증가하고 OpenCL은 이러한 변경 사항에보다 쉽게 ​​적응할 수 있습니다.

관련 문제