2010-06-24 3 views
2

일부 비디오를 처리하기 위해 CUDA 응용 프로그램을 설계하고 있습니다. 내가 사용하고있는 알고리즘은 Conway의 삶의 게임과 다르지 않은 방식으로 빈 픽셀을 채우기 위해 호출합니다 : 다른 픽셀 주변의 픽셀이 모두 채워지고 비슷한 값이 모두 있으면 특정 픽셀이 주변 값으로 채워집니다. 이것은 수정해야 할 모든 픽셀 수가 마지막 반복에서 고쳐야 할 픽셀의 수와 같을 때까지 반복됩니다 (즉, 아무것도 할 수 없을 때).픽셀을 전달하는 대용량 병렬 알고리즘

내 처지는 다음과 같습니다. 처리 파이프 라인의 이전 부분과 다음 부분은 모두 GPU의 CUDA에서 구현됩니다. 전체 이미지를 RAM으로 다시 전송하고 CPU에서 처리 한 다음 다시 GPU로 전송하는 것은 비용이 많이 듭니다. 속도가 느려지더라도 알고리즘을 CUDA로 구현하고 싶습니다.

그러나이 문제는 각 반복마다 전역 이미지를 업데이트하기 위해 모든 스레드 간의 동기화가 필요합니다. 각 반복에 대해 커널을 여러 번 호출하는 것에 대해 생각해 보았지만 각 반복 사이에 CPU로 데이터를 다시 전송하지 않으면 프로세스가 "완료"되었는지 확인할 수 없습니다. 각 순환 사이에 메모리 전송 대기 시간 때문에 큰 비효율을 초래합니다. PCI-e 인터페이스.

병렬 알고리즘에 대한 경험이있는 사람이라면 누구 제안이 있습니까? 미리 감사드립니다.

답변

2

수정되지 않은 입력 이미지를 하나의 버퍼에 유지하고 처리 된 출력 이미지를 두 번째 버퍼에 쓸 수 있도록 여분의 이미지 버퍼가 필요한 것처럼 들립니다. 그 방법은 각 스레드가 동기화 등을 염려하지 않고 단일 출력 픽셀 (또는 출력 픽셀의 작은 블록)을 처리 할 수 ​​있습니다.

+0

답변 해 주셔서 감사합니다. 나는 알고리즘에 대해 너무 명확하지 않다고 생각하지만,이 프로세스를 반복해야한다는 사실 때문에 문제가 생깁니다. 첫 번째 반복은 일부 픽셀을 채울 것이고 두 번째 반복은 첫 번째 반복에서 결과를 읽고 첫 번째 반복에서 채울 수 없었던 더 많은 픽셀을 채워야합니다. 동기화의 필요성은 픽셀 자체를 처리하기 전에 모든 주변 픽셀의 결과를 알 필요가 있기 때문에 발생합니다. – Xzhsh

+0

OK -하지만 두 개의 버퍼로이 작업을 수행하고 앞뒤로 전환 할 수 없습니까? A -> B -> A -> B -> ...? 그렇지 않다면 아마도 실제 알고리즘에 대한 더 자세한 정보가 필요합니다. –

+0

CUDA만이 스레드 블록 간의 동기화를 허용하는 경우 이와 같이 구현할 수 있습니다. 기본적으로 2 단계는 1 단계에 따라 다르며 3 단계는 2 단계에 따라 달라집니다. 스레드 블록 (최대 512 스레드) 내부의 스레드간에 만 동기화 할 수 있습니다. 많은 쓰레드 블록이 없다면 CUDA의 병렬 처리를 이용하지 않을 것이지만 많은 쓰레드 블록과 함께 커널을 여러 번 호출하는 것을 제외하고는 각각이 반복하기 전에 끝날 것이라고 보장 할 방법이 없습니다. 그리고 커널을 여러 번 호출하고 싶다면 CPU에 데이터를 다시 전송하여 완료되었는지 확인해야합니다. : | – Xzhsh

관련 문제