메모리 계층 구조
위와 같이 x 좌표만 합산하는 처리를, 구조체의 배열(각 성분을 별도의 배열로 만든 형태)로 바꾸면 빨라지기 쉬운 이유는 무엇입니까?
struct P { float x, y, z, mass; };
struct P p[N];
for (i = 0; i < N; i++)
sx += p[i].x;
- A구조체의 배열인 채로는 컴파일러가 x만 읽어 내는 명령을 만들 수 없기 때문
- B별도의 배열로 하면 부동소수점 계산이 더 높은 정밀도가 되기 때문
- Cx만 연속해서 늘어서므로 읽어 온 라인에 불필요한 성분이 섞이지 않기 때문
정답과 해설 보기
정답: C. x만 연속해서 늘어서므로 읽어 온 라인에 불필요한 성분이 섞이지 않기 때문
구조체의 배열(AoS)에서는 x, y, z, mass 16바이트가 한 묶음으로 늘어서므로, x만 읽는 처리에서도 64바이트 라인의 4분의 3은 사용하지 않는 데이터가 됩니다. 각 성분을 별도의 배열(SoA)로 하면 x만 연속해서 늘어서므로 읽어 온 라인을 모두 사용할 수 있고, 메모리 통신량이 약 4분의 1이 됩니다. SIMD에 의한 벡터화도 쉬워집니다. AoS에서도 x를 읽는 명령은 만들 수 있으며, 배열의 형태를 바꿔도 계산의 정밀도는 변하지 않습니다.
- A. AoS에서도 x를 읽는 명령은 문제없이 만들 수 있습니다.
- B. 데이터의 배열 방식을 바꿔도 계산의 정밀도는 변하지 않습니다.
- C. 올바릅니다. 필요한 x만 연속해서 늘어서므로 라인을 낭비 없이 사용할 수 있습니다.