2012-02-09 3 views
2

비디오 프레임을 캡처 중입니다. 모든 프레임은 Image2D로서 커널에 전달됩니다. 저는 사용자가 선택할 수있는 약 5 개의 간단한 이미지 처리 알고리즘 (흐림, 선명도 등)을 가지고 있습니다 (다른 것들의 조합도 가능합니다).커널에서 다양한 수의 알고리즘을 처리하는 방법은 무엇입니까?

  1. 한 커널 : : 여기 세 가지 가능성을 볼 런타임에 선택 알고리즘 커널의 문자열을 구성하고 컴파일 (그리고 한 번 컴파일 지연의 오버 헤드를 가지고)
  2. 한 커널 : 선택한 알고리즘을 플래그로 처리하십시오 (조건부 분기가 바람직하지 않음을 이해하지만)
  3. 알고리즘 당 하나의 커널 : Image2Dread_only 또는 write_only 일 수 있으며, 반복적으로 커널의 출력 이미지 하나가 GPU에서 가져온 이미지이고 GPU에 대한 이미지입니다. 다음 커널의 이미지를 출력한다.

따라야 할 엄지 손가락 기준이 있습니까?

+0

조건부 실행에 대해서 : 당신이 말하는 분기의 종류는 그렇게 나쁘지 않을 것입니다. 모든 작업 항목은 주어진 커널 실행에 대해 여전히 동일한 경로로 진행됩니다. 그것은 서로 다른 작업 항목이 서로 다른 방향으로 분기되어 실제 성능을 저하시키는 상황입니다. – James

+0

제임스 감사합니다. 평가 해 보겠습니다. – rdoubleui

답변

2

readonly/writeonly 문제의 한 가지 해결 방법은 중간 단계에 버퍼를 사용하는 것입니다.

Image2D -> buffer0 -> buffer1 -> ... bufferN -> Image2D

아니면 중간 결과가 필요하지 않은 경우 그들과 함께 두 개의 버퍼 및 대체를 사용합니다. (I2d, B0, B1, B0, ..., I2D)

미리 적용 할 필터의 수를 알고 있어야하지만 그다지 문제가되지는 않습니다.

+0

재미있는 생각. 알고리즘은 순서대로 적용되므로 하나의 버퍼로 충분합니다. – rdoubleui

+0

물론 싱글 버퍼에 대해서는 틀 렸습니다. 적어도 내부적으로 두 개의 버퍼가 필요합니다. – rdoubleui

+1

나는이 방법을 사용하여 더 우아하게 발견했습니다. 하나의 커널에는 앞서 언급 한 분기가 있지만 분기는 모든 작업 항목에 대해 동일한 경로로 연결됩니다.나는 시간을 잰다. 그리고 그것은 차이를 만들지 않았다. – rdoubleui

1

나는 당신이 시도하고 처음 두 옵션

  1. 당신은 매우 읽을 복잡한 커널 코드를가집니다이 방법을 사용하지 않는 것이 좋습니다. 당신이 100 % 확신 할 수 있다면 코드가해야 할 일을하는 것은 괜찮습니다. 그것은 당신의 작업 아이템의 배열과 그룹화에 대한 고려 사항입니다. 요점은 어렵고 커널을 디버깅하고 유지하는 것입니다.

  2. 스레드가 다른 경로로 이동할 수있는 경우 첫 번째 옵션보다 성능이 떨어집니다. 단순 분기는 성능을 저하시키고 동기화에 문제를 일으킬 수 있습니다. 단순 분기에 추가하여 알고리즘에 스레드 수와 배열이 다를 수 있다는 사실을 고려해야합니다. 그렇다면 모든 운영에 대해 하나의 커널을 사용하는 것은 정말 나쁜 생각입니다.

나는 그것을 직접 시도하지 않았지만 @mfa가 제안한 옵션을 시도해야한다고 생각합니다.

+0

James의 코멘트를보십시오. 그는 모든 작업 항목이 여전히 동일한 경로로 진행되므로 두 번째 방법이 그리 나쁘지 않을 수도 있다고 가정합니다. 커널은 프레임마다 다르기 때문에 새로운 커널이 모든 프레임 전에 실행 대기열에 포함됩니다. 나는 결국 나의 시도가 이끌어 낸 것을보고 할 것이다. – rdoubleui

관련 문제