충돌 감지 클래스의 성능을 향상시키는 동안 gpu에서 보낸 시간의 ~ 80 %가 루프를 통과 해야하는 버킷의 경계를 파악하려는 경우 if / else 조건에 소비되는 것으로 나타났습니다.
더 정확하게:
각 스레드는 ID를 얻습니다.이 ID로 메모리에서 삼각형을 가져옵니다 (각 정수 3 개). 그러면 3만큼 정점을 가져옵니다 (3은 각각 float).
그런 다음 정점을 정수 격자 점 (현재 8x8x8)으로 변환하고 해당 격자의 삼각형 경계로 변환합니다.
3 개의 점을 경계로 변환하기 위해 각 점 중 각 차원의 최소 / 최대를 찾습니다.
내가 사용하는 프로그래밍 언어에 minmax 내장 함수가 누락되었으므로 직접 만들었습니다.
procedure MinMax(a, b, c):
local min, max
if a > b:
max = a
min = b
else:
max = b
min = a
if c > max:
max = c
else:
if c < min:
min = c
return (min, max)
따라서 평균적으로 2.5 * 3 * 3 = 22.5 비교 여야합니다. 실제 삼각형-모서리 교차 테스트보다 약 많은 시간을 소비합니다 (약 100 * 11-50 지침).
사실, CPU에서 필요한 버킷을 사전 계산하고 (단일 스레드, 벡터화 없음) 버킷 정의와 함께 GPU보기에서 스택하고 GPU가 스레드 당 ~ 4 추가 읽기를 수행하는 것이 시도보다 6 배 빠릅니다. 그 자리에서 경계를 알아낼 수 있습니다. (동적 메쉬를 다루기 때문에 매 실행 전에 재 계산됩니다.)
그렇다면 왜 GPU에서 비교가 그렇게 끔찍한가요?