셰이더의 루프 성능


11

동적 루프 함수를 셰이더에 통합하는 가장 좋은 방법이 무엇인지 궁금합니다.

첫째, 동적 배열이 불가능한 것 같습니다. 따라서 최대 크기 배열을 만들고 그 일부만 채우거나 사전 정의 된 크기로 배열을 정의하는 것이 더 낫습니까?

그렇다면이 배열을 반복하는 가장 좋은 방법은 무엇입니까?

4 ~ 128 회 반복을 위해 롤링되지 않은 루프 나 동적 루프를 사용하는 것이 더 낫습니까? 또한 사전 정의 된 최대 반복 횟수로 롤을 풀고 다음과 같은 조건으로 중지 할 수 있음을 보았습니다 if (i == myCurrentMaximumIterationNumber).


2
배열과 루프로 무엇을하려고합니까? 이것이 어떻게 든 XY 문제 처럼 들리기 때문에 묻습니다 . GPU에서 조건과 루프를 사용하는 가장 좋은 방법은 GPU를 사용하지 않는 것이므로 배열과 루프를 사용하는 대신 더 나은 방법이있을 수 있습니다.
Nero

현재 작동하는 화면 공간 하위 표면 산란 효과를 구현하고 있습니다. 그러나 성능에 따라 커널을 사용하는 방법에 대한 의구심이 있습니다. 최대 배열 크기를 수행하고 일부만 채우고 현재 사용되는 배열 내용과 관련된 동적 반복 횟수가있는 동적 루프를 사용하기로 선택했습니다. 예를 들어 퍼포먼스에 따라 쉐이더를 프로그래밍 할 때해야 할 일이나 알아야 할 것이 있다고 생각합니다. 그리고 내 의견으로는 루프는 일부 규칙과 "좋은 관행"을 따르는 일반적인 성능 주제이지만 그에 대한 좋은 대답을 찾지 못했습니다.
MaT

답변:


6

초기 HW에는 흐름 제어 기능이 없었고 최신 HW의 비용이 다양하기 때문에 셰이더 컴파일러는 언 롤링에 대해 매우 공격적입니다. 벤치마킹하고 적극적으로 테스트하고있는 다양한 하드웨어가 있다면 어떤 일이 발생하는지 확인하십시오. 동적 루프는 정적 루프보다 개발자 개입에 더 적합하지만 벤치 마크를 사용할 수 없다면 컴파일러에 맡기는 것이 좋습니다. 벤치 마크를 통해 탐험은 가치 있고 재미 있습니다.

BTW, GPU에서 동적 루프로 인한 가장 큰 손실은 wavefront / warp의 개별 "스레드"가 다른 시간에 완료된다는 것입니다. 나중에 중지하는 스레드는 조기에 완료된 모든 스레드가 NOP를 실행하도록합니다.

중첩 루프는 신중하게 생각해야합니다 .JPEG와 같은 압축을 위해 0을 실행하는 블록 기반 엔트로피 디코더를 구현했습니다. 자연스러운 구현은 단단한 내부 루프에서 실행을 디코딩하는 것이 었습니다. 이는 종종 하나의 스레드 만 진행되고 있음을 의미했습니다. 루프를 평탄화하고 각 스레드에서 현재 실행을 디코딩하는지 여부를 명시 적으로 테스트하여 고정 길이 루프를 통해 모든 스레드를 활성 상태로 유지했습니다 (디코딩 된 블록의 크기는 모두 동일했습니다). 스레드가 CPU 스레드와 같으면 변경 사항이 끔찍했지만 실행중인 GPU에서 6 배의 성능 향상을 얻었습니다 (여전히 끔찍합니다-GPU를 계속 사용하기에 충분한 블록이 없었습니다- 그러나 그것은 개념의 증거였습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.