이것은 원래 게시물에서 이해할 수 있습니다 (내 첫 SO) efficient-4x4-matrix-vector-multiplication-with-sse-horizontal-add-and-dot-prod . 나머지 논의는 4x4 행렬에 적용됩니다.
여기서 행렬 시간 벡터 수행 할 두 가지 방법이있다 (V = V 및 U는 열 벡터이다 MU) 두 번째는 더 효율적인 동안 첫 번째 방법은 수학 클래스에서 더 익숙한
method 1) v1 = dot(row1, u), v2 = dot(row2, u), v3 = dot(row3, u), v4 = dot(row4, u)
method 2) v = u1*col1 + u2*col2 + u3*col3 + u4*col4.
SIMD 컴퓨터. 두 번째 방법은 벡터화 된 수학 (예 : numpy)을 사용합니다. 이제
u1*col1 = (u1x*col1x, u1y*col1y, u1z*col1z, u1w*col1w).
의 벡터 시간 매트릭스를 살펴 보자
method 1) v1 = dot(col1, u), v2 = dot(col2, u), v3 = dot(col3, u), v4 = dot(col4, u)
method 2) v = u1*row1 + u2*row2 + u3*row3 + u4*row4.
지금 열 및 행의 역할이 교환했지만 방법이 여전히 효율적인 방법이다 (V = μM의 경우 V 및 u는 행 벡터이다) SIMD 컴퓨터에서 사용할 수 있습니다.
SIMD 컴퓨터에서 행렬 시간 벡터를 효율적으로 수행하려면 행렬을 열 주요 순서로 저장해야합니다. SIMD 컴퓨터에서 벡터 시간 행렬을 효율적으로 수행하려면 행렬을 행 우선 순서로 저장해야합니다.
필자가 이해하는 한, OpenGL은 열 주 순서를 사용하고 행렬 시간 벡터를 사용하며 DirectX는 행 우선 순서를 사용하고 벡터 시간 행렬을 사용합니다. 당신이 벡터 행렬 회 먼저 M2 다음 M3 순서 M1에서와 세 행렬 변환이있는 경우, 벡터 회는 어느 형태가 더
v = u*M1*M2*M3 //u and v are row vectors - DirectX form
물품 행렬 당신
v = M3*M2*M1*u //u and v are column vectors - OpenGL form
다 쓰고 효율성 측면에서 다른 것보다. 표기법의 문제입니다 (경쟁을 할 때 혼란을 일으킴).
행렬 * 행렬과 열 - 행렬 저장은 관련이 없다는 점에 유의해야합니다.
왜 수직 SIMD 명령어가 묻는 별도의 질문 인 수평 SIMD 명령어보다 빠른 지 알고 싶다면 간단히 수평 명령어는 병렬이 아닌 직렬로 동작하며 몇 가지 마이크로 연산으로 분해됩니다 (역설적으로 dppd
은 dpps
보다 빠릅니다.
이 질문은 http://programmers.stackexchange.com에 더 적합합니다. –
@Claptrap 왜? 나는 그 질문을 향상 시키거나 바꿀 용의가있다. – user1095108
@Claptrap : 왜 프로그래머가 더 잘 맞는 지 모르겠습니다 ... –