문제

나는 누군가가 다음을 활용하는 애플리케이션을 작성했는지 알고 싶습니다. GPGPU 예를 들어 다음을 사용하여 엔비디아 쿠다.그렇다면 표준 CPU와 비교하여 어떤 문제를 발견했으며 어떤 성능 향상을 얻었습니까?

도움이 되었습니까?

해결책

나는 gpgpu 개발을 해왔다. ATI의 스트림 SDK 쿠다 대신.어떤 종류의 성능 향상을 얻을 수 있는지는 다음에 따라 다릅니다. 많은 다양한 요인이 있지만 가장 중요한 것은 수치적 강도입니다.(즉, 메모리 참조에 대한 컴퓨팅 작업의 비율입니다.)

두 개의 벡터를 추가하는 것과 같은 BLAS 레벨-1 또는 BLAS 레벨-2 함수는 각 3개의 메모리 참조에 대해 1개의 수학 연산만 수행하므로 NI는 (1/3)입니다.이것은 항상 실행됩니다. 더 느리게 CPU에서 작업하는 것보다 CAL이나 Cuda를 사용하는 것이 좋습니다.주된 이유는 CPU에서 GPU로 데이터를 전송하는 데 걸리는 시간입니다.

FFT와 같은 함수의 경우 O(N log N) 계산과 O(N) 메모리 참조가 있으므로 NI는 O(log N)입니다.N이 1,000,000과 같이 매우 크다면 GPU에서 수행하는 것이 더 빠를 것입니다.N이 작다면(예: 1,000) 속도가 거의 확실히 느려질 것입니다.

행렬의 LU 분해 또는 고유값 찾기와 같은 BLAS 레벨 3 또는 LAPACK 함수의 경우 O(N^3) 계산과 O(N^2) 메모리 참조가 있으므로 NI는 O(N)입니다.매우 작은 배열의 경우 N이 몇 점이라고 가정하면 CPU에서 수행하는 것이 여전히 더 빠르지만 N이 증가하면 알고리즘이 메모리 바인딩에서 컴퓨팅 바인딩으로 매우 빠르게 이동하고 GPU의 성능 향상이 매우 증가합니다. 빠르게.

복잡한 산술과 관련된 모든 작업에는 스칼라 산술보다 더 많은 계산이 필요하며, 이는 일반적으로 NI를 두 배로 늘리고 GPU 성능을 향상시킵니다.


(원천: Earthlink.net)

다음은 Radeon 4870에서 수행된 복잡한 단정밀도 행렬-행렬 곱셈인 CGEMM의 성능입니다.

다른 팁

나는 사소한 응용 프로그램을 작성했는데, 부동 소수점 계산을 병렬화할 수 있다면 정말 도움이 됩니다.

일리노이 대학교 Urbana Champaign 교수와 NVIDIA 엔지니어가 공동으로 진행한 다음 과정이 제가 시작할 때 매우 유용하다는 것을 알았습니다. http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html (모든 강의 녹음 포함)

저는 여러 이미지 처리 알고리즘에 CUDA를 사용했습니다.물론 이러한 애플리케이션은 CUDA(또는 모든 GPU 처리 패러다임)에 매우 적합합니다.

IMO에서는 알고리즘을 CUDA로 포팅할 때 일반적인 세 ​​가지 단계가 있습니다.

  1. 초기 포팅: CUDA에 대한 매우 기본적인 지식이 있어도 몇 시간 내에 간단한 알고리즘을 포팅할 수 있습니다.운이 좋으면 성능이 2~10배 정도 향상됩니다.
  2. 사소한 최적화: 여기에는 입력 데이터에 텍스처를 사용하고 다차원 배열을 패딩하는 것이 포함됩니다.경험이 있는 경우 하루 안에 완료할 수 있으며 성능이 10배 더 높아질 수 있습니다.결과 코드는 여전히 읽을 수 있습니다.
  3. 하드코어 최적화: 여기에는 전역 메모리 대기 시간을 피하기 위해 공유 메모리에 데이터를 복사하는 것, 사용되는 레지스터 수를 줄이기 위해 코드를 뒤집는 것 등이 포함됩니다.이 단계를 수행하는 데 몇 주가 소요될 수 있지만 대부분의 경우 성능 향상은 그만한 가치가 없습니다.이 단계가 끝나면 코드가 너무 난독화되어 누구도(당신을 포함하여) 이해할 수 없게 됩니다.

이는 CPU용 코드를 최적화하는 것과 매우 유사합니다.그러나 성능 최적화에 대한 GPU의 반응은 CPU보다 예측하기가 훨씬 어렵습니다.

저는 모션 감지(원래는 CG를 사용하고 지금은 CUDA를 사용함)와 이미지 처리를 통한 안정화(CUDA 사용)를 위해 GPGPU를 사용해 왔습니다.이러한 상황에서는 속도가 약 10-20배 향상되었습니다.

내가 읽은 바에 따르면 이는 데이터 병렬 알고리즘에서 상당히 일반적입니다.

아직 CUDA에 대한 실제적인 경험은 없지만 해당 주제를 연구해 왔으며 GPGPU API(모두 CUDA 포함)를 사용하여 긍정적인 결과를 문서화한 여러 논문을 발견했습니다.

이것 종이 효율적인 알고리즘으로 결합할 수 있는 여러 병렬 기본 요소(맵, 분산, 수집 등)를 생성하여 데이터베이스 조인을 병렬화할 수 있는 방법을 설명합니다.

이에 종이, AES 암호화 표준의 병렬 구현은 신중한 암호화 하드웨어와 비슷한 속도로 생성됩니다.

마지막으로, 이 종이 CUDA가 구조적 및 비구조적 그리드, 조합 논리, 동적 프로그래밍 및 데이터 마이닝과 같은 다양한 응용 프로그램에 얼마나 잘 적용되는지 분석합니다.

나는 재정적 용도로 CUDA에서 몬테카를로 계산을 구현했습니다.최적화된 CUDA 코드는 "더 열심히 시도할 수 있었지만 실제로는 그렇지 않은" 멀티 스레드 CPU 구현보다 약 500배 빠릅니다.(여기서는 GeForce 8800GT와 Q6600을 비교합니다.)하지만 몬테카를로 문제가 당황스러울 정도로 평행하다는 것은 잘 알려져 있습니다.

발생하는 주요 문제는 G8x 및 G9x 칩의 IEEE 단정밀도 부동 소수점 수 제한으로 인한 정밀도 손실과 관련이 있습니다.GT200 칩이 출시되면서 이는 일부 성능을 희생하면서 배정밀도 장치를 사용하여 어느 정도 완화될 수 있습니다.나는 아직 그것을 시도하지 않았습니다.

또한 CUDA는 C 확장이므로 이를 다른 응용 프로그램에 통합하는 것도 쉽지 않습니다.

GPU에 유전 알고리즘을 구현했는데 속도가 약 7 정도 향상되었습니다.다른 사람이 지적한 것처럼 수치 강도가 높을수록 더 많은 이득을 얻을 수 있습니다.그렇습니다. 응용 프로그램이 올바르면 이득이 있습니다.

나는 내가 사용하고 있던 응용 프로그램에 대해 cuBLAS 구현을 약 30% 능가하는 복잡한 값의 행렬 곱셈 커널과 나머지 응용 프로그램에 대한 곱셈-추적 솔루션보다 몇 배 더 큰 크기를 실행하는 일종의 벡터 외부 곱 함수를 작성했습니다. 문제.

그것은 마지막 해의 프로젝트였습니다.꼬박 1년이 걸렸습니다.

http://www.maths.tcd.ie/~oconbhup/Maths_Project.pdf

ATI Stream SDK를 사용하여 GPU에서 대규모 선형 방정식을 풀기 위해 Cholesky Factorization을 구현했습니다.내 관찰은

alt text

성능 속도가 최대 10배 향상되었습니다.

동일한 문제를 여러 GPU로 확장하여 더 최적화하기 위해 작업합니다.

예.나는 비선형 이방성 확산 필터 CUDA API를 사용합니다.

이는 입력 이미지에 대해 병렬로 실행되어야 하는 필터이기 때문에 매우 쉽습니다.간단한 커널만 필요했기 때문에 나는 이것에 대해 많은 어려움을 겪지 않았습니다.속도 향상은 약 300배였습니다.이것이 CS에 대한 나의 마지막 프로젝트였습니다.프로젝트를 찾을 수 있습니다 여기 (포르투갈어로 쓰여 있습니다.)

나는 멈포드&샤 분할 알고리즘도 마찬가지지만 CUDA는 아직 초기 단계이고 이상한 일이 많이 발생하기 때문에 작성하기가 어려웠습니다.나는 심지어 if (false){} 코드 O_O에서.

이 분할 알고리즘의 결과는 좋지 않았습니다.CPU 접근 방식에 비해 20배의 성능 손실이 있었습니다(그러나 CPU이기 때문에 동일한 결과를 내는 다른 접근 방식을 취할 수 있습니다).아직 진행 중인 작업이지만 안타깝게도 작업하던 연구실을 떠나서 언젠가는 끝낼 수도 있을 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top