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.