2012-02-05 3 views
1

raymarching은 매우 조건 적입니다. 즉, 각 단계에서 개별 광선의 방향에 따라 달라지는 불투명도, 종결 등을 확인하기 때문에 각 광선이 고유 한 실행 경로를 따르기 때문입니다.SIMD 아키텍처 하에서 raymarching을 가속화 할 수 있습니까?

따라서 SIMD가 크게 가속화되지는 않을 것입니다. 오히려 가속을 위해 MIMD가 필요할 것입니다.

의미가 있습니까? 아니면 뭔가 빠졌습니까?

답변

1

이미 언급 한 바와 같이, 당신은 아마 SSE 명령어를 사용하여 벡터 연산을 구현에서 속도 향상을 얻을 수있다 (효과의 인식은 here 논의 - 또한 다른 접근 방식). 이 방법을 사용하면 코드 을 간결하고 유지 관리 할 수 ​​있습니다. 원칙적으로

하는 것이 가능해야한다 : 나는 가정

그러나, 귀하의 질문에 여러 스칼라 값에게 다른 선을 각각 처리하는 즉 "패킷 통과"(또는 같은 )에 관한 것입니다 음영을 다른 패스로 연기합니다. 베어 메쳐 패스가 종료되고 임시 결과가 음영 패스의 입력으로 저장되면 SIMD 패킷을 새로운 광선으로 다시 채울 수 있습니다. 이렇게하면 코드의 특정 사례 별 병렬 처리 비율을 4 개의 SIMD 레인으로 모두 병렬화 할 수 있습니다. 이미지를 타일링하고 Morton 순서로 광선을 인덱싱하는 것은 캐시 압력을 피하기 위해 일 수 있습니다 (기하학이 엄격히 절차 적이지 않은 한).

시도하지 않으면 돈을 지불할지 여부를 알 수 없습니다. 내 생각에, 만약 이 있다면, 속도 향상의 양은 단지 4 레인의 코드 의 복잡함에 가치가 없을 수도 있습니다.

프로그래밍 가능한 GPU 같은 SIMT 아키텍처를 사용 해본 적이 있습니까? 다소 최신의 프로그래밍 가능 그래픽 보드를 사용하면 대화 형 속도로 raymarching을 수행 할 수 있습니다 (브라우저의 here 참조).

+0

[답변에 추가] (http://www.yosefk.com/blog/simd-simt-smt- parallelism-in-nvidia-gpus.html)에서 SIMT와 SIMD의 차이점을 불확실한 사람들에게 알려줍니다. –

0

예를 들어, SSE에서만 벡터에 대한 연산을 병렬로 수행 할 수 있습니다.

1

마지막으로 저는 멘저 스폰지를위한 소프트웨어 기반의 raymarcher를 만들었습니다. 지금은 SIMD를 사용하지 않고 특별한 알고리즘을 사용하지 않았습니다. 나는 X와 Y에서 -1에서 1까지 추적한다. 대상 텍스처의 경우 U와 V이다. 그런 다음 카메라 위치와 대상을 가져와 라임 그룹의 증가 벡터를 계산합니다.

그런 다음 나는 일정한 값의 반복을 사용하여 수행합니다. 하나의 분기 만 프랙탈 볼륨과의 교차점을 결정합니다. 그래서 내 카메라의 눈이 E이고 내 방향 벡터가 D라면 가장 작은 t를 찾아야합니다. 내가 그것을 발견하거나 최대 거리에 이르면 나는 그 고리를 깬다. 끝에는 조각 색상을 계산하는 것으로부터 t가 있습니다.

내 생각에 SSE1/2에 의해 이러한 연산을 병렬 처리 할 수 ​​있어야합니다. 벡터에서 필드를 null'ing하여 분기를 해결할 수 있기 때문에 (__m64/__m128), 여기서는 SIMD 연산이 더 이상 적용되지 않습니다. . raymarch/-cast가 무엇인지에 따라 달라집니다. 그러나 함수의 조각 색상을 계산하면 (여기에있는 내 프랙탈 곡선과 같습니다) 메모리를 비선형 적으로 액세스하지 못하게하려면 가능한 한 몇 가지 트릭이 있습니다.

물론이 답변에는 추측이 포함되어 있지만이 루틴을 병렬 처리 할 때 알려 드리겠습니다.

+0

감사합니다. 그렇다면 여기에 메모를 남기세요. –