AoS와 SoA

AoS and SoA

컴퓨팅에서 구조 배열(AoS), 배열 구조(SoA) 배열 구조 배열(AoSoA)인터리빙과 관련하여 메모리에 기록 순서를 배열하는 대조적인 방법을 말하며, SIMDSIMT 프로그래밍에 관심이 있다.

배열구조

배열 구조(SoA)는 레코드(또는 C 프로그래밍 언어로 '구조')의 요소를 필드당 하나의 병렬 배열로 구분하는 배치다.[1] 하나의 SIMD 레지스터가 광범위한 내부 데이터패스(예: 128비트)에 의해 전송될 수 있는 동질적인 데이터를 로드할 수 있기 때문에 동기는 대부분의 명령 집합 아키텍처에서 포장된 SIMD 명령으로 조작하기가 더 쉽다. 레코드의 특정 부분만 필요한 경우, 해당 부분만 반복하면 더 많은 데이터가 단일 캐시 라인에 들어갈 수 있다. 단점은 데이터를 통과할 때 더 많은 캐시 방법이 필요하고, 비효율적인 인덱스 어드레싱이 필요하다는 것이다.

예를 들어, 배열 구조를 사용하여 N개의 점을 3D 공간에 저장하려면:

구조상의 포인트리스트3d {     둥둥 뜨다 x[N];     둥둥 뜨다 y[N];     둥둥 뜨다 z[N]; }; 구조상의 포인트리스트3d 포인트; 둥둥 뜨다 get_point_x(인트로 i) { 돌아오다 포인트.x[i]; } 

구조 배열

구조물의 배열(AoS)은 서로 다른 분야의 데이터를 인터리브하는 반대(및 더 일반적인) 레이아웃이다. 이것은 종종 더 직관적이고 대부분의 프로그래밍 언어에 의해 직접적으로 지원된다.

예를 들어, 구조 배열을 사용하여 N개의 점을 3D 공간에 저장하려면:

구조상의 점3D {     둥둥 뜨다 x;     둥둥 뜨다 y;     둥둥 뜨다 z; }; 구조상의 점3D 포인트[N]; 둥둥 뜨다 get_point_x(인트로 i) { 돌아오다 포인트[i].x; } 

배열 구조 배열

배열 구조(AoSoA) 또는 타일 구조체배열은 이전 배치 간의 하이브리드 접근법으로, SIMD 벡터 크기와 동일한 크기의 타일 또는 블록을 사용하여 서로 다른 필드의 데이터를 인터리브한다. 이는 종종 덜 직관적이지만 SoA 접근방식의 메모리 처리량을 달성하는 한편, 현대 프로세서의 캐시 위치성 및 로드 포트 아키텍처에 더 우호적이다.[2] 특히 현대 프로세서의 메모리 요청은 고정 폭(예: 캐시라인[3] 크기)으로 충족해야 한다. AoSoA의 타일 스토리지는 메모리 액세스 패턴을 요청의 고정 너비에 맞춰 조정하므로, 메모리 요청을 완료하기 위한 액세스 작업이 줄어들어 효율성이 높아진다.[4]

예를 들어, SIMD 레지스터 너비가 8 float(또는 8×32 = 256비트)인 배열의 어레이 구조를 사용하여 N 점을 3D 공간에 저장하려면:

구조상의 점3Dx8 {     둥둥 뜨다 x[8];     둥둥 뜨다 y[8];     둥둥 뜨다 z[8]; }; 구조상의 점3Dx8 포인트[(N+7)/8]; 둥둥 뜨다 get_point_x(인트로 i) { 돌아오다 포인트[i/8].x[i%8]; } 

실제 SIMD 레지스터 너비에 따라 다른 너비가 필요할 수 있다. 내부 배열을 다음과 같은 SIMD 유형으로 교체할 수 있다. float32x8 그러한 지원을 받는 언어의 경우.

대안

(각 개별 필드가 아닌) 구조물의 일부 서브셋을 병렬 배열로 분할할 수 있으며, 이는 프로그램에서 서로 다른 시간대에 서로 다른 필드 조각을 사용하는 경우(데이터 지향 설계 참조) 실제로 기준 위치를 개선할 수 있다.

일부 SIMD 아키텍처는 동일한 데이터를 SoA 형식에서 로드하기 위한 계단식 로드/저장 지침을 제공한다. 그러나 일부 라이브러리에서 사용되는 또 다른 옵션은 소스를 레지스터에 로드할 때 AoS 형식에서 데이터를 분리하고 결과를 작성할 때(퍼머트 초경량 문제로 인해 설계됨) 인터리브하는 것이다. 일부 벡터 함수 라이브러리관련 데이터 경로 및 지침을 활용하기 위해 SIMD 레지스터에 부동소수점 4D 벡터를 정렬하는 동시에 4차선보다 넓은 SIMD 유닛으로 확장되지는 않지만 프로그래머 편의를 제공한다.

4D 벡터

AoS 대 SoA는 4레인 SIMD 하드웨어가 장착된 기계의 3D 또는 4D 벡터 데이터를 고려할 때 선택권을 제시한다. SIMD ISA는 대개 동종 데이터를 위해 설계되지만, 일부는 도트 제품 지침과[5] 추가 허용오차를 제공하여 AoS 사례를 다루기 쉽게 한다.

대부분의 GPU 하드웨어가 4D 지시에서 스칼라 SIMT 파이프라인으로 옮겨갔지만,[6] AoS 대신 SoA를 사용하는 현대적인 컴퓨팅 커널은 메모리 결합으로 인해 여전히 더 나은 성능을 제공할 수 있다.[7]

소프트웨어 지원

대부분의 언어는 레코드와 다양한 배열 추상 데이터 유형을 결합하여 AoS 형식을 보다 자연스럽게 지원한다.

SoA는 주로 데이터 지향 설계를 지원하는 데 사용되는 언어, 라이브러리 또는 메타프로그래밍 도구에서 발견된다. 예를 들면 다음과 같다.

  • 실험용 자이 프로그래밍 언어의 SIMD 지향적 특징은 언어 수준 SoA 지원을 위한 최근의 시도다.[8]
  • R, 파이썬의 팬더 패키지, 줄리아의 데이터프레임에서 구현된 "데이터 프레임".jl 패키지는 AoS처럼 SoA에 접속하기 위한 인터페이스다.
  • Julia 패키지 StructureArrays.jl은 SoA를 AoS로 액세스하여 SoA의 성능과 AoS의 직관성을 결합할 수 있도록 한다.
  • Datadraw 및 X Macro 기술을 포함한 C 언어의 코드 생성기.

AoSoA의 자동 생성은 더 복잡하다. 메타프로그래밍에서 AoSoA의 예는 C++로 작성된 LANL의 Cabana 라이브러리에서 찾을 수 있으며, 벡터 폭은 기본적으로 16차선으로 가정한다.[9]

참조

  1. ^ "How to Manipulate Data Structure to Optimize Memory Use". Intel. 2012-02-09. Retrieved 2019-03-17.
  2. ^ "Memory Layout Transformations". Intel. 2019-03-26. Retrieved 2019-06-02.
  3. ^ "Kernel Profiling Guide" (PDF). NVIDIA. 2022-12-01. Retrieved 2022-01-14.)
  4. ^ Fei, Yun (Raymond); Huang, Yuhan; Gao, Ming (2021), "Principles towards Real-Time Simulation of Material Point Method on Modern GPUs", pp. 1–16, arXiv:2111.00699 [cs.GR]
  5. ^ "Intel SSE4 Floating Point Dot Product Intrinsics". Intel. Archived from the original on 2016-06-24. Retrieved 2019-03-17.
  6. ^ "Modern GPU Architecture (See Scalar Unified Pipelines)" (PDF). NVIDIA. Archived from the original (PDF) on 2018-05-17. Retrieved 2019-03-17.
  7. ^ Kim, Hyesoon (2010-02-08). "CUDA Optimization Strategies" (PDF). CS4803 Design Game Consoles. Retrieved 2019-03-17.
  8. ^ Blow, Jonathan (2015-01-21). "Data oriented demo: SoA, composition". YouTube. Retrieved 2019-03-17. JAI 언어로 데이터 지향 및 SoA 기능을 시연하고, 동기를 설명하기도 한다.
  9. ^ "ECP-copa/Cabana: AoSoA". GitHub.