GPU 프로그래밍을위한 추력


10

아주 문제는 특히 적합하지 않으면 그렇게 용서해주십시오 프로그래밍 GPGPU에 새. 내가 이해 한 바에 따르면 GPU 프로그래밍은 일반적인 CPU 프로그래밍과 비교할 때 매우 복잡한 엔지니어링 작업입니다. 분기 문제, 바둑판 식 배열, 고정 된 메모리 할당 및 호스트 장치 통신 / 장치 계산 겹침에 매우주의해야합니다.

약간의 연구를 한 후에 C ++ STL을 모방하려는 스러스트 라이브러리 를 발견했습니다 . 이것은 꽤 좋다. 그러나 매우 제한된 경험과 좋은 성능을 얻는 데 필요한 모든 미세 관리 기능을 보았을 때 성능에 대해 약간 회의적입니다. 추력은 복잡한 모든 프로그래밍 부분을 내부적으로 효율적으로 처리 할 수 ​​있습니까? PETSc와 같은 잘 알려진 라이브러리 중 일부는이 패키지를 사용하는 것 같습니다.

CUDA 및 추력에 대한 경험이 많은 사람들이 저수준 CUDA 프로그래밍과 비교할 때 패키지의 성능에 대해 한두 가지를 말할 수 있는지 궁금합니다. 스러스트는 언제 사용할 수 있고 언제 CUDA로 다시 전환해야합니까?


ArrayFire를 고려 했습니까?
arrayfire

답변:


2

나는 추력에 대한 개인적인 경험이 없지만 거의 모든 세부 사항을 숨기는 또 다른 고급 GPU 라이브러리 인 ViennaCL을 사용합니다. 내 개인 벤치마킹에서 메모리 주위를 이동하는 데 걸리는 시간을 무시하면 실제 계산에서 2x-40x의 속도 향상을 볼 수 있습니다.

CPU 대 추력 대 CUDA를 사용해야 할 때는 모두 해결하려는 문제, 기술 및 사용 가능한 시간에 따라 다릅니다. 세 가지 방법으로 간단한 문제를 해결하여 상대 성능을 확인하는 것이 좋습니다. 그런 다음 실제 소프트웨어를 신속하게 작성하고 벤치마킹 하고 몇 분의 실행 시간 만 얻을 수있는 CUDA 소프트웨어 작성 시간을 낭비하지 않고 속도 향상 이 필요한 영역에 적절한 GPU 방법을 적용 할 수 있습니다 .


그것은 나에게 완벽한 의미가 있습니다. 항상 먼저 프로파일 링해야합니다. 따라서 귀하의 예에서, 당신이 얻은 속도는 ViennaCL을 사용하여 얻은 것입니다. 차이점을 확인하기 위해 직접 OpenCL을 사용해 보셨습니까?
GradGuy

아니요, 당신처럼 저는 GPU 컴퓨팅을 처음 사용합니다. 내년 또는 2 년 동안 CUDA와 OpenCL을 포함하도록 기술을 천천히 확장 할 계획이지만 현재는 라이브러리 만 사용합니다. ViennaCL의 문서에 따르면 다른 2x-10x 정도의 조정 된 openCL 구현으로 추가 속도가 향상 될 수 있다고 말하지만, 실제로는 메모리 대역폭이 실제로 성능을 정의하는 900 파운드 고릴라라는 것을 알게되었습니다.
Godric Seer

5

연결된 클러스터 확장 프로젝트에서 Thrust를 사용했습니다. 상황에 따라 Thrust는 사용자가 롤링하는 저수준 구현보다 성능이 좋거나 성능이 우수 할 수 있습니다 (특히 reduce커널이 저에게 매우 효과적이었습니다). 그러나 Thrust의 일반적인 특성과 유연성으로 인해 때로는 추가 복사, 배열 패딩 등을 많이 수행해야하기 때문에 불쾌한 경우에는 속도가 약간 느려질 수 있습니다. 내가 마지막으로 사용한 sort것은 b40c 또는 mgpu와 같은 다른 라이브러리와 비교할 때 상당히 느 렸습니다. 그러나 NVIDIA는 추력 문제가 덜 될 수 있도록 Thrust의 알고리즘 성능을 개선하기 위해 노력하고 있습니다.

Thrust와 CUDA를 사용하여 코드를 작성한 다음 Visual Profiler를 사용하여 관심있는 특정 작업에 더 적합한 것을 결정해야합니다. 메모리 전송이 프로그램의 실행 시간을 가장 많이 차지할 가능성이있는 경우 은행 충돌, 명령 수 등을 위해 커널을 최적화하는 것에 대해 걱정할 필요가 없습니다. 그런 다음 Thrust를 사용합니다. 또한 GPU 프로그래밍에 익숙하지 않은 사람들이 코드를 훨씬 덜 장황하게 만들고 더 쉽게 만들 수 있다는 부작용이 있습니다.


3

추력의 목적은 (대부분의 템플릿 라이브러리로서) 우수한 또는 우수한 성능을 유지하면서 높은 수준의 추상화를 제공하는 것입니다.

성능에 대해 크게 걱정하지 말고 스스로에게 물어보십시오.

  • 스러스트에서 구현 된 알고리즘과 관련하여 애플리케이션을 설명 할 수 있으며

  • 주어진 하드웨어 / 소프트웨어 아키텍처에 대한 효율적인 매핑을 찾는 데 필요한 세부적인 내용없이 "일반적인"병렬 코드를 작성할 수 있습니다.

두 질문 모두에 긍정적으로 응답하면 CUDA 전용 구현과 관련하여 적은 노력으로 프로그램을 구현할 수 있어야합니다. 그런 다음 응용 프로그램을 프로파일 링하고 성능을 향상시킬 가치가 있는지 결정할 수 있습니다.

나는 프로그램을 작성할 때 새로운 것을 배우고 싶어하기 때문에 "일반적인"프로그래밍이 마음에 들지 않는다고 고백해야한다. 다른 경로를 따를 것입니다 : python + numpy + scipy로 프로토 타입 구현을 작성한 다음 실제로 최적화가 필요하고 GPU에서 실행하기에 적합한 코드의 1 %-2 %에 CUDA 커널을 추가하십시오. 물론 프로토 타이핑 단계에서의 잘못된 결정 (예 : CUDA 커널에 적합하지 않은 데이터 구조)으로 인해 성능에 끔찍한 결과가 발생할 수 있기 때문에 사전 과학이 필요합니다. 일반적으로 좋은 코드를 얻으려면 더 많은 반복이 필요하며 추력보다 더 나은 성능을 보장 할 수는 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.