그래서 이미지에 많은 변형을 적용해야하는이 방법이 있습니다. 전체적으로 동일한 데이터에 적용되는 몇 가지 다른 작업이 필요합니다. 내 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 할 것을 권합니다.
"커널 호출은 실행 시간면에서 매우 비쌉니다"? 내가 사용하는 플랫폼에서는 약 10-15 마이크로 초입니다. – talonmies
남자, 10-15 마이크로 초는 여전히 엄청납니다 (이 숫자에 대해서는 확신합니다). 800MHz의 코어 클럭을 생각하면 10us는 8000 클럭 사이클과 같습니다. 그게 많이 있습니다. 특히, 커널 실행이 그만큼 시간이 걸리지 않으면, 커널 호출이 지배하게됩니다. – Bichoy
실제로 커널은 한 번만 호출되므로 걱정할 필요가 없습니다. 32 개의 다른 커널이있을 것이므로 루프 2를 완전히 제거 할 수 있습니다. 그러나 커널 내 루프 3은 큰 커널을 사용하면 단 한 번이 아니라 여러 번 여러 번 반복됩니다. 따라서 제 질문에 어떤 것이 더 효율적이라고 생각하십니까? – Atirag