Lably
Skip to content

AoS and SoA

  • 5 min read
  • 6 chapters

Related on Lably

Through Computing, Record (computer science) and Computer memory

Structure of arrays

Structure of arrays (SoA) is a layout separating elements of a record (or 'struct' in the C programming language) into one parallel array per field. The motivation is easier manipulation with packed SIMD instructions in most instruction set architectures, since a single SIMD register can load homogeneous data, possibly transferred by a wide internal datapath (e.g. 128-bit). If only a specific part of the record is needed, only those parts need to be iterated over, allowing more data to fit onto a single cache line. The downside is requiring more cache ways when traversing data, and inefficient indexed addressing.

For example, to store N points in 3D space using a structure of arrays:

<span id="mwJw"></span><span class="linenos" data-line="1" id="mwKA"></span><span class="k" id="mwKQ">struct</span><span class="w" id="mwKg"> </span><span class="nc" id="mwKw">pointlist3D</span><span class="w" id="mwLA"> </span><span class="p" id="mwLQ">{</span> <span class="linenos" data-line="2" id="mwLg"></span><span class="w" id="mwLw"> </span><span class="kt" id="mwMA">float</span><span class="w" id="mwMQ"> </span><span class="n" id="mwMg">x</span><span class="p" id="mwMw">[</span><span class="n" id="mwNA">N</span><span class="p" id="mwNQ">];</span> <span class="linenos" data-line="3" id="mwNg"></span><span class="w" id="mwNw"> </span><span class="kt" id="mwOA">float</span><span class="w" id="mwOQ"> </span><span class="n" id="mwOg">y</span><span class="p" id="mwOw">[</span><span class="n" id="mwPA">N</span><span class="p" id="mwPQ">];</span> <span class="linenos" data-line="4" id="mwPg"></span><span class="w" id="mwPw"> </span><span class="kt" id="mwQA">float</span><span class="w" id="mwQQ"> </span><span class="n" id="mwQg">z</span><span class="p" id="mwQw">[</span><span class="n" id="mwRA">N</span><span class="p" id="mwRQ">];</span> <span class="linenos" data-line="5" id="mwRg"></span><span class="p" id="mwRw">};</span> <span class="linenos" data-line="6" id="mwSA"></span><span class="k" id="mwSQ">struct</span><span class="w" id="mwSg"> </span><span class="nc" id="mwSw">pointlist3D</span><span class="w" id="mwTA"> </span><span class="n" id="mwTQ">points</span><span class="p" id="mwTg">;</span> <span class="linenos" data-line="7" id="mwTw"></span><span class="kt" id="mwUA">float</span><span class="w" id="mwUQ"> </span><span class="nf" id="mwUg">get_point_x</span><span class="p" id="mwUw">(</span><span class="kt" id="mwVA">int</span><span class="w" id="mwVQ"> </span><span class="n" id="mwVg">i</span><span class="p" id="mwVw">)</span><span class="w" id="mwWA"> </span><span class="p" id="mwWQ">{</span><span class="w" id="mwWg"> </span><span class="k" id="mwWw">return</span><span class="w" id="mwXA"> </span><span class="n" id="mwXQ">points</span><span class="p" id="mwXg">.</span><span class="n" id="mwXw">x</span><span class="p" id="mwYA">[</span><span class="n" id="mwYQ">i</span><span class="p" id="mwYg">];</span><span class="w" id="mwYw"> </span><span class="p" id="mwZA">}</span>

Sign in to keep reading

5 more chapters are free with a Lably account.

More in Computing and communication