2013-05-25 4 views
1

그래서 이미지에 많은 변형을 적용해야하는이 방법이 있습니다. 전체적으로 동일한 데이터에 적용되는 몇 가지 다른 작업이 필요합니다. 내 CPU 코드에서 이러한 모든 변환을 동일한 루프에서 수행하지만 cuda에 적용하는 가장 좋은 방법은 궁금합니다. Cuda에서 큰 알고리즘을 처리하는 가장 좋은 방법

그래서 CPU에서 나는 OpenMP를 가진 가장 바깥 쪽 루프에 스레딩을 사용하십시오

loop 1 
    loop 2 
    loop 3 
     DO A LOT OF SMALL BUT INDEPENDENT OPERATIONS 
    end 
    end 
end 

을 가지고 있고 매우 paralelizable 그래서 알고리즘은 스레드의 거의 배 수를 가속화합니다. 그럼에도 불구하고 매우 큰 이미지의 경우 여전히 많은 시간이 걸릴 수 있으므로 Cuda를 사용할 수 있다고 생각했습니다. 루프 1, 루프 2를 하나 개의 CUDA 스레드와 모든 cicle을 대체하지만 지금은 더 나은 디자인 예를 들어

내가이 일을 시도가 무엇인지 확실하지 않다 :

은 그래서 바깥 쪽 루프를 제거하는 관리

cuda_kernel{ 

    loop 3 
     DO A LOT OF SMALL BUT INDEPENDENT OPERATIONS 
    end 
} 

이러한 작업 중 일부는 분기도 있고 다른 작업도 그렇지 않습니다. 당신이 각각의 커널은 매우 간단합니다이 경우이 대신

cuda_kernel 1{ 

    loop 3 
     DO JUST FIRST OPERATION 
    end 
} 

cuda_kernel 2{ 

    loop 3 
     DO JUST SECOND OPERATION 
    end 
} 


ETC 

을 할 CUDA는에 최고라고 생각하면 내 질문은 그러나 사람은 직렬 다른 후 호출되며, 루프 (3) 각 작업에 대해 반복됩니다.

그럼 모든 것을 한 번에 계산하거나 각 커널을 separetely 할 것을 권합니다.

답변

1

커널 호출은 실행 시간면에서 매우 비쌉니다. 단일 커널 호출로 스택하는 작업이 많을수록 성능이 향상됩니다. 실제로 수행합니다

cuda_kernel { 
loop 2 
    loop 3 
    Do stuff here ... 
    end 
end 
} 

이 모든 일을 실행하는 가장 빠른 방법이 될 것이다. 여기에 두 개의 루프를 사용했는데, 중첩 루프가 있어도 커널 호출을 루프에 넣는 대신 커널 내부에서 루프를 수행한다는 것을 보여줍니다. 희망이 도움이됩니다.

+1

"커널 호출은 실행 시간면에서 매우 비쌉니다"? 내가 사용하는 플랫폼에서는 약 10-15 마이크로 초입니다. – talonmies

+0

남자, 10-15 마이크로 초는 여전히 엄청납니다 (이 숫자에 대해서는 확신합니다). 800MHz의 코어 클럭을 생각하면 10us는 8000 클럭 사이클과 같습니다. 그게 많이 있습니다. 특히, 커널 실행이 그만큼 시간이 걸리지 않으면, 커널 호출이 지배하게됩니다. – Bichoy

+0

실제로 커널은 한 번만 호출되므로 걱정할 필요가 없습니다. 32 개의 다른 커널이있을 것이므로 루프 2를 완전히 제거 할 수 있습니다. 그러나 커널 내 루프 3은 큰 커널을 사용하면 단 한 번이 아니라 여러 번 여러 번 반복됩니다. 따라서 제 질문에 어떤 것이 더 효율적이라고 생각하십니까? – Atirag

관련 문제