2012-04-14 1 views
1

:호출 여러 커널, 글로벌 메모리 공연 - CUDA 나는 다음과 같은 방법으로 행렬에 작업 네 개의 CUDA 커널을

convolution<<<>>>(A,B); 
multiplybyElement1<<<>>>(B); 
multiplybyElement2<<<>>>(A); 
multiplybyElement3<<<>>>(C); 

// A + B + C with CUBLAS' cublasSaxpy 

모든 커널은 기본적으로 (제외 먼저 회선)는에 의해 매트릭스 각 요소 곱셈을 수행한다 고정 값은 상수 메모리에 하드 코드되어 있습니다 (속도를 높이기 위해).

나는

multiplyBbyX_AbyY_CbyZ<<<>>>(B,A,C) 

같은 것을 호출하여 하나 하나에 이러한 커널에 가입해야 하는가? 그게 도움이되지 것입니다 아마 그래서

글로벌 메모리는 이미 장치에 있어야합니다,하지만 난 당신에 세 "multiplybyElement"커널을 병합하는 경우는 올바르게, 당신이 요구하는지 이해하면 나는

+0

두 버전을 모두 테스트 해보고 더 나은 버전을 찾으실 수 있습니까? 어쨌든, 커널 호출을 통해 이미 메모리에있는 데이터를 재사용하고 있기 때문에 성능에 어떤 차이가 있을지는 의문입니다. – Tudor

답변

0

완전히 확실하지 않다 하나는 각각의 커널이 전체 (다른) 행렬을 읽고, 각 원소를 상수로 곱하고, 새로운 스케일 된 행렬을 저장하는 것입니다.

이러한 커널은 메모리 대역폭 경계 (사실상 계산이없고 모든 요소에 대해 하나의 곱셈)가 주어지면 행렬이 작지 않은 경우 커널을 병합하면 어떤 이점도 없으므로 비효율적 일 수 있습니다 커널은 직렬 (같은 스트림)에서 실행되기 때문에 GPU를 사용합니다.

+0

CUBLAS 라이브러리를 사용하는 "A + B + C"문장이 있더라도 유효합니다. – paulAl

+0

당신이 cuBLAS에 전화를 걸어 간다면 내 충고가 똑같을 것이라는 것을 의미합니까? 예. – Tom

0

커널을 병합하면 메모리를 한 번만 통과 할 수 있다는 것을 의미하는 경우 3 배의 속도 향상을 볼 수 있습니다.

고정 된 값을 앞쪽으로 곱한 다음 단일 커널에서 하나의 곱셈을 수행 할 수 있습니까?

+0

슬프게도, 나는 3 개의 다른 상수에 3 개의 다른 행렬을 곱해야한다. – paulAl