2012-09-29 3 views
11

저는 GPU 프로그래밍에 익숙하지 않지만, 계산 집약적 인 작업을 수행 할 때 가능한 성능 향상을 위해 GPU를 사용해야합니다.ArrayFire 대 원시 CUDA 프로그래밍?

내 프로그램을 ArrayFire Free 버전으로 다시 써 보았습니다. 실제로 멀티 스레딩이 활성화 된 상태에서 CPU 루틴보다 빠르지 만 기대했던 수준 (즉, <100 %의 속도 향상)이 아니며 반환 된 결과가 올바르지 않습니다 (< CPU 루틴에 비해 1 % 오류 CPU 루틴의 결과는 정확합니다).

필자의 임무는 대용량 매트릭스 (300MB-500MB 크기)에서 주로 if-thens/switch-case 등을 사용하여 element-wise float-32 수학 연산입니다. 성능 병목 현상은 CPU와 GPU 사이의 대역폭 일 가능성이 높습니다 메모리가 많아서 데이터를 읽을 수 있습니다. 테스트 한 GPU는 3GB의 비디오 메모리가있는 GeForce 580GTX입니다.

내 작업에 ArrayFire를 사용하는 대신 원시 CUDA 코드 (CUBLAS 등 및 평균 최적화)를 쓰면 여전히 상당한 최적화 여지가 있습니까? NVIDIA 최적화 가이드를 읽었습니다. 빠른 데이터 액세스와 은행 갈등을 줄이기 위해 메모리 액세스 트릭이있는 것으로 보인다. ArrayFire는 이러한 일반적인 트릭을 자동으로 사용합니까, 사용하지 않습니까?

답변

16

게시물 주셔서 감사합니다. 초기 결과를 듣고 기뻐서 속도가 빨라졌습니다. 나는 ArrayFire에서 일하고 있으며 여기에 귀하의 질문에 차임 할 수 있습니다.

먼저 무엇보다도 특수성을 가진 사람이 코드를 작성해야합니다. 당신이 작성한 코드를 공유 할 수 있습니까?

둘째, CUDA 및 ArrayFire에 대해 다음과 같은 방식으로 생각해야합니다. CUDA는 원하는 GPU 코드를 작성할 수있는 GPU를 프로그래밍하는 방법입니다. 하지만 순진한 CUDA 코드 (CPU보다 느린 경우가 많음)와 전문가의 시간 계략, 손으로 최적화 한 CUDA 코드에는 큰 차이가 있습니다. ArrayFire (및 CUBLAS와 같은 다른 GPU 라이브러리)에는 많은 인력 최적화 기법이 적용되어 있으며 일반적으로 대부분의 일반 사람들이 스스로 달성 할 시간보다 더 나은 결과를 제공합니다. 그러나 누군가가 ArrayFire (또는 다른 라이브러리)를 얼마나 잘 사용하는지에 대한 가변성도 있습니다. 최상의 성능을 얻으려면 ArrayFire 라이브러리 호출을 사용하여 조정할 수 있고 조정해야하는 변수가 있습니다. 코드를 게시하면 여기에있는 코드 중 일부를 공유 할 수 있습니다.

세 번째로, ArrayFire는 BLAS를 사용하는 함수에서 CUBLAS를 사용하므로 CUBLAS를 직접 사용하면 많은 차이를 느끼지 않을 것입니다. 넷째, 예, ArrayFire는 NVIDIA CUDA 프로그래밍 가이드에서 사용할 수있는 모든 최적화 (예 : 더 빠른 데이터 전송 및 언급 한 것처럼 메모리 뱅크 충돌을 줄임)를 사용합니다. 바로 이런 종류의 것들을 최적화하기 위해 ArrayFire 개발의 대부분이 집중되어 있습니다.

마지막으로 발견 한 데이터 불일치는 CPU 대 GPU 컴퓨팅의 특성 때문일 가능성이 큽니다. 장치가 다르므로 결과가 약간 다를 수 있습니다. CPU가 GPU보다 더 나은 결과를 제공하는 것이 아니라 약간 다른 방식으로 유한 정밀도로 작업하고 있습니다. 이중 대신 단 정밀도를 사용하는 경우이를 고려할 수 있습니다. 게시물 코드는 우리에게도 도움이 될 것입니다.

코드를 게시하면 답변을 확장하는 것을 행복합니다.

+0

둘 다 IEEE 사양을 준수하지 않습니까? 나는 모두 '단일 정밀도'를 사용하여 동일한 결과를 가져와야한다고 가정합니다. 다시 말하지만, 계산 순서가 동일하다고 가정하십시오. – Royi