2016-07-30 2 views
3

필자는 단순히 필터 처리 만하지 않고 거기에서 계산을하기 때문에 계산 쉐이더를 사용하여 밉맵을 수동으로 생성하고 있습니다.계산 쉐이더로 밉맵 계산하기, 완료 했습니까?

스트롱 워크 방식은 레벨 1의 텍셀 당 레벨 0에서 4 개의 해당 텍셀을 읽고 필터링 한 다음 텍셀을 작성하는 것입니다. 그것을 전체 레벨에 대해 수행 한 다음 다음 레벨에 대해 반복하십시오.

그러나 레벨 0을 읽고 레벨 1을 작성한 다음 레벨 1을 다시 읽는 대신 레벨 2 등을 작성하는 것이 더 빠릅니다. 레벨 0의 타일을 읽은 다음 동일한 디스패치 호출에서 다음 몇 레벨에 대한 모든 값을 반복적으로 쓰십시오. 이렇게하면 읽기의 절반까지 절약 할 수 있습니다.

내 질문은 이미 완료 되었습니까? 효율적인 것으로 입증 된보다 자세한 알고리즘에 관심이 있습니다.

특히, 나는 가장 큰 것부터 가장 작은 것까지 miplevel을 먼저 계산하는 pull-push 알고리즘을 구현하고 있습니다. 두 번째 단계에서는 원래의 텍셀을 사용하거나 거친 miplevel에서 네 개의 주변 텍셀을 보간하여 두 번째부터 작은 것으로 시작하여 miplevel을 정제합니다. 이것에 대한 효율적인 계산 방법은 잘보고 싶지만, 검색을 통해 찾을 수 없습니다.

+0

하지만이 작업을 한 번의 반복 작업으로 수행하면 인접 호출 등의 결과 데이터를 읽어야하므로 동기화 악몽이됩니다. – derhass

+0

@derhass : 하나의 작업 그룹 (반복적으로, 텍셀 당 하나의 스레드가 아님)으로 64x64 타일을 처리 한 다음 레벨 1에 32x32 텍셀을 작성하고 공유 메모리에 쓰고 레벨 2의 16x16 텍셀을 계산하는 것과 같은 것을 상상해 보았습니다. 8x8에서 레벨 3으로 변경 한 다음 다른 호출을 수행하거나보다 효율적인 방법에 따라 1x1로 줄입니다. 어떠한 방법으로도 동기화가 필요하지 않습니다. 두 번째 (푸시) 단계에서 작업 그룹은 중복되는 데이터 타일을 읽지 만 여전히 동기화가 필요하지 않습니다. – karyon

답변

1

저는 이것이 기본적으로 몇 가지 제약이있는 병렬 감소라는 것을 깨닫지 못했습니다. 병렬 감소를 위해, 또한 여기에서 적용 할 수있는 최적화 전략의 많은 NVIDIA에서 좋은 백서가 : 또한 https://docs.nvidia.com/cuda/samples/6_Advanced/reduction/doc/reduction.pdf

가, 내가 여기 컴퓨팅 쉐이더로 다운 스케일링의 예 구현을 발견 https://mynameismjp.wordpress.com/2011/08/10/average-luminance-compute-shader/은 조금 오래된, 그는 예를 들어, 비록 명시 적으로 지침을 벡터화하려고 시도했습니다.