Articulo de referencia

AoS y SoA

En informática , una matriz de estructuras (AoS) , una estructura de matrices (SoA) o una matriz de estructuras de matrices (AoSoA) son formas contrastantes de organizar una sec...

En informática , una matriz de estructuras (AoS) , una estructura de matrices (SoA) o una matriz de estructuras de matrices (AoSoA) son formas contrastantes de organizar una secuencia de registros en memoria , con respecto al entrelazado , y son de interés en la programación SIMD y SIMT .

Estructura de los arreglos

La estructura de matrices ( SoA ) es una disposición que separa los elementos de un registro (o 'struct' en el lenguaje de programación C ) en una matriz paralela por campo . [ 1 ] La motivación es una manipulación más sencilla con instrucciones SIMD empaquetadas en la mayoría de las arquitecturas de conjuntos de instrucciones , ya que un solo registro SIMD puede cargar datos homogéneos , posiblemente transferidos por una ruta de datos interna amplia (por ejemplo, 128 bits ). Si solo se necesita una parte específica del registro, solo esas partes necesitan ser iteradas, lo que permite que quepan más datos en una sola línea de caché. La desventaja es que requiere más vías de caché al recorrer los datos y un direccionamiento indexado ineficiente .

Por ejemplo, para almacenar N puntos en un espacio 3D utilizando una estructura de matrices:

struct Vector3List {flotar x [ N ];flotar y [ N ];flotar z [ N ];};struct Vector3List puntos ;float obtener_punto_x ( tamaño_t i ) {puntos de retorno . x [ i ];}

Conjunto de estructuras

La disposición de matrices de estructuras ( AoS ) es la opuesta (y más convencional), en la que los datos de diferentes campos se intercalan. Esto suele ser más intuitivo y la mayoría de los lenguajes de programación lo admiten directamente .

Por ejemplo, para almacenar N puntos en un espacio 3D utilizando una matriz de estructuras:

struct Vector3 {flotar x ;flotar y ;flotar z ;};struct Vector3 puntos [ N ];float obtener_punto_x ( tamaño_t i ) {puntos de retorno [ i ]. x ;}

Conjunto de estructuras de conjuntos

El array de estructuras de arrays ( AoSoA ) o array de estructuras en mosaico es un enfoque híbrido entre los diseños anteriores, en el que los datos de diferentes campos se intercalan utilizando mosaicos o bloques con un tamaño igual al del vector SIMD. Esto suele ser menos intuitivo, pero puede lograr el rendimiento de memoria del enfoque SoA, a la vez que es más compatible con la localidad de caché y las arquitecturas de puertos de carga de los procesadores modernos. [ 2 ] En particular, las solicitudes de memoria en los procesadores modernos deben satisfacerse en un ancho fijo (por ejemplo, el tamaño de una línea de caché [ 3 ] ). El almacenamiento en mosaico de AoSoA alinea el patrón de acceso a la memoria con el ancho fijo de las solicitudes, lo que reduce las operaciones de acceso para completar una solicitud de memoria y, por lo tanto, aumenta la eficiencia. [ 4 ]

Por ejemplo, para almacenar N puntos en un espacio 3D utilizando una matriz de estructuras de matrices con un ancho de registro SIMD de 8 números de coma flotante (o 8 × 32 = 256 bits):

struct Vector3x8 {flotar x [ 8 ];flotar y [ 8 ];flotador z [ 8 ];};struct Vector3x8 puntos [( N + 7 ) / 8 ];float obtener_punto_x ( tamaño_t i ) {puntos de retorno [ i / 8 ]. x [ i % 8 ];}

Dependiendo del ancho real del registro SIMD, puede ser necesario un ancho diferente. Los arreglos internos pueden reemplazarse con tipos SIMD, como en float32x8el caso de lenguajes que admiten dicha funcionalidad.

Alternativas

Vectores 4D

La elección entre AoS y SoA se presenta al considerar datos vectoriales 3D o 4D en máquinas con hardware SIMD de cuatro carriles. Las arquitecturas SIMD suelen diseñarse para datos homogéneos; sin embargo, algunas proporcionan una instrucción de producto escalar [ 5 ] y permutaciones adicionales, lo que facilita el manejo del caso AoS.

Aunque la mayoría del hardware de GPU ha pasado de las instrucciones 4D a las canalizaciones SIMT escalares , [ 6 ] los núcleos de cómputo modernos que utilizan SoA en lugar de AoS todavía pueden ofrecer un mejor rendimiento debido a la coalescencia de memoria. [ 7 ]

Soporte de software

La mayoría de los lenguajes admiten el formato AoS de forma más natural combinando registros y varios tipos de datos abstractos de matriz .

La arquitectura orientada a servicios (SoA) se encuentra principalmente en lenguajes, bibliotecas o herramientas de metaprogramación utilizadas para dar soporte a un diseño orientado a datos . Algunos ejemplos son:

  • Los "data frames", tal como se implementan en R , el paquete Pandas de Python y el paquete DataFrames.jl de Julia , son interfaces para acceder a SoA como AoS.
  • El paquete StructArrays.jl de Julia permite acceder a SoA como AoS para combinar el rendimiento de SoA con la intuición de AoS.
  • Generadores de código para el lenguaje C, incluyendo Datadraw y la técnica de macros X.

La creación automatizada de AoSoA es más compleja. Un ejemplo de AoSoA en metaprogramación se encuentra en la biblioteca Cabana de LANL , escrita en C++; por defecto, asume un ancho de vector de 16 carriles. [ 8 ]

Referencias

  1. "Cómo manipular la estructura de datos para optimizar el uso de la memoria" . Intel. 9 de febrero de 2012. Consultado el 17 de marzo de 2019 .
  2. "Transformaciones de la disposición de la memoria" . Intel. 26 de marzo de 2019. Consultado el 2 de junio de 2019 .
  3. "Guía de perfilado del kernel" (PDF) . NVIDIA. 1 de diciembre de 2022. Consultado el 14 de enero de 2022 .)
  4. ^ Fei, Yun (Raymond); Huang, Yuhan; Gao, Ming (2021), "Principios para la simulación en tiempo real del método de puntos materiales en GPU modernas", págs. 1 a 16, arXiv : 2111.00699 [ cs.GR ] 
  5. "Intel SSE4 Floating Point Dot Product Intrinsics" . Intel. Archivado del original el 24/06/2016 . Consultado el 17/03/2019 .
  6. "Arquitectura moderna de GPU (ver Pipelines unificados escalares)" (PDF) . NVIDIA. Archivado del original (PDF) el 17 de mayo de 2018. Consultado el 17 de marzo de 2019 .
  7. Kim, Hyesoon (2010-02-08). "Estrategias de optimización de CUDA" (PDF) . CS4803 Diseño de consolas de juegos . Recuperado el 2019-03-17 .
  8. «ECP-copa/Cabaña: AoSoA» . GitHub .