<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.haidhi.my.id/wiki/index.php?action=history&amp;feed=atom&amp;title=SoA_vs_AoS</id>
	<title>SoA vs AoS - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.haidhi.my.id/wiki/index.php?action=history&amp;feed=atom&amp;title=SoA_vs_AoS"/>
	<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=SoA_vs_AoS&amp;action=history"/>
	<updated>2026-11-01T19:55:57Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=SoA_vs_AoS&amp;diff=751&amp;oldid=prev</id>
		<title>SanzSkuy at 07:33, 3 July 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=SoA_vs_AoS&amp;diff=751&amp;oldid=prev"/>
		<updated>2026-07-03T07:33:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:33, 3 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l274&quot;&gt;Line 274:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 274:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[SIMD]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[SIMD]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Vektorisasi]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Vektorisasi]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Memory &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;coalescing&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Memory &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Coalescing&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Data-oriented design]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Data-oriented design]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Roofline model]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Roofline model]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=SoA_vs_AoS&amp;diff=750&amp;oldid=prev</id>
		<title>SanzSkuy at 07:32, 3 July 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=SoA_vs_AoS&amp;diff=750&amp;oldid=prev"/>
		<updated>2026-07-03T07:32:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:32, 3 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;Array of Structures (AoS)&#039;&#039;&#039; dan &#039;&#039;&#039;Structure of Arrays (SoA)&#039;&#039;&#039; adalah dua cara menyusun (me-&#039;&#039;layout&#039;&#039;) data di memori. Keduanya menyimpan informasi yang sama persis, tapi urutan byte-nya di RAM berbeda. Di dunia [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;HPC|&lt;/del&gt;High Performance Computing]], perbedaan &quot;sepele&quot; ini bisa berdampak besar ke performa — sering kali 2x sampai 8x lipat — karena berhubungan langsung dengan cara kerja &#039;&#039;&#039;cache&#039;&#039;&#039;, &#039;&#039;&#039;SIMD/vektorisasi&#039;&#039;&#039;, dan &#039;&#039;&#039;memory coalescing&#039;&#039;&#039; di GPU.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;drepper&quot; /&amp;gt;&amp;lt;ref name=&quot;cuda&quot; /&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;Array of Structures (AoS)&#039;&#039;&#039; dan &#039;&#039;&#039;Structure of Arrays (SoA)&#039;&#039;&#039; adalah dua cara menyusun (me-&#039;&#039;layout&#039;&#039;) data di memori. Keduanya menyimpan informasi yang sama persis, tapi urutan byte-nya di RAM berbeda. Di dunia [[High Performance Computing&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|HPC&lt;/ins&gt;]], perbedaan &quot;sepele&quot; ini bisa berdampak besar ke performa — sering kali 2x sampai 8x lipat — karena berhubungan langsung dengan cara kerja &#039;&#039;&#039;cache&#039;&#039;&#039;, &#039;&#039;&#039;SIMD/vektorisasi&#039;&#039;&#039;, dan &#039;&#039;&#039;memory coalescing&#039;&#039;&#039; di GPU.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Prinsip utamanya satu kalimat: &#039;&#039;&#039;susun data mengikuti pola aksesnya, bukan mengikuti &quot;kerapian&quot; konsep OOP&#039;&#039;&#039;. Ini adalah ide inti dari &#039;&#039;data-oriented design&#039;&#039;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;fabian&quot; /&amp;gt;&amp;lt;ref name=&quot;acton&quot; /&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Prinsip utamanya satu kalimat: &#039;&#039;&#039;susun data mengikuti pola aksesnya, bukan mengikuti &quot;kerapian&quot; konsep OOP&#039;&#039;&#039;. Ini adalah ide inti dari &#039;&#039;data-oriented design&#039;&#039;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Analogi Sederhana ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Analogi Sederhana ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l15&quot;&gt;Line 15:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 15:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Dengan SoA: tinggal ambil &amp;#039;&amp;#039;&amp;#039;satu&amp;#039;&amp;#039;&amp;#039; buku &amp;quot;Nilai Matematika&amp;quot;, baca dari atas ke bawah. Selesai.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Dengan SoA: tinggal ambil &amp;#039;&amp;#039;&amp;#039;satu&amp;#039;&amp;#039;&amp;#039; buku &amp;quot;Nilai Matematika&amp;quot;, baca dari atas ke bawah. Selesai.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;CPU bekerja persis seperti ini. Setiap kali CPU mengambil data dari RAM, dia tidak mengambil 1 byte, melainkan &#039;&#039;&#039;satu boks penuh&#039;&#039;&#039; yang disebut &#039;&#039;&#039;cache line&#039;&#039;&#039; (umumnya 64 byte).&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;drepper&quot; /&amp;gt; &lt;/del&gt;Kalau isi boks itu kebanyakan data yang tidak dipakai, bandwidth memori terbuang percuma.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;CPU bekerja persis seperti ini. Setiap kali CPU mengambil data dari RAM, dia tidak mengambil 1 byte, melainkan &#039;&#039;&#039;satu boks penuh&#039;&#039;&#039; yang disebut &#039;&#039;&#039;cache line&#039;&#039;&#039; (umumnya 64 byte). Kalau isi boks itu kebanyakan data yang tidak dipakai, bandwidth memori terbuang percuma.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Array of Structures (AoS) ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Array of Structures (AoS) ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l110&quot;&gt;Line 110:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 110:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Karena mayoritas kernel HPC bersifat &#039;&#039;memory-bound&#039;&#039; (bottleneck-nya di bandwidth memori, bukan di ALU), efisiensi cache line ini langsung menentukan performa akhir.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;drepper&quot; /&amp;gt;&amp;lt;ref name=&quot;hp&quot; /&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Karena mayoritas kernel HPC bersifat &#039;&#039;memory-bound&#039;&#039; (bottleneck-nya di bandwidth memori, bukan di ALU), efisiensi cache line ini langsung menentukan performa akhir.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 2. Vektorisasi (SIMD) ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 2. Vektorisasi (SIMD) ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Instruksi SIMD (SSE = 4 float, AVX2 = 8 float, AVX-512 = 16 float) paling senang kalau datanya &#039;&#039;&#039;berurutan rapat&#039;&#039;&#039; di memori — cukup satu instruksi &#039;&#039;load&#039;&#039; untuk mengisi satu register penuh.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;agner&quot; /&amp;gt;&amp;lt;ref name=&quot;intelopt&quot; /&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Instruksi SIMD (SSE = 4 float, AVX2 = 8 float, AVX-512 = 16 float) paling senang kalau datanya &#039;&#039;&#039;berurutan rapat&#039;&#039;&#039; di memori — cukup satu instruksi &#039;&#039;load&#039;&#039; untuk mengisi satu register penuh.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l133&quot;&gt;Line 133:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 133:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Efek praktisnya: compiler (GCC/Clang/ICC) jauh lebih gampang melakukan &#039;&#039;&#039;auto-vectorization&#039;&#039;&#039; pada loop SoA. Loop AoS sering gagal divektorisasi, atau divektorisasi dengan instruksi &#039;&#039;gather&#039;&#039; yang mahal.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;agner&quot; /&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Efek praktisnya: compiler (GCC/Clang/ICC) jauh lebih gampang melakukan &#039;&#039;&#039;auto-vectorization&#039;&#039;&#039; pada loop SoA. Loop AoS sering gagal divektorisasi, atau divektorisasi dengan instruksi &#039;&#039;gather&#039;&#039; yang mahal.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 3. GPU: Coalesced Memory Access ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 3. GPU: Coalesced Memory Access ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Di GPU (CUDA/OpenCL), 32 thread dalam satu &#039;&#039;warp&#039;&#039; (NVIDIA) atau &#039;&#039;wavefront&#039;&#039; (AMD) mengeksekusi instruksi load secara bersamaan. Kalau alamat yang diakses ke-32 thread itu &#039;&#039;&#039;berurutan&#039;&#039;&#039;, hardware menggabungkannya (&#039;&#039;coalesce&#039;&#039;) menjadi sedikit transaksi memori saja.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;cuda&quot; /&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Di GPU (CUDA/OpenCL), 32 thread dalam satu &#039;&#039;warp&#039;&#039; (NVIDIA) atau &#039;&#039;wavefront&#039;&#039; (AMD) mengeksekusi instruksi load secara bersamaan. Kalau alamat yang diakses ke-32 thread itu &#039;&#039;&#039;berurutan&#039;&#039;&#039;, hardware menggabungkannya (&#039;&#039;coalesce&#039;&#039;) menjadi sedikit transaksi memori saja.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l200&quot;&gt;Line 200:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 200:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Kelebihan: load SIMD tetap berurutan, tapi field-field satu elemen masih &quot;berdekatan&quot; di memori. Kekurangan: indexing jadi lebih ribet. Layout ini dipakai antara lain oleh compiler [[ISPC]] (tipe &amp;lt;code&amp;gt;soa&amp;amp;lt;N&amp;amp;gt;&amp;lt;/code&amp;gt;)&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;ispc&quot; /&amp;gt; &lt;/del&gt;dan banyak kode simulasi partikel/MD.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Kelebihan: load SIMD tetap berurutan, tapi field-field satu elemen masih &quot;berdekatan&quot; di memori. Kekurangan: indexing jadi lebih ribet. Layout ini dipakai antara lain oleh compiler [[ISPC]] (tipe &amp;lt;code&amp;gt;soa&amp;amp;lt;N&amp;amp;gt;&amp;lt;/code&amp;gt;) dan banyak kode simulasi partikel/MD.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Contoh Praktis: Mengukur Sendiri ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Contoh Praktis: Mengukur Sendiri ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l266&quot;&gt;Line 266:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 266:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Beri tahu compiler bahwa pointer tidak saling tumpang tindih dengan &amp;lt;code&amp;gt;__restrict__&amp;lt;/code&amp;gt; — sering jadi penentu berhasil/tidaknya auto-vectorization.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Beri tahu compiler bahwa pointer tidak saling tumpang tindih dengan &amp;lt;code&amp;gt;__restrict__&amp;lt;/code&amp;gt; — sering jadi penentu berhasil/tidaknya auto-vectorization.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Di CUDA/OpenCL: field yang diakses per-thread hampir selalu lebih cepat dalam bentuk SoA; tipe vektor bawaan seperti &amp;lt;code&amp;gt;float4&amp;lt;/code&amp;gt; bisa jadi kompromi karena di-load sebagai satu transaksi 16 byte.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Di CUDA/OpenCL: field yang diakses per-thread hampir selalu lebih cepat dalam bentuk SoA; tipe vektor bawaan seperti &amp;lt;code&amp;gt;float4&amp;lt;/code&amp;gt; bisa jadi kompromi karena di-load sebagai satu transaksi 16 byte.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Library yang membantu: [[Kokkos]] (&amp;lt;code&amp;gt;Kokkos::View&amp;lt;/code&amp;gt; bisa ganti &amp;lt;code&amp;gt;LayoutLeft&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;LayoutRight&amp;lt;/code&amp;gt; tanpa mengubah kode kernel), Intel &#039;&#039;&#039;SDLT&#039;&#039;&#039; (SIMD Data Layout Templates), dan ISPC dengan tipe &amp;lt;code&amp;gt;soa&amp;lt;/code&amp;gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;ispc&quot; /&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Library yang membantu: [[Kokkos]] (&amp;lt;code&amp;gt;Kokkos::View&amp;lt;/code&amp;gt; bisa ganti &amp;lt;code&amp;gt;LayoutLeft&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;LayoutRight&amp;lt;/code&amp;gt; tanpa mengubah kode kernel), Intel &#039;&#039;&#039;SDLT&#039;&#039;&#039; (SIMD Data Layout Templates), dan ISPC dengan tipe &amp;lt;code&amp;gt;soa&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Ingat trade-off-nya: SoA menukar kenyamanan kode dengan bandwidth. Untuk kode non-kritis, AoS yang enak dibaca sering kali pilihan yang benar.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Ingat trade-off-nya: SoA menukar kenyamanan kode dengan bandwidth. Untuk kode non-kritis, AoS yang enak dibaca sering kali pilihan yang benar.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l280&quot;&gt;Line 280:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 280:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Referensi ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Referensi ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;references&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Ulrich Drepper, &#039;&#039;What Every Programmer Should Know About Memory&#039;&#039;, Red Hat, Inc., 2007 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;— &lt;/ins&gt;https://people.freebsd.org/~lstewart/articles/cpumemory.pdf&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;drepper&quot;&amp;gt;&lt;/del&gt;Ulrich Drepper, &#039;&#039;What Every Programmer Should Know About Memory&#039;&#039;, Red Hat, Inc., 2007&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. &lt;/del&gt;https://people.freebsd.org/~lstewart/articles/cpumemory.pdf&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/ref&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;NVIDIA, &#039;&#039;CUDA C++ Best Practices Guide&#039;&#039; — bagian &quot;Coalesced Access to Global Memory&quot; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;— &lt;/ins&gt;https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;cuda&quot;&amp;gt;&lt;/del&gt;NVIDIA, &#039;&#039;CUDA C++ Best Practices Guide&#039;&#039; — bagian &quot;Coalesced Access to Global Memory&quot;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. &lt;/del&gt;https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/ref&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Agner Fog, &#039;&#039;Optimizing Software in C++: An Optimization Guide for Windows, Linux, and Mac Platforms&#039;&#039; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;— &lt;/ins&gt;https://www.agner.org/optimize/&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;agner&quot;&amp;gt;&lt;/del&gt;Agner Fog, &#039;&#039;Optimizing Software in C++: An Optimization Guide for Windows, Linux, and Mac Platforms&#039;&#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. &lt;/del&gt;https://www.agner.org/optimize/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/ref&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Intel Corporation, &#039;&#039;Intel 64 and IA-32 Architectures Optimization Reference Manual&#039;&#039; — pembahasan data layout dan vectorization.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;intelopt&quot;&amp;gt;&lt;/del&gt;Intel Corporation, &#039;&#039;Intel 64 and IA-32 Architectures Optimization Reference Manual&#039;&#039; — pembahasan data layout dan vectorization.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/ref&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Richard Fabian, &#039;&#039;Data-Oriented Design: Software Engineering for Limited Resources and Short Schedules&#039;&#039;, 2018 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;— &lt;/ins&gt;https://www.dataorienteddesign.com/dodbook/&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;fabian&quot;&amp;gt;&lt;/del&gt;Richard Fabian, &#039;&#039;Data-Oriented Design: Software Engineering for Limited Resources and Short Schedules&#039;&#039;, 2018&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. &lt;/del&gt;https://www.dataorienteddesign.com/dodbook/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/ref&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Mike Acton, &quot;Data-Oriented Design and C++&quot;, CppCon 2014 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;— &lt;/ins&gt;https://www.youtube.com/watch?v=rX0ItVEVjHc&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;acton&quot;&amp;gt;&lt;/del&gt;Mike Acton, &quot;Data-Oriented Design and C++&quot;, CppCon 2014&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. &lt;/del&gt;https://www.youtube.com/watch?v=rX0ItVEVjHc&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/ref&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Intel, &#039;&#039;ISPC User&#039;s Guide&#039;&#039; — &quot;Structure of Array Types&quot; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;— &lt;/ins&gt;https://ispc.github.io/ispc.html&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;ispc&quot;&amp;gt;&lt;/del&gt;Intel, &#039;&#039;ISPC User&#039;s Guide&#039;&#039; — &quot;Structure of Array Types&quot;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. &lt;/del&gt;https://ispc.github.io/ispc.html&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/ref&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;John L. Hennessy &amp;amp; David A. Patterson, &#039;&#039;Computer Architecture: A Quantitative Approach&#039;&#039;, 6th Edition, Morgan Kaufmann, 2017 — bab Memory Hierarchy Design.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;ref name=&quot;hp&quot;&amp;gt;&lt;/del&gt;John L. Hennessy &amp;amp; David A. Patterson, &#039;&#039;Computer Architecture: A Quantitative Approach&#039;&#039;, 6th Edition, Morgan Kaufmann, 2017 — bab Memory Hierarchy Design.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/ref&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/references&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategori:HPC]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategori:HPC]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategori:Optimasi Performa]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategori:Optimasi Performa]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategori:Arsitektur Komputer]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategori:Arsitektur Komputer]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=SoA_vs_AoS&amp;diff=749&amp;oldid=prev</id>
		<title>SanzSkuy: Created page with &quot;&#039;&#039;&#039;Array of Structures (AoS)&#039;&#039;&#039; dan &#039;&#039;&#039;Structure of Arrays (SoA)&#039;&#039;&#039; adalah dua cara menyusun (me-&#039;&#039;layout&#039;&#039;) data di memori. Keduanya menyimpan informasi yang sama persis, tapi urutan byte-nya di RAM berbeda. Di dunia High Performance Computing, perbedaan &quot;sepele&quot; ini bisa berdampak besar ke performa — sering kali 2x sampai 8x lipat — karena berhubungan langsung dengan cara kerja &#039;&#039;&#039;cache&#039;&#039;&#039;, &#039;&#039;&#039;SIMD/vektorisasi&#039;&#039;&#039;, dan &#039;&#039;&#039;memory coalescing&#039;&#039;&#039; di GPU.&lt;ref nam...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=SoA_vs_AoS&amp;diff=749&amp;oldid=prev"/>
		<updated>2026-07-03T07:29:07Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;Array of Structures (AoS)&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;Structure of Arrays (SoA)&amp;#039;&amp;#039;&amp;#039; adalah dua cara menyusun (me-&amp;#039;&amp;#039;layout&amp;#039;&amp;#039;) data di memori. Keduanya menyimpan informasi yang sama persis, tapi urutan byte-nya di RAM berbeda. Di dunia &lt;a href=&quot;/wiki/index.php?title=HPC&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;HPC (page does not exist)&quot;&gt;High Performance Computing&lt;/a&gt;, perbedaan &amp;quot;sepele&amp;quot; ini bisa berdampak besar ke performa — sering kali 2x sampai 8x lipat — karena berhubungan langsung dengan cara kerja &amp;#039;&amp;#039;&amp;#039;cache&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;SIMD/vektorisasi&amp;#039;&amp;#039;&amp;#039;, dan &amp;#039;&amp;#039;&amp;#039;memory coalescing&amp;#039;&amp;#039;&amp;#039; di GPU.&amp;lt;ref nam...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Array of Structures (AoS)&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;Structure of Arrays (SoA)&amp;#039;&amp;#039;&amp;#039; adalah dua cara menyusun (me-&amp;#039;&amp;#039;layout&amp;#039;&amp;#039;) data di memori. Keduanya menyimpan informasi yang sama persis, tapi urutan byte-nya di RAM berbeda. Di dunia [[HPC|High Performance Computing]], perbedaan &amp;quot;sepele&amp;quot; ini bisa berdampak besar ke performa — sering kali 2x sampai 8x lipat — karena berhubungan langsung dengan cara kerja &amp;#039;&amp;#039;&amp;#039;cache&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;SIMD/vektorisasi&amp;#039;&amp;#039;&amp;#039;, dan &amp;#039;&amp;#039;&amp;#039;memory coalescing&amp;#039;&amp;#039;&amp;#039; di GPU.&amp;lt;ref name=&amp;quot;drepper&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;cuda&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prinsip utamanya satu kalimat: &amp;#039;&amp;#039;&amp;#039;susun data mengikuti pola aksesnya, bukan mengikuti &amp;quot;kerapian&amp;quot; konsep OOP&amp;#039;&amp;#039;&amp;#039;. Ini adalah ide inti dari &amp;#039;&amp;#039;data-oriented design&amp;#039;&amp;#039;.&amp;lt;ref name=&amp;quot;fabian&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;acton&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Analogi Sederhana ==&lt;br /&gt;
&lt;br /&gt;
Bayangkan sekolah dengan 1.000 siswa, dan tiap siswa punya data: nama, nilai Matematika, nilai Fisika, nilai Kimia.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;AoS&amp;#039;&amp;#039;&amp;#039; = satu &amp;#039;&amp;#039;&amp;#039;map arsip per siswa&amp;#039;&amp;#039;&amp;#039;. Map si Budi berisi lengkap: nama Budi, nilai Mat Budi, nilai Fisika Budi, nilai Kimia Budi.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SoA&amp;#039;&amp;#039;&amp;#039; = satu &amp;#039;&amp;#039;&amp;#039;buku besar per jenis data&amp;#039;&amp;#039;&amp;#039;. Ada buku khusus &amp;quot;Nilai Matematika seluruh siswa&amp;quot;, buku &amp;quot;Nilai Fisika seluruh siswa&amp;quot;, dst.&lt;br /&gt;
&lt;br /&gt;
Sekarang tugasnya: &amp;#039;&amp;#039;&amp;#039;hitung rata-rata nilai Matematika seluruh sekolah&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* Dengan AoS: kamu harus buka 1.000 map satu per satu, ambil selembar nilai Matematika, dan sisanya (nama, Fisika, Kimia) ikut terangkat dari rak padahal tidak dipakai. Boros tenaga.&lt;br /&gt;
* Dengan SoA: tinggal ambil &amp;#039;&amp;#039;&amp;#039;satu&amp;#039;&amp;#039;&amp;#039; buku &amp;quot;Nilai Matematika&amp;quot;, baca dari atas ke bawah. Selesai.&lt;br /&gt;
&lt;br /&gt;
CPU bekerja persis seperti ini. Setiap kali CPU mengambil data dari RAM, dia tidak mengambil 1 byte, melainkan &amp;#039;&amp;#039;&amp;#039;satu boks penuh&amp;#039;&amp;#039;&amp;#039; yang disebut &amp;#039;&amp;#039;&amp;#039;cache line&amp;#039;&amp;#039;&amp;#039; (umumnya 64 byte).&amp;lt;ref name=&amp;quot;drepper&amp;quot; /&amp;gt; Kalau isi boks itu kebanyakan data yang tidak dipakai, bandwidth memori terbuang percuma.&lt;br /&gt;
&lt;br /&gt;
== Array of Structures (AoS) ==&lt;br /&gt;
&lt;br /&gt;
Ini gaya yang paling natural kalau kita terbiasa OOP: definisikan satu &amp;#039;&amp;#039;struct&amp;#039;&amp;#039; untuk satu objek, lalu buat array dari struct itu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Particle {&lt;br /&gt;
    float x, y, z;   // posisi&lt;br /&gt;
    float mass;      // massa&lt;br /&gt;
};                   // total: 16 byte per partikel&lt;br /&gt;
&lt;br /&gt;
Particle p[N];       // &amp;lt;-- Array of Structures&lt;br /&gt;
&lt;br /&gt;
// Contoh: jumlahkan semua koordinat x&lt;br /&gt;
float sum = 0.0f;&lt;br /&gt;
for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    sum += p[i].x;   // tiap iterasi &amp;quot;loncat&amp;quot; 16 byte&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Layout di Memori ===&lt;br /&gt;
&lt;br /&gt;
Semua field satu partikel berdempetan, lalu disusul partikel berikutnya:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Alamat memori bertambah ke kanan ---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
+----+----+----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
| x0 | y0 | z0 | m0 | x1 | y1 | z1 | m1 | x2 | y2 | z2 | m2 | ...&lt;br /&gt;
+----+----+----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
 \_____Partikel 0______/ \_____Partikel 1______/ \__Partikel 2 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Structure of Arrays (SoA) ==&lt;br /&gt;
&lt;br /&gt;
Kebalikannya: satu array terpisah untuk tiap field.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Particles {&lt;br /&gt;
    float x[N];&lt;br /&gt;
    float y[N];&lt;br /&gt;
    float z[N];&lt;br /&gt;
    float mass[N];&lt;br /&gt;
};                   // &amp;lt;-- Structure of Arrays&lt;br /&gt;
&lt;br /&gt;
Particles p;&lt;br /&gt;
&lt;br /&gt;
// Contoh: jumlahkan semua koordinat x&lt;br /&gt;
float sum = 0.0f;&lt;br /&gt;
for (int i = 0; i &amp;lt; N; ++i)&lt;br /&gt;
    sum += p.x[i];   // akses 100% berurutan (contiguous)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Layout di Memori ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
x[]    : +----+----+----+----+----+----+&lt;br /&gt;
         | x0 | x1 | x2 | x3 | x4 | x5 | ...&lt;br /&gt;
         +----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
y[]    : +----+----+----+----+----+----+&lt;br /&gt;
         | y0 | y1 | y2 | y3 | y4 | y5 | ...&lt;br /&gt;
         +----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
z[]    : | z0 | z1 | z2 | ...&lt;br /&gt;
mass[] : | m0 | m1 | m2 | ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kenapa Ini Penting di HPC ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Efisiensi Cache Line ===&lt;br /&gt;
&lt;br /&gt;
Cache line modern = 64 byte = muat 16 buah &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;. Perhatikan apa yang terjadi kalau loop kita &amp;#039;&amp;#039;&amp;#039;hanya butuh field &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Kasus AoS -- 1 cache line (64 byte) berisi 4 partikel utuh:&lt;br /&gt;
&lt;br /&gt;
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
| x0 | y0 | z0 | m0 | x1 | y1 | z1 | m1 | x2 | y2 | z2 | m2 | x3 | y3 | z3 | m3 |&lt;br /&gt;
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
  ^^                  ^^                  ^^                  ^^&lt;br /&gt;
dipakai             dipakai             dipakai             dipakai&lt;br /&gt;
&lt;br /&gt;
Hanya 4 dari 16 float yang dipakai  --&amp;gt;  efisiensi bandwidth 25%&lt;br /&gt;
(75% data yang diangkut dari RAM dibuang sia-sia)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kasus SoA -- 1 cache line berisi 16 nilai x sekaligus:&lt;br /&gt;
&lt;br /&gt;
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
| x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 |x10 |x11 |x12 |x13 |x14 |x15 |&lt;br /&gt;
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
 ^^^^ semua 16 float dipakai  --&amp;gt;  efisiensi bandwidth 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Karena mayoritas kernel HPC bersifat &amp;#039;&amp;#039;memory-bound&amp;#039;&amp;#039; (bottleneck-nya di bandwidth memori, bukan di ALU), efisiensi cache line ini langsung menentukan performa akhir.&amp;lt;ref name=&amp;quot;drepper&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;hp&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Vektorisasi (SIMD) ===&lt;br /&gt;
&lt;br /&gt;
Instruksi SIMD (SSE = 4 float, AVX2 = 8 float, AVX-512 = 16 float) paling senang kalau datanya &amp;#039;&amp;#039;&amp;#039;berurutan rapat&amp;#039;&amp;#039;&amp;#039; di memori — cukup satu instruksi &amp;#039;&amp;#039;load&amp;#039;&amp;#039; untuk mengisi satu register penuh.&amp;lt;ref name=&amp;quot;agner&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;intelopt&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SoA + AVX2 (register 256-bit = 8 float):&lt;br /&gt;
&lt;br /&gt;
memori x[] :  | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 |&lt;br /&gt;
                |    |    |    |    |    |    |    |&lt;br /&gt;
                v    v    v    v    v    v    v    v      &amp;lt;- 1 instruksi&lt;br /&gt;
register   :  | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 |      (vmovups)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
AoS + AVX2:&lt;br /&gt;
&lt;br /&gt;
memori     :  | x0 | y0 | z0 | m0 | x1 | y1 | z1 | m1 | ...&lt;br /&gt;
                |                   |&lt;br /&gt;
                +--- perlu gather / banyak shuffle ---+&lt;br /&gt;
                     (lambat, boros instruksi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Efek praktisnya: compiler (GCC/Clang/ICC) jauh lebih gampang melakukan &amp;#039;&amp;#039;&amp;#039;auto-vectorization&amp;#039;&amp;#039;&amp;#039; pada loop SoA. Loop AoS sering gagal divektorisasi, atau divektorisasi dengan instruksi &amp;#039;&amp;#039;gather&amp;#039;&amp;#039; yang mahal.&amp;lt;ref name=&amp;quot;agner&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. GPU: Coalesced Memory Access ===&lt;br /&gt;
&lt;br /&gt;
Di GPU (CUDA/OpenCL), 32 thread dalam satu &amp;#039;&amp;#039;warp&amp;#039;&amp;#039; (NVIDIA) atau &amp;#039;&amp;#039;wavefront&amp;#039;&amp;#039; (AMD) mengeksekusi instruksi load secara bersamaan. Kalau alamat yang diakses ke-32 thread itu &amp;#039;&amp;#039;&amp;#039;berurutan&amp;#039;&amp;#039;&amp;#039;, hardware menggabungkannya (&amp;#039;&amp;#039;coalesce&amp;#039;&amp;#039;) menjadi sedikit transaksi memori saja.&amp;lt;ref name=&amp;quot;cuda&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Warp = 32 thread. Thread ke-t membaca posisi x milik elemen ke-t.&lt;br /&gt;
&lt;br /&gt;
SoA:&lt;br /&gt;
thread :   t0    t1    t2    t3   ...   t31&lt;br /&gt;
alamat :  x[0]  x[1]  x[2]  x[3]  ...  x[31]&lt;br /&gt;
          \__________ 128 byte berurutan __________/&lt;br /&gt;
          =&amp;gt; digabung jadi transaksi memori minimal (coalesced)&lt;br /&gt;
&lt;br /&gt;
AoS (stride 16 byte):&lt;br /&gt;
thread :   t0        t1        t2        ...&lt;br /&gt;
alamat :  p[0].x    p[1].x    p[2].x     ...&lt;br /&gt;
          (loncat-loncat 16 byte antar thread)&lt;br /&gt;
          =&amp;gt; butuh transaksi memori jauh lebih banyak,&lt;br /&gt;
             bandwidth efektif anjlok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Karena itu, hampir semua kode GPU yang serius memakai layout SoA untuk data yang diproses per-elemen. Ini juga berlaku persis sama untuk kernel OpenCL.&lt;br /&gt;
&lt;br /&gt;
== Kapan AoS Justru Lebih Baik ==&lt;br /&gt;
&lt;br /&gt;
SoA bukan jawaban universal. AoS unggul kalau pola aksesnya &amp;#039;&amp;#039;&amp;#039;&amp;quot;semua field dari satu elemen sekaligus&amp;quot;&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
* Akses acak (&amp;#039;&amp;#039;random access&amp;#039;&amp;#039;) per objek — misalnya &amp;#039;&amp;#039;collision detection&amp;#039;&amp;#039;: begitu ketemu partikel ke-i, kamu butuh x, y, z, dan mass-nya sekaligus. Dengan AoS, satu cache line langsung membawa seluruh objek itu. Dengan SoA, kamu malah kena 4 cache miss di 4 array berbeda.&lt;br /&gt;
* Objek sering di-&amp;#039;&amp;#039;insert&amp;#039;&amp;#039;/&amp;#039;&amp;#039;delete&amp;#039;&amp;#039;/dipindah sebagai satu kesatuan.&lt;br /&gt;
* Data di-&amp;#039;&amp;#039;serialize&amp;#039;&amp;#039; atau dikirim per-objek (misalnya lewat jaringan atau MPI dengan datatype per-struct).&lt;br /&gt;
* Kode lebih mudah dibaca dan di-&amp;#039;&amp;#039;maintain&amp;#039;&amp;#039; — jangan remehkan ini untuk kode yang bukan &amp;#039;&amp;#039;hotspot&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Aturan praktisnya:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Loop menyentuh SATU field dari BANYAK elemen   --&amp;gt; SoA&lt;br /&gt;
Loop menyentuh SEMUA field dari SATU elemen    --&amp;gt; AoS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== AoSoA: Jalan Tengah ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Array of Structures of Arrays (AoSoA)&amp;#039;&amp;#039;&amp;#039;, kadang disebut &amp;#039;&amp;#039;tiled SoA&amp;#039;&amp;#039;, menggabungkan keduanya: data dipecah jadi blok-blok kecil selebar register SIMD, dan di dalam blok disusun ala SoA.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
constexpr int W = 8;            // lebar SIMD (AVX2 = 8 float)&lt;br /&gt;
&lt;br /&gt;
struct ParticleBlock {&lt;br /&gt;
    float x[W], y[W], z[W], mass[W];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
std::vector&amp;lt;ParticleBlock&amp;gt; blocks(N / W);   // &amp;lt;-- AoSoA&lt;br /&gt;
&lt;br /&gt;
// Akses partikel ke-i:&lt;br /&gt;
//   blocks[i / W].x[i % W]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+-------------------------------+-------------------------------+&lt;br /&gt;
|           Blok 0              |            Blok 1             |&lt;br /&gt;
| x0..x7 | y0..y7 | z0..z7 | m..| x8..x15| y8..y15| z8..z15| ...|&lt;br /&gt;
+-------------------------------+-------------------------------+&lt;br /&gt;
  ^ di dalam blok: SoA (ramah SIMD)&lt;br /&gt;
  ^ antar blok: AoS (lokalitas objek tetap lumayan)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kelebihan: load SIMD tetap berurutan, tapi field-field satu elemen masih &amp;quot;berdekatan&amp;quot; di memori. Kekurangan: indexing jadi lebih ribet. Layout ini dipakai antara lain oleh compiler [[ISPC]] (tipe &amp;lt;code&amp;gt;soa&amp;amp;lt;N&amp;amp;gt;&amp;lt;/code&amp;gt;)&amp;lt;ref name=&amp;quot;ispc&amp;quot; /&amp;gt; dan banyak kode simulasi partikel/MD.&lt;br /&gt;
&lt;br /&gt;
== Contoh Praktis: Mengukur Sendiri ==&lt;br /&gt;
&lt;br /&gt;
Benchmark mini untuk membuktikan efeknya (kompilasi dengan &amp;lt;code&amp;gt;-O3 -march=native&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;chrono&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
constexpr int N = 1 &amp;lt;&amp;lt; 24;   // ~16 juta elemen&lt;br /&gt;
&lt;br /&gt;
struct ParticleAoS { float x, y, z, mass; };&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    std::vector&amp;lt;ParticleAoS&amp;gt; aos(N, {1, 2, 3, 4});&lt;br /&gt;
    std::vector&amp;lt;float&amp;gt; soa_x(N, 1.0f);&lt;br /&gt;
&lt;br /&gt;
    // --- AoS: jumlahkan x ---&lt;br /&gt;
    auto t0 = std::chrono::steady_clock::now();&lt;br /&gt;
    float s1 = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i) s1 += aos[i].x;&lt;br /&gt;
    auto t1 = std::chrono::steady_clock::now();&lt;br /&gt;
&lt;br /&gt;
    // --- SoA: jumlahkan x ---&lt;br /&gt;
    float s2 = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i) s2 += soa_x[i];&lt;br /&gt;
    auto t2 = std::chrono::steady_clock::now();&lt;br /&gt;
&lt;br /&gt;
    auto ms = [](auto a, auto b) {&lt;br /&gt;
        return std::chrono::duration&amp;lt;double, std::milli&amp;gt;(b - a).count();&lt;br /&gt;
    };&lt;br /&gt;
    std::printf(&amp;quot;AoS: %.2f ms | SoA: %.2f ms (s1=%f s2=%f)\n&amp;quot;,&lt;br /&gt;
                ms(t0, t1), ms(t1, t2), s1, s2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yang perlu diamati: loop SoA membaca 64 MB, loop AoS harus &amp;quot;menyeret&amp;quot; 256 MB dari RAM untuk hasil yang sama — selisih waktunya biasanya mendekati rasio bandwidth itu (sekitar 3–4x) pada dataset yang jauh lebih besar dari cache. Cek juga laporan vektorisasi compiler dengan &amp;lt;code&amp;gt;-fopt-info-vec&amp;lt;/code&amp;gt; (GCC) atau &amp;lt;code&amp;gt;-Rpass=loop-vectorize&amp;lt;/code&amp;gt; (Clang).&lt;br /&gt;
&lt;br /&gt;
== Tabel Perbandingan ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspek !! AoS !! SoA !! AoSoA&lt;br /&gt;
|-&lt;br /&gt;
| Pola akses ideal || Semua field dari 1 elemen || 1 field dari banyak elemen || Streaming + butuh beberapa field&lt;br /&gt;
|-&lt;br /&gt;
| Auto-vectorization (SIMD) || Susah (gather/shuffle) || Mudah (load berurutan) || Mudah&lt;br /&gt;
|-&lt;br /&gt;
| GPU memory coalescing || Buruk || Sangat baik || Baik&lt;br /&gt;
|-&lt;br /&gt;
| Efisiensi cache (akses parsial) || Rendah (bisa 25% atau kurang) || ~100% || Tinggi&lt;br /&gt;
|-&lt;br /&gt;
| Efisiensi cache (akses seluruh objek) || Tinggi || Rendah (miss di banyak array) || Sedang–tinggi&lt;br /&gt;
|-&lt;br /&gt;
| Keterbacaan / kenyamanan kode || Paling natural (OOP) || Agak repot || Paling repot (indexing 2 tingkat)&lt;br /&gt;
|-&lt;br /&gt;
| Insert/delete elemen || Mudah || Repot (semua array harus sinkron) || Repot&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tips Praktis ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Profiling dulu.&amp;#039;&amp;#039;&amp;#039; Ubah layout hanya untuk struktur data di &amp;#039;&amp;#039;hotspot&amp;#039;&amp;#039;. Mengubah layout itu mahal secara refactoring.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Align array SoA&amp;#039;&amp;#039;&amp;#039; ke 64 byte (&amp;lt;code&amp;gt;alignas(64)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;std::aligned_alloc&amp;lt;/code&amp;gt;) supaya load SIMD aligned dan tidak membelah cache line.&lt;br /&gt;
* Beri tahu compiler bahwa pointer tidak saling tumpang tindih dengan &amp;lt;code&amp;gt;__restrict__&amp;lt;/code&amp;gt; — sering jadi penentu berhasil/tidaknya auto-vectorization.&lt;br /&gt;
* Di CUDA/OpenCL: field yang diakses per-thread hampir selalu lebih cepat dalam bentuk SoA; tipe vektor bawaan seperti &amp;lt;code&amp;gt;float4&amp;lt;/code&amp;gt; bisa jadi kompromi karena di-load sebagai satu transaksi 16 byte.&lt;br /&gt;
* Library yang membantu: [[Kokkos]] (&amp;lt;code&amp;gt;Kokkos::View&amp;lt;/code&amp;gt; bisa ganti &amp;lt;code&amp;gt;LayoutLeft&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;LayoutRight&amp;lt;/code&amp;gt; tanpa mengubah kode kernel), Intel &amp;#039;&amp;#039;&amp;#039;SDLT&amp;#039;&amp;#039;&amp;#039; (SIMD Data Layout Templates), dan ISPC dengan tipe &amp;lt;code&amp;gt;soa&amp;lt;/code&amp;gt;.&amp;lt;ref name=&amp;quot;ispc&amp;quot; /&amp;gt;&lt;br /&gt;
* Ingat trade-off-nya: SoA menukar kenyamanan kode dengan bandwidth. Untuk kode non-kritis, AoS yang enak dibaca sering kali pilihan yang benar.&lt;br /&gt;
&lt;br /&gt;
== Lihat Juga ==&lt;br /&gt;
&lt;br /&gt;
* [[Cache line]]&lt;br /&gt;
* [[SIMD]]&lt;br /&gt;
* [[Vektorisasi]]&lt;br /&gt;
* [[Memory coalescing]]&lt;br /&gt;
* [[Data-oriented design]]&lt;br /&gt;
* [[Roofline model]]&lt;br /&gt;
&lt;br /&gt;
== Referensi ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;drepper&amp;quot;&amp;gt;Ulrich Drepper, &amp;#039;&amp;#039;What Every Programmer Should Know About Memory&amp;#039;&amp;#039;, Red Hat, Inc., 2007. https://people.freebsd.org/~lstewart/articles/cpumemory.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;cuda&amp;quot;&amp;gt;NVIDIA, &amp;#039;&amp;#039;CUDA C++ Best Practices Guide&amp;#039;&amp;#039; — bagian &amp;quot;Coalesced Access to Global Memory&amp;quot;. https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;agner&amp;quot;&amp;gt;Agner Fog, &amp;#039;&amp;#039;Optimizing Software in C++: An Optimization Guide for Windows, Linux, and Mac Platforms&amp;#039;&amp;#039;. https://www.agner.org/optimize/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;intelopt&amp;quot;&amp;gt;Intel Corporation, &amp;#039;&amp;#039;Intel 64 and IA-32 Architectures Optimization Reference Manual&amp;#039;&amp;#039; — pembahasan data layout dan vectorization.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;fabian&amp;quot;&amp;gt;Richard Fabian, &amp;#039;&amp;#039;Data-Oriented Design: Software Engineering for Limited Resources and Short Schedules&amp;#039;&amp;#039;, 2018. https://www.dataorienteddesign.com/dodbook/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;acton&amp;quot;&amp;gt;Mike Acton, &amp;quot;Data-Oriented Design and C++&amp;quot;, CppCon 2014. https://www.youtube.com/watch?v=rX0ItVEVjHc&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ispc&amp;quot;&amp;gt;Intel, &amp;#039;&amp;#039;ISPC User&amp;#039;s Guide&amp;#039;&amp;#039; — &amp;quot;Structure of Array Types&amp;quot;. https://ispc.github.io/ispc.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;hp&amp;quot;&amp;gt;John L. Hennessy &amp;amp; David A. Patterson, &amp;#039;&amp;#039;Computer Architecture: A Quantitative Approach&amp;#039;&amp;#039;, 6th Edition, Morgan Kaufmann, 2017 — bab Memory Hierarchy Design.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategori:HPC]]&lt;br /&gt;
[[Kategori:Optimasi Performa]]&lt;br /&gt;
[[Kategori:Arsitektur Komputer]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
</feed>