{
    "version": "https://jsonfeed.org/version/1",
    "title": "High Performance C++ — Essays and Notes",
    "home_page_url": "https://hanielulises.github.io/high-performance-cpp/essays",
    "description": "High Performance C++ Blog",
    "items": [
        {
            "id": "https://hanielulises.github.io/high-performance-cpp/essays/matlab-no-longer",
            "content_html": "<p>High-performance numerical kernels are defined by the algebraic laws they exploit and by the architectural parameters they expose. Associativity of addition, distributivity of multiplication over addition, cache-line geometry, SIMD vector width, TLB reach, and the precise cost of data motion through the memory hierarchy jointly determine both attainable accuracy and attainable throughput.</p>\n<p>Any language or environment that conceals those parameters prevents the programmer from stating the algorithm that is actually executed and from attaching a verifiable a-priori error bound to the computed result.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"floating-point-evaluation-parenthesisation-and-error-bounds\">Floating-point evaluation, parenthesisation and error bounds<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/matlab-no-longer#floating-point-evaluation-parenthesisation-and-error-bounds\" class=\"hash-link\" aria-label=\"Direct link to Floating-point evaluation, parenthesisation and error bounds\" title=\"Direct link to Floating-point evaluation, parenthesisation and error bounds\" translate=\"no\">​</a></h2>\n<p>Under IEEE-754 arithmetic, the parenthesisation of a sum or an inner product is part of the algorithm. Let</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mi>s</mi><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msub><mi>x</mi><mi>i</mi></msub><mi mathvariant=\"normal\">.</mi></mrow><annotation encoding=\"application/x-tex\">s = \\sum_{i=1}^{n} x_i.</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.4306em\"></span><span class=\"mord mathnormal\">s</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.9291em;vertical-align:-1.2777em\"></span><span class=\"mop op-limits\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.6514em\"><span style=\"top:-1.8723em;margin-left:0em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">i</span><span class=\"mrel mtight\">=</span><span class=\"mord mtight\">1</span></span></span></span><span style=\"top:-3.05em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span><span class=\"mop op-symbol large-op\">∑</span></span></span><span style=\"top:-4.3em;margin-left:0em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.2777em\"><span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3117em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">i</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mord\">.</span></span></span></span></span>\n<p>A strictly sequential left-to-right accumulation satisfies</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mrow><mo fence=\"true\">∣</mo><mi mathvariant=\"normal\">fl</mi><mo>⁡</mo><mo stretchy=\"false\">(</mo><mi>s</mi><mo stretchy=\"false\">)</mo><mo>−</mo><mi>s</mi><mo fence=\"true\">∣</mo></mrow><mo>≤</mo><msub><mi>γ</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mi mathvariant=\"normal\">∣</mi><msub><mi>x</mi><mi>i</mi></msub><mi mathvariant=\"normal\">∣</mi><mo separator=\"true\">,</mo></mrow><annotation encoding=\"application/x-tex\">\\left|\\operatorname{fl}(s)-s\\right|\n\\leq\n\\gamma_{n-1}\\sum_{i=1}^{n}|x_i|,</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"minner\"><span class=\"mopen delimcenter\" style=\"top:0em\">∣</span><span class=\"mop\"><span class=\"mord mathrm\">fl</span></span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">s</span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">−</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mord mathnormal\">s</span><span class=\"mclose delimcenter\" style=\"top:0em\">∣</span></span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span><span class=\"mrel\">≤</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.9291em;vertical-align:-1.2777em\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.0556em\">γ</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:-0.0556em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">n</span><span class=\"mbin mtight\">−</span><span class=\"mord mtight\">1</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2083em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mop op-limits\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.6514em\"><span style=\"top:-1.8723em;margin-left:0em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">i</span><span class=\"mrel mtight\">=</span><span class=\"mord mtight\">1</span></span></span></span><span style=\"top:-3.05em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span><span class=\"mop op-symbol large-op\">∑</span></span></span><span style=\"top:-4.3em;margin-left:0em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.2777em\"><span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord\">∣</span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3117em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">i</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mord\">∣</span><span class=\"mpunct\">,</span></span></span></span></span>\n<p>where</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><msub><mi>γ</mi><mi>k</mi></msub><mo>=</mo><mfrac><mrow><mi>k</mi><mi>u</mi></mrow><mrow><mn>1</mn><mo>−</mo><mi>k</mi><mi>u</mi></mrow></mfrac><mo separator=\"true\">,</mo></mrow><annotation encoding=\"application/x-tex\">\\gamma_k = \\frac{ku}{1-ku},</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.625em;vertical-align:-0.1944em\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.0556em\">γ</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3361em\"><span style=\"top:-2.55em;margin-left:-0.0556em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.0315em\">k</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.1408em;vertical-align:-0.7693em\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3714em\"><span style=\"top:-2.314em\"><span class=\"pstrut\" style=\"height:3em\"></span><span class=\"mord\"><span class=\"mord\">1</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">−</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.0315em\">k</span><span class=\"mord mathnormal\">u</span></span></span><span style=\"top:-3.23em\"><span class=\"pstrut\" style=\"height:3em\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em\"></span></span><span style=\"top:-3.677em\"><span class=\"pstrut\" style=\"height:3em\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.0315em\">k</span><span class=\"mord mathnormal\">u</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.7693em\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mpunct\">,</span></span></span></span></span>\n<p>and (u) is the unit roundoff, equal to</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mi>u</mi><mo>=</mo><msup><mn>2</mn><mrow><mo>−</mo><mn>53</mn></mrow></msup></mrow><annotation encoding=\"application/x-tex\">u = 2^{-53}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.4306em\"></span><span class=\"mord mathnormal\">u</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.8641em\"></span><span class=\"mord\"><span class=\"mord\">2</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8641em\"><span style=\"top:-3.113em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\">−</span><span class=\"mord mtight\">53</span></span></span></span></span></span></span></span></span></span></span></span></span>\n<p>for binary64.</p>\n<p>An accumulation performed with (k) independent partial sums, the natural form under SIMD lanes or multi-threaded reduction trees, has a bound of order</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><msub><mi>γ</mi><mrow><mi>n</mi><mi mathvariant=\"normal\">/</mi><mi>k</mi><mo>+</mo><mi>k</mi></mrow></msub><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mi mathvariant=\"normal\">∣</mi><msub><mi>x</mi><mi>i</mi></msub><mi mathvariant=\"normal\">∣</mi><mi mathvariant=\"normal\">.</mi></mrow><annotation encoding=\"application/x-tex\">\\gamma_{n/k+k}\\sum_{i=1}^{n}|x_i|.</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:2.9291em;vertical-align:-1.2777em\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.0556em\">γ</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3448em\"><span style=\"top:-2.5198em;margin-left:-0.0556em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">n</span><span class=\"mord mtight\">/</span><span class=\"mord mathnormal mtight\" style=\"margin-right:0.0315em\">k</span><span class=\"mbin mtight\">+</span><span class=\"mord mathnormal mtight\" style=\"margin-right:0.0315em\">k</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3552em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mop op-limits\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.6514em\"><span style=\"top:-1.8723em;margin-left:0em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">i</span><span class=\"mrel mtight\">=</span><span class=\"mord mtight\">1</span></span></span></span><span style=\"top:-3.05em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span><span class=\"mop op-symbol large-op\">∑</span></span></span><span style=\"top:-4.3em;margin-left:0em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.2777em\"><span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord\">∣</span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3117em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">i</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mord\">∣.</span></span></span></span></span>\n<p>For terms of like sign, the reassociated form is therefore both faster and potentially more accurate: the depth of the dependency chain shrinks from (n) to roughly (n/k+k).</p>\n<p>When cancellation is present, both bounds become relative to</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mi mathvariant=\"normal\">∣</mi><msub><mi>x</mi><mi>i</mi></msub><mi mathvariant=\"normal\">∣</mi></mrow><annotation encoding=\"application/x-tex\">\\sum_{i=1}^{n}|x_i|</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:2.9291em;vertical-align:-1.2777em\"></span><span class=\"mop op-limits\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.6514em\"><span style=\"top:-1.8723em;margin-left:0em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">i</span><span class=\"mrel mtight\">=</span><span class=\"mord mtight\">1</span></span></span></span><span style=\"top:-3.05em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span><span class=\"mop op-symbol large-op\">∑</span></span></span><span style=\"top:-4.3em;margin-left:0em\"><span class=\"pstrut\" style=\"height:3.05em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.2777em\"><span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord\">∣</span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3117em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">i</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mord\">∣</span></span></span></span></span>\n<p>rather than to</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mi mathvariant=\"normal\">∣</mi><mi>s</mi><mi mathvariant=\"normal\">∣</mi><mi mathvariant=\"normal\">.</mi></mrow><annotation encoding=\"application/x-tex\">|s|.</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord\">∣</span><span class=\"mord mathnormal\">s</span><span class=\"mord\">∣.</span></span></span></span></span>\n<p>The comparison of accuracy therefore becomes data-dependent.</p>\n<p>The important point is that the parenthesisation is not an implementation detail. It is part of the numerical algorithm.</p>\n<p>Consider the two computations</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><msub><mi>s</mi><mrow><mi mathvariant=\"normal\">s</mi><mi mathvariant=\"normal\">e</mi><mi mathvariant=\"normal\">q</mi></mrow></msub><mo>=</mo><mo stretchy=\"false\">(</mo><mo stretchy=\"false\">(</mo><mo stretchy=\"false\">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><msub><mi>x</mi><mn>2</mn></msub><mo stretchy=\"false\">)</mo><mo>+</mo><msub><mi>x</mi><mn>3</mn></msub><mo stretchy=\"false\">)</mo><mo>+</mo><mo>⋯</mo><mtext> </mtext><mo stretchy=\"false\">)</mo><mo>+</mo><msub><mi>x</mi><mi>n</mi></msub></mrow><annotation encoding=\"application/x-tex\">s_{\\mathrm{seq}}\n=\n\n(((x_1+x_2)+x_3)+\\cdots)+x_n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.7167em;vertical-align:-0.2861em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">s</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\"><span class=\"mord mathrm mtight\">seq</span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mopen\">(((</span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">1</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">3</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"minner\">⋯</span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.5806em;vertical-align:-0.15em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span></span></span></span></span>\n<p>and</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><msub><mi>s</mi><mrow><mi mathvariant=\"normal\">t</mi><mi mathvariant=\"normal\">r</mi><mi mathvariant=\"normal\">e</mi><mi mathvariant=\"normal\">e</mi></mrow></msub><mo>=</mo><mo stretchy=\"false\">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><msub><mi>x</mi><mn>2</mn></msub><mo stretchy=\"false\">)</mo><mo>+</mo><mo stretchy=\"false\">(</mo><msub><mi>x</mi><mn>3</mn></msub><mo>+</mo><msub><mi>x</mi><mn>4</mn></msub><mo stretchy=\"false\">)</mo><mo>+</mo><mo>⋯</mo><mtext> </mtext><mi mathvariant=\"normal\">.</mi></mrow><annotation encoding=\"application/x-tex\">s_{\\mathrm{tree}}\n=\n\n(x_1+x_2)+(x_3+x_4)+\\cdots.</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.5806em;vertical-align:-0.15em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">s</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2806em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\"><span class=\"mord mathrm mtight\">tree</span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mopen\">(</span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">1</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mopen\">(</span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">3</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">4</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.313em\"></span><span class=\"minner\">⋯</span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord\">.</span></span></span></span></span>\n<p>They are equal over the real numbers. They are not generally equal over floating-point numbers.</p>\n<p>A four-way accumulation makes the distinction explicit:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> a0 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> a1 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> a2 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> a3 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">&lt;=</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    a0 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    a1 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">1</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    a2 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">2</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    a3 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">3</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> sum </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> a0 </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> a1 </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> a2 </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> a3</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></div></code></pre></div></div>\n<p>The source now specifies the reassociation. The compiler does not need permission to invent it.</p>\n<p>MATLAB's <code>sum</code>, matrix-vector product and higher-level factorisations select a parenthesisation, a blocking factor and an intermediate precision sequence that never appear in the user's text. The realised value of (k) cannot be named, the corresponding (\\gamma) constant cannot be written, and any subsequent change in the vendor's vectorisation heuristic or BLAS binding can alter the bit pattern of the result without a corresponding change in the calling code.</p>\n<p>The same opacity governs every composite kernel: blocked LU with partial pivoting, sparse CSR or CSC matrix-vector products, and the recursive Newton-Euler algorithm for inverse dynamics all inherit an accumulation order and a temporary-materialisation policy that are external to the numerical specification written by the user.</p>\n<p>Compensated summation makes the distinction even sharper. The classical TwoSum transformation is</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mo stretchy=\"false\">(</mo><mi>s</mi><mo separator=\"true\">,</mo><mi>e</mi><mo stretchy=\"false\">)</mo><mo>=</mo><mi mathvariant=\"normal\">TwoSum</mi><mo>⁡</mo><mo stretchy=\"false\">(</mo><mi>a</mi><mo separator=\"true\">,</mo><mi>b</mi><mo stretchy=\"false\">)</mo><mo separator=\"true\">,</mo></mrow><annotation encoding=\"application/x-tex\">(s,e)=\\operatorname{TwoSum}(a,b),</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">s</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord mathnormal\">e</span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mop\"><span class=\"mord mathrm\">TwoSum</span></span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">a</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord mathnormal\">b</span><span class=\"mclose\">)</span><span class=\"mpunct\">,</span></span></span></span></span>\n<p>with</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mi>s</mi><mo>=</mo><mi mathvariant=\"normal\">fl</mi><mo>⁡</mo><mo stretchy=\"false\">(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo stretchy=\"false\">)</mo><mo separator=\"true\">,</mo><mspace width=\"2em\"></mspace><mi>e</mi><mo>=</mo><mi mathvariant=\"normal\">fl</mi><mo>⁡</mo><mo stretchy=\"false\">(</mo><mo stretchy=\"false\">(</mo><mi>a</mi><mo>−</mo><mi>s</mi><mo stretchy=\"false\">)</mo><mo>+</mo><mi>b</mi><mo stretchy=\"false\">)</mo><mi mathvariant=\"normal\">.</mi></mrow><annotation encoding=\"application/x-tex\">s=\\operatorname{fl}(a+b),\n\\qquad\ne=\\operatorname{fl}((a-s)+b).</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.4306em\"></span><span class=\"mord mathnormal\">s</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mop\"><span class=\"mord mathrm\">fl</span></span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">a</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord mathnormal\">b</span><span class=\"mclose\">)</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:2em\"></span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord mathnormal\">e</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mop\"><span class=\"mord mathrm\">fl</span></span><span class=\"mopen\">((</span><span class=\"mord mathnormal\">a</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">−</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord mathnormal\">s</span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord mathnormal\">b</span><span class=\"mclose\">)</span><span class=\"mord\">.</span></span></span></span></span>\n<p>The residual (e) is precisely the information that ordinary floating-point addition discards. Algebraically, the expression is zero. Numerically, it need not be.</p>\n<p>A compiler transformation that assumes unrestricted associativity can therefore destroy the very rounding behaviour on which the algorithm depends.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"memory-layout-data-motion-and-static-cost-models\">Memory layout, data motion and static cost models<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/matlab-no-longer#memory-layout-data-motion-and-static-cost-models\" class=\"hash-link\" aria-label=\"Direct link to Memory layout, data motion and static cost models\" title=\"Direct link to Memory layout, data motion and static cost models\" translate=\"no\">​</a></h2>\n<p>On contemporary CPUs, the dominant term in the runtime of dense and sparse kernels is frequently data motion rather than arithmetic. The number of (L_1) and (L_2) misses, the number of TLB walks, the ability to issue 256-bit or 512-bit vector loads, and the arithmetic intensity in flops per byte transferred from DRAM are functions of the concrete layout, leading dimension, alignment, and reuse distance of the working set.</p>\n<p>A language that represents every array as an opaque descriptor whose relevant properties are resolved only at run time makes these parameters difficult to express as part of the algorithm itself.</p>\n<p>C++ allows them to become part of the interface.</p>\n<p>For example, a kernel can require contiguous storage:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token macro property directive-hash\" style=\"color:#36acaa\">#</span><span class=\"token macro property directive keyword\" style=\"color:#00009f\">include</span><span class=\"token macro property\" style=\"color:#36acaa\"> </span><span class=\"token macro property string\" style=\"color:#e3116c\">&lt;concepts&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token macro property directive-hash\" style=\"color:#36acaa\">#</span><span class=\"token macro property directive keyword\" style=\"color:#00009f\">include</span><span class=\"token macro property\" style=\"color:#36acaa\"> </span><span class=\"token macro property string\" style=\"color:#e3116c\">&lt;span&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token macro property directive-hash\" style=\"color:#36acaa\">#</span><span class=\"token macro property directive keyword\" style=\"color:#00009f\">include</span><span class=\"token macro property\" style=\"color:#36acaa\"> </span><span class=\"token macro property string\" style=\"color:#e3116c\">&lt;type_traits&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">concept</span><span class=\"token plain\"> </span><span class=\"token class-name\">Arithmetic</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">is_arithmetic_v</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\">Arithmetic T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">dot</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> result </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">size</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">++</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        result </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> </span><span class=\"token generic-function function\" style=\"color:#d73a49\">static_cast</span><span class=\"token generic-function generic class-name operator\" style=\"color:#393A34\">&lt;</span><span class=\"token generic-function generic class-name keyword\" style=\"color:#00009f\">double</span><span class=\"token generic-function generic class-name operator\" style=\"color:#393A34\">&gt;</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                </span><span class=\"token operator\" style=\"color:#393A34\">*</span><span class=\"token plain\"> </span><span class=\"token generic-function function\" style=\"color:#d73a49\">static_cast</span><span class=\"token generic-function generic class-name operator\" style=\"color:#393A34\">&lt;</span><span class=\"token generic-function generic class-name keyword\" style=\"color:#00009f\">double</span><span class=\"token generic-function generic class-name operator\" style=\"color:#393A34\">&gt;</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">y</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>The abstraction is not merely syntactic. <code>std::span</code> expresses a non-owning contiguous range, while the template constraint restricts the domain of the kernel.</p>\n<p>The same operation can be expressed with stronger compile-time information when the extent is known:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token macro property directive-hash\" style=\"color:#36acaa\">#</span><span class=\"token macro property directive keyword\" style=\"color:#00009f\">include</span><span class=\"token macro property\" style=\"color:#36acaa\"> </span><span class=\"token macro property string\" style=\"color:#e3116c\">&lt;array&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token macro property directive-hash\" style=\"color:#36acaa\">#</span><span class=\"token macro property directive keyword\" style=\"color:#00009f\">include</span><span class=\"token macro property\" style=\"color:#36acaa\"> </span><span class=\"token macro property string\" style=\"color:#e3116c\">&lt;cstddef&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token macro property directive-hash\" style=\"color:#36acaa\">#</span><span class=\"token macro property directive keyword\" style=\"color:#00009f\">include</span><span class=\"token macro property\" style=\"color:#36acaa\"> </span><span class=\"token macro property string\" style=\"color:#e3116c\">&lt;type_traits&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">T</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t N</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">requires</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">is_arithmetic_v</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">constexpr</span><span class=\"token plain\"> T </span><span class=\"token function\" style=\"color:#d73a49\">dot</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">array</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\">T</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> N</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token operator\" style=\"color:#393A34\">&amp;</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">array</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\">T</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> N</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token operator\" style=\"color:#393A34\">&amp;</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    T result</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> N</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">++</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        result </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">*</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>The loop bound is now part of the type. For sufficiently small (N), the entire computation can be evaluated during translation:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">constexpr</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">array</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token number\" style=\"color:#36acaa\">1.0</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">2.0</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">3.0</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4.0</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">constexpr</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">array</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token number\" style=\"color:#36acaa\">5.0</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">6.0</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">7.0</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">8.0</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">constexpr</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> result </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">dot</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">static_assert</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">result </span><span class=\"token operator\" style=\"color:#393A34\">==</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">70.0</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></div></code></pre></div></div>\n<p>This does not mean that every C++ numerical kernel should be written with fixed-size arrays. It means that the programmer can choose which properties belong to the static interface and which remain dynamic.</p>\n<p>The same principle applies to multidimensional layout. With <code>std::mdspan</code>, the shape and layout of a multidimensional view can be separated from the algorithm operating on it:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token macro property directive-hash\" style=\"color:#36acaa\">#</span><span class=\"token macro property directive keyword\" style=\"color:#00009f\">include</span><span class=\"token macro property\" style=\"color:#36acaa\"> </span><span class=\"token macro property string\" style=\"color:#e3116c\">&lt;mdspan&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token macro property directive-hash\" style=\"color:#36acaa\">#</span><span class=\"token macro property directive keyword\" style=\"color:#00009f\">include</span><span class=\"token macro property\" style=\"color:#36acaa\"> </span><span class=\"token macro property string\" style=\"color:#e3116c\">&lt;algorithm&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token macro property directive-hash\" style=\"color:#36acaa\">#</span><span class=\"token macro property directive keyword\" style=\"color:#00009f\">include</span><span class=\"token macro property\" style=\"color:#36acaa\"> </span><span class=\"token macro property string\" style=\"color:#e3116c\">&lt;cstddef&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">Matrix</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">trace</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> Matrix</span><span class=\"token operator\" style=\"color:#393A34\">&amp;</span><span class=\"token plain\"> A</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> result </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">auto</span><span class=\"token plain\"> n </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token function\" style=\"color:#d73a49\">min</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">A</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">extent</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> A</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">extent</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token number\" style=\"color:#36acaa\">1</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">++</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        result </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">A</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> i</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>The algorithm does not have to be rewritten for row-major and column-major storage. The layout policy becomes part of the view.</p>\n<p>That distinction matters because the machine does not execute an abstract matrix. It executes loads and stores at concrete addresses.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"python-and-julia-are-goated\">Python and Julia are goated<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/matlab-no-longer#python-and-julia-are-goated\" class=\"hash-link\" aria-label=\"Direct link to Python and Julia are goated\" title=\"Direct link to Python and Julia are goated\" translate=\"no\">​</a></h2>\n<p>Python, through NumPy, SciPy and the surrounding array-programming stack, provides an exceptionally productive interactive surface. For standard operations, this is not a weakness: NumPy delegates substantial numerical work to compiled native kernels, and Python is often an excellent orchestration language.</p>\n<p>The distinction appears when the required computation is no longer one of those standard kernels.</p>\n<p>A simple NumPy expression such as</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">y </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> alpha </span><span class=\"token operator\" style=\"color:#393A34\">*</span><span class=\"token plain\"> x </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> beta </span><span class=\"token operator\" style=\"color:#393A34\">*</span><span class=\"token plain\"> z</span><br></div></code></pre></div></div>\n<p>looks like one operation at the language level. Depending on the expression and implementation, it can involve several native kernels and intermediate arrays.</p>\n<p>A fused implementation can make the data movement more explicit:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">import</span><span class=\"token plain\"> numpy </span><span class=\"token keyword\" style=\"color:#00009f\">as</span><span class=\"token plain\"> np</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">fused_axpby</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">alpha</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> beta</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> z</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> out</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    np</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token plain\">multiply</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> alpha</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> out</span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\">out</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    out </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> beta </span><span class=\"token operator\" style=\"color:#393A34\">*</span><span class=\"token plain\"> z</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> out</span><br></div></code></pre></div></div>\n<p>This is already better because the destination is controlled. But the programmer still does not obtain the same degree of control over the generated machine-level kernel as a C++ implementation in which the loop, layout, vectorisation constraints, and accumulation structure are directly expressed.</p>\n<p>The difference becomes larger when the algorithm itself is unusual.</p>\n<p>Suppose the desired operation is a four-way reduction:</p>\n<div class=\"language-python codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-python codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">def</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">four_way_sum</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    a0 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    a1 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    a2 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    a3 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    n </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token builtin\">len</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> i </span><span class=\"token keyword\" style=\"color:#00009f\">in</span><span class=\"token plain\"> </span><span class=\"token builtin\">range</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> n </span><span class=\"token operator\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">3</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        a0 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        a1 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">1</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        a2 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">2</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        a3 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">3</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> a0 </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> a1 </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> a2 </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> a3</span><br></div></code></pre></div></div>\n<p>The algorithm is now explicit, but the Python loop is not a competitive implementation of the numerical kernel. The usual answer is to move the operation into NumPy, Numba, Cython, C, C++, Rust, or another compiled layer.</p>\n<p>The language is therefore excellent at expressing the use of a numerical kernel while often being less suitable for expressing the kernel itself when its performance contract is unusually specific.</p>\n<p>Julia closes much of this gap.</p>\n<p>A Julia implementation can specialize a generic kernel on concrete argument types:</p>\n<div class=\"language-julia codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-julia codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">function dot_product(</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    x::AbstractVector{T},</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    y::AbstractVector{T}</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">) where {T&lt;:AbstractFloat}</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    result = zero(T)</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    @inbounds @simd for i in eachindex(x, y)</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        result += x[i] * y[i]</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    end</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    return result</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">end</span><br></div></code></pre></div></div>\n<p>Broadcast fusion can also keep an expression at the level of one fused computation:</p>\n<div class=\"language-julia codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-julia codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">y .= α .* x .+ β .* z</span><br></div></code></pre></div></div>\n<p>rather than requiring the programmer to explicitly construct every intermediate array.</p>\n<p>This is one of Julia's major strengths. The language can preserve a high-level mathematical notation while specializing the implementation to concrete types.</p>\n<p>It does not, however, eliminate the underlying machine-level questions. Allocation, aliasing, memory locality, vectorisation, garbage collection, calling conventions, and library boundaries remain properties of the executed program.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"c-under-numerical-performance-constraints\">C++ under numerical performance constraints<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/matlab-no-longer#c-under-numerical-performance-constraints\" class=\"hash-link\" aria-label=\"Direct link to C++ under numerical performance constraints\" title=\"Direct link to C++ under numerical performance constraints\" translate=\"no\">​</a></h2>\n<p>C++ occupies a different point in this design space because the language does not force the numerical algorithm to remain at the level of a dynamic array expression.</p>\n<p>The programmer can state the representation, lifetime, alignment, ownership, layout, and algorithmic structure directly.</p>\n<p>For example, allocation can be removed from a numerical kernel entirely:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">axpy</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    T alpha</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">size</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">++</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        y</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> alpha </span><span class=\"token operator\" style=\"color:#393A34\">*</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>There is no hidden allocation in the algorithm. The function receives storage owned elsewhere.</p>\n<p>For a reduction where reassociation is desirable, the algorithm can expose independent accumulators:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">requires</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">is_floating_point_v</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">T </span><span class=\"token function\" style=\"color:#d73a49\">parallel_sum</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    T a0</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    T a1</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    T a2</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    T a3</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t n </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">size</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t limit </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> n </span><span class=\"token operator\" style=\"color:#393A34\">-</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">n </span><span class=\"token operator\" style=\"color:#393A34\">%</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> limit</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        a0 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        a1 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">1</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        a2 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">2</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        a3 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">3</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    T result </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> a0 </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> a1 </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> a2 </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> a3</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> limit</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">++</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        result </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>The compiler may vectorise this loop, but the important fact is that the mathematical reassociation is already present in the source.</p>\n<p>If a different numerical policy is required, it can be written instead:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">requires</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">is_floating_point_v</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">T </span><span class=\"token function\" style=\"color:#d73a49\">compensated_sum</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    T sum </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    T correction </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T value </span><span class=\"token operator\" style=\"color:#393A34\">:</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T y </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> value </span><span class=\"token operator\" style=\"color:#393A34\">-</span><span class=\"token plain\"> correction</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T t </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> sum </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        correction </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">t </span><span class=\"token operator\" style=\"color:#393A34\">-</span><span class=\"token plain\"> sum</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">-</span><span class=\"token plain\"> y</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        sum </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> t</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> sum</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>These two functions represent different numerical algorithms. A global compiler option does not decide which one the programmer intended.</p>\n<p>That is the crucial distinction.</p>\n<p>The compiler is free to optimise the algorithm. It is not being asked to invent the numerical policy.</p>\n<p>The same principle extends to matrix kernels. A simple blocked matrix multiplication can expose its blocking factor directly:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">matmul_blocked</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> A</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> B</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> C</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t n</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t block</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t ii </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> ii </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> ii </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> block</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t kk </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> kk </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> kk </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> block</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t jj </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> jj </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> jj </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> block</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i_end </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token function\" style=\"color:#d73a49\">min</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">ii </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> block</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t k_end </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token function\" style=\"color:#d73a49\">min</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">kk </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> block</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t j_end </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token function\" style=\"color:#d73a49\">min</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">jj </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> block</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> ii</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> i_end</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">++</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t k </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> kk</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> k </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> k_end</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">++</span><span class=\"token plain\">k</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                        </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T aik </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> A</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">*</span><span class=\"token plain\"> n </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> k</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                        </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t j </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> jj</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> j </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> j_end</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">++</span><span class=\"token plain\">j</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                            C</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">*</span><span class=\"token plain\"> n </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> j</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                                aik </span><span class=\"token operator\" style=\"color:#393A34\">*</span><span class=\"token plain\"> B</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">k </span><span class=\"token operator\" style=\"color:#393A34\">*</span><span class=\"token plain\"> n </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> j</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                        </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>The block size is now an algorithmic parameter rather than an implementation detail buried inside a library.</p>\n<p>It can be benchmarked against the target cache hierarchy:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">constexpr</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t block </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">32</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token function\" style=\"color:#d73a49\">matmul_blocked</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    A</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    B</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    C</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    n</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    block</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></div></code></pre></div></div>\n<p>Or selected according to the target architecture:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">constexpr</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t </span><span class=\"token function\" style=\"color:#d73a49\">block_size</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">if</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">constexpr</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token keyword\" style=\"color:#00009f\">sizeof</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">T</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">==</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">8</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">32</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">64</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>This is not merely about writing more code. It is about deciding which quantities belong to the numerical and architectural specification.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"c-and-the-separation-of-policy-from-mechanism\">C++ and the separation of policy from mechanism<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/matlab-no-longer#c-and-the-separation-of-policy-from-mechanism\" class=\"hash-link\" aria-label=\"Direct link to C++ and the separation of policy from mechanism\" title=\"Direct link to C++ and the separation of policy from mechanism\" translate=\"no\">​</a></h2>\n<p>The strongest case for C++ in this context is not that C++ is inherently faster than every other language. It is that C++ permits the numerical algorithm, representation, and machine-level policy to remain visible simultaneously.</p>\n<p>A reduction policy can be represented as a type:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">struct</span><span class=\"token plain\"> </span><span class=\"token class-name\">SequentialReduction</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">static</span><span class=\"token plain\"> T </span><span class=\"token function\" style=\"color:#d73a49\">combine</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">T a</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> T b</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> a </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> b</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">struct</span><span class=\"token plain\"> </span><span class=\"token class-name\">PairwiseReduction</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">static</span><span class=\"token plain\"> T </span><span class=\"token function\" style=\"color:#d73a49\">combine</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">T a</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> T b</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> a </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> b</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></div></code></pre></div></div>\n<p>A generic algorithm can then take the policy explicitly:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">T</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">Reduction</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">requires</span><span class=\"token plain\"> std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">is_floating_point_v</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\">T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">T </span><span class=\"token function\" style=\"color:#d73a49\">reduce</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> T</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    Reduction reduction</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">empty</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> T</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    T result </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">front</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">1</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">size</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">++</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        result </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> reduction</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">combine</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">result</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>The important abstraction is not the class itself. It is the fact that the numerical policy is represented as a program entity that can be inspected, tested and replaced.</p>\n<p>The same design can be used for accumulation precision:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">Input</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">Accumulator</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">Accumulator </span><span class=\"token function\" style=\"color:#d73a49\">sum_as</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> Input</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    Accumulator result</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> Input value </span><span class=\"token operator\" style=\"color:#393A34\">:</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        result </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> </span><span class=\"token generic-function function\" style=\"color:#d73a49\">static_cast</span><span class=\"token generic-function generic class-name operator\" style=\"color:#393A34\">&lt;</span><span class=\"token generic-function generic class-name\">Accumulator</span><span class=\"token generic-function generic class-name operator\" style=\"color:#393A34\">&gt;</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">value</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>Now the distinction between binary32 input and binary64 accumulation is explicit:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">float</span><span class=\"token plain\"> sum_f32 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token generic-function function\" style=\"color:#d73a49\">sum_as</span><span class=\"token generic-function generic class-name operator\" style=\"color:#393A34\">&lt;</span><span class=\"token generic-function generic class-name keyword\" style=\"color:#00009f\">float</span><span class=\"token generic-function generic class-name punctuation\" style=\"color:#393A34\">,</span><span class=\"token generic-function generic class-name\"> </span><span class=\"token generic-function generic class-name keyword\" style=\"color:#00009f\">float</span><span class=\"token generic-function generic class-name operator\" style=\"color:#393A34\">&gt;</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> sum_f64 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token generic-function function\" style=\"color:#d73a49\">sum_as</span><span class=\"token generic-function generic class-name operator\" style=\"color:#393A34\">&lt;</span><span class=\"token generic-function generic class-name keyword\" style=\"color:#00009f\">float</span><span class=\"token generic-function generic class-name punctuation\" style=\"color:#393A34\">,</span><span class=\"token generic-function generic class-name\"> </span><span class=\"token generic-function generic class-name keyword\" style=\"color:#00009f\">double</span><span class=\"token generic-function generic class-name operator\" style=\"color:#393A34\">&gt;</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">x</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></div></code></pre></div></div>\n<p>The precision policy is no longer an implicit property of an interpreter, a BLAS implementation, or a compiler heuristic.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"c-under-robotics-constraints\">C++ under robotics constraints<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/matlab-no-longer#c-under-robotics-constraints\" class=\"hash-link\" aria-label=\"Direct link to C++ under robotics constraints\" title=\"Direct link to C++ under robotics constraints\" translate=\"no\">​</a></h2>\n<p>Robotics imposes a stricter requirement set than most scientific computing workloads: hard real-time deadlines, bounded and predictable memory traffic, deterministic latency from sensor interrupt to actuator command, and the ability to audit numerical residuals that enter safety-critical decisions.</p>\n<p>A typical torque-control loop might execute at 1 kHz or faster. At that point, a computation that occasionally allocates, triggers garbage collection, materialises an unexpected temporary, or changes its memory-access pattern can violate the timing contract even if its average benchmark is excellent.</p>\n<p>The C++ model allows the real-time boundary to be made explicit:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">Controller</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">public</span><span class=\"token operator\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">explicit</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">Controller</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> workspace</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token operator\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">workspace_</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">workspace</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">update</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> q</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> dq</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> tau</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token function\" style=\"color:#d73a49\">compute_dynamics</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">q</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> dq</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> tau</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">private</span><span class=\"token operator\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> workspace_</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">void</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">compute_dynamics</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> q</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> dq</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"> tau</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> tau</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">size</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">++</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">            tau</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> q</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> dq</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></div></code></pre></div></div>\n<p>The controller owns no dynamic memory. The workspace is supplied from outside the control loop.</p>\n<p>For a kinematic or dynamic kernel, spatial quantities can similarly be represented using fixed-size types:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">struct</span><span class=\"token plain\"> </span><span class=\"token class-name\">SpatialVector</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> data</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token number\" style=\"color:#36acaa\">6</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">struct</span><span class=\"token plain\"> </span><span class=\"token class-name\">SpatialInertia</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> data</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token number\" style=\"color:#36acaa\">36</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">inline</span><span class=\"token plain\"> SpatialVector </span><span class=\"token function\" style=\"color:#d73a49\">cross_motion</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> SpatialVector</span><span class=\"token operator\" style=\"color:#393A34\">&amp;</span><span class=\"token plain\"> a</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> SpatialVector</span><span class=\"token operator\" style=\"color:#393A34\">&amp;</span><span class=\"token plain\"> b</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    SpatialVector result</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:#999988;font-style:italic\">// Fixed-size spatial operation.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>The dimensions are part of the type. There is no dynamic matrix dimension to discover at runtime.</p>\n<p>This matters for the recursive Newton-Euler algorithm because the computational graph is sparse and highly structured. Spatial inertia, velocity and acceleration operations have fixed dimensions, predictable access patterns, and well-defined lifetimes.</p>\n<p>The implementation can therefore be tuned against a particular micro-architecture without changing the mathematical interface.</p>\n<p>MATLAB's Robotics System Toolbox and Simulink Coder can emit C or C++ code. That is useful, but it does not eliminate the distinction between specifying an algorithm and generating one from a higher-level description. The generated artefacts inherit decisions made by the code generator concerning temporaries, layout, scheduling and numerical evaluation order.</p>\n<p>The generated binary must consequently be re-validated whenever the toolchain or generated implementation changes.</p>\n<p>The identical issue appears in model-predictive control, geometric collision detection, rigid-body dynamics, state estimation and numerical integration. In each case, the relevant properties are not simply \"fast\" or \"slow\". They are:</p>\n<ul>\n<li class=\"\">bounded execution time,</li>\n<li class=\"\">bounded allocation,</li>\n<li class=\"\">predictable memory traffic,</li>\n<li class=\"\">controlled numerical evaluation order,</li>\n<li class=\"\">known data layout,</li>\n<li class=\"\">and a measurable relationship between the source algorithm and the generated instructions.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"algorithm-design-under-explicit-control\">Algorithm design under explicit control<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/matlab-no-longer#algorithm-design-under-explicit-control\" class=\"hash-link\" aria-label=\"Direct link to Algorithm design under explicit control\" title=\"Direct link to Algorithm design under explicit control\" translate=\"no\">​</a></h2>\n<p>The construction of a numerical kernel therefore proceeds from the algebraic law that licenses a transformation, through the concrete data layout and accumulation order that realise it, to the forward-error bound and the memory-hierarchy cost model that quantify the result.</p>\n<p>Associativity licenses tree reductions and multi-accumulator schemes.</p>\n<p>Distributivity licenses transformations such as Horner's rule:</p>\n<span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><msub><mi>a</mi><mn>0</mn></msub><mo>+</mo><msub><mi>a</mi><mn>1</mn></msub><mi>x</mi><mo>+</mo><msub><mi>a</mi><mn>2</mn></msub><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mo>⋯</mo><mo>+</mo><msub><mi>a</mi><mi>n</mi></msub><msup><mi>x</mi><mi>n</mi></msup><mo>=</mo><msub><mi>a</mi><mn>0</mn></msub><mo>+</mo><mi>x</mi><mo stretchy=\"false\">(</mo><msub><mi>a</mi><mn>1</mn></msub><mo>+</mo><mi>x</mi><mo stretchy=\"false\">(</mo><msub><mi>a</mi><mn>2</mn></msub><mo>+</mo><mo>⋯</mo><mo>+</mo><mi>x</mi><msub><mi>a</mi><mi>n</mi></msub><mo stretchy=\"false\">)</mo><mo stretchy=\"false\">)</mo><mi mathvariant=\"normal\">.</mi></mrow><annotation encoding=\"application/x-tex\">a_0+a_1x+a_2x^2+\\cdots+a_nx^n\n=\na_0+x(a_1+x(a_2+\\cdots+x a_n)).</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.7333em;vertical-align:-0.15em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">a</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">0</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.7333em;vertical-align:-0.15em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">a</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">1</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mord mathnormal\">x</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1.0141em;vertical-align:-0.15em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">a</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8641em\"><span style=\"top:-3.113em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2</span></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.6667em;vertical-align:-0.0833em\"></span><span class=\"minner\">⋯</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.8644em;vertical-align:-0.15em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">a</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.7144em\"><span style=\"top:-3.113em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.7333em;vertical-align:-0.15em\"></span><span class=\"mord\"><span class=\"mord mathnormal\">a</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">0</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord mathnormal\">x</span><span class=\"mopen\">(</span><span class=\"mord\"><span class=\"mord mathnormal\">a</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">1</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord mathnormal\">x</span><span class=\"mopen\">(</span><span class=\"mord\"><span class=\"mord mathnormal\">a</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">2</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.6667em;vertical-align:-0.0833em\"></span><span class=\"minner\">⋯</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord mathnormal\">x</span><span class=\"mord\"><span class=\"mord mathnormal\">a</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mclose\">))</span><span class=\"mord\">.</span></span></span></span></span>\n<p>Cache geometry licenses cache-aware blocking.</p>\n<p>Contiguity and alignment license efficient packed loads.</p>\n<p>Static extents license compile-time reasoning about dimensions.</p>\n<p>Concepts and traits allow these requirements to become part of the interface rather than informal assumptions.</p>\n<p>Each decision can remain under source control and can be regression-tested against both numerical residuals and performance counters.</p>\n<p>This is the distinction that matters when comparing numerical environments.</p>\n<p>Python is excellent at orchestration and interactive numerical experimentation. NumPy and SciPy provide mature native kernels, and Python can express complex scientific workflows with very little code.</p>\n<p>Julia goes further by making specialization and compilation central to the language. Multiple dispatch, broadcast fusion and generated specialization allow a substantial amount of numerical structure to remain visible at the language level while still reaching native performance.</p>\n<p>C++ goes further in a different direction.</p>\n<p>It permits the programmer to decide exactly where the abstraction boundary lies.</p>\n<p>The programmer can write the high-level algorithm:</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">Matrix</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">requires</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">requires</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> Matrix</span><span class=\"token operator\" style=\"color:#393A34\">&amp;</span><span class=\"token plain\"> A</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    A</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">extent</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    A</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">extent</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token number\" style=\"color:#36acaa\">1</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:#d73a49\">A</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">trace</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> Matrix</span><span class=\"token operator\" style=\"color:#393A34\">&amp;</span><span class=\"token plain\"> A</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> result </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">const</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">auto</span><span class=\"token plain\"> n </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token function\" style=\"color:#d73a49\">min</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">A</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">extent</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> A</span><span class=\"token punctuation\" style=\"color:#393A34\">.</span><span class=\"token function\" style=\"color:#d73a49\">extent</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token number\" style=\"color:#36acaa\">1</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">++</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">        result </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:#d73a49\">A</span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> i</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"color:#00009f\">return</span><span class=\"token plain\"> result</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>and still specialize the representation, allocation strategy, vectorisation strategy, blocking policy and numerical accumulation scheme underneath it.</p>\n<p>That combination is what makes modern C++ particularly powerful for high-performance numerical computing.</p>\n<p>The goal is not to write everything by hand.</p>\n<p>The goal is to make the parts that matter <strong>explicit</strong> and let the compiler eliminate everything else.</p>\n<p>When a language conceals the parenthesisation, the layout, the temporary policy and the binding to the underlying BLAS, those decisions cannot be recorded directly in the program text. The performance claim cannot be attached cleanly to a stated algorithm, and the error bound cannot be attached cleanly to a stated accumulation depth or working-set size.</p>\n<p>For interactive exploration, MATLAB remains convenient. For conventional numerical workflows, Python and Julia are both powerful alternatives, each with a different set of trade-offs.</p>\n<p>But for workloads in which the algorithm, representation, numerical semantics and temporal behaviour must all be treated as part of the specification, modern C++ provides something fundamentally different: the ability to expose the abstraction boundary itself and decide, one layer at a time, which properties belong to the mathematics, which belong to the type system, which belong to the compiler, and which belong to the machine.</p>\n<p>That is the point. MATLAB supplies neither the algorithm nor the guarantees.</p>",
            "url": "https://hanielulises.github.io/high-performance-cpp/essays/matlab-no-longer",
            "title": "MATLAB No Longer Has a Place in the Modern World",
            "summary": "High-performance numerical kernels are defined by the algebraic laws they exploit and by the architectural parameters they expose. Associativity of addition, distributivity of multiplication over addition, cache-line geometry, SIMD vector width, TLB reach, and the precise cost of data motion through the memory hierarchy jointly determine both attainable accuracy and attainable throughput.",
            "date_modified": "2026-08-11T00:00:00.000Z",
            "author": {
                "name": "High Performance C++"
            },
            "tags": [
                "numerical-analysis",
                "scientific-computing",
                "performance",
                "semantics",
                "robotics"
            ]
        },
        {
            "id": "https://hanielulises.github.io/high-performance-cpp/essays/what-a-concept-does-not-say",
            "content_html": "<p>A concept named <code>Ring</code> is satisfied by any type with <code>+</code>, <code>*</code>, and the two identities. It is not\nsatisfied only by rings. The distinction is not pedantry: the algorithms constrained by such a\nconcept are correct on the rings and undefined on everything else in its model class, and the\ncompiler cannot tell the difference.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-gap-precisely\">The gap, precisely<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/what-a-concept-does-not-say#the-gap-precisely\" class=\"hash-link\" aria-label=\"Direct link to The gap, precisely\" title=\"Direct link to The gap, precisely\" translate=\"no\">​</a></h2>\n<p>A concept denotes a set of types; the ones for which its requirements are well-formed. The\nmathematical structure it is named after denotes a smaller set: those types whose operations\nadditionally satisfy laws. The language checks membership in the larger set and the algorithm\nrequires membership in the smaller one.</p>\n<p>Nothing about this is unusual or avoidable. Checking associativity would require quantifying over\nall values of a type, which the language cannot do and no reasonable extension would. The gap is\nstructural.</p>\n<p>What is avoidable is leaving it undocumented, which is the normal state of affairs.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-goes-wrong\">What goes wrong<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/what-a-concept-does-not-say#what-goes-wrong\" class=\"hash-link\" aria-label=\"Direct link to What goes wrong\" title=\"Direct link to What goes wrong\" translate=\"no\">​</a></h2>\n<p>Three failures, all ordinary.</p>\n<p><code>std::sort</code> requires a strict weak ordering, and a comparison over floating-point values\ncontaining NaN is not one: NaN compares false against everything, so the induced equivalence is\nnot transitive. The consequence is not a mis-sorted range. Common implementations use the\nordering to bound an inner scan, and an invalid comparison walks past the end of the range. A\nsemantic violation produces a memory error.</p>\n<p><code>std::unordered_map</code> requires a hash consistent with equality. Supply one that is not, and\nlookups fail to find elements that are present, silently, with no invariant visibly broken.</p>\n<p>A parallel reduction over a type modelling <code>Monoid</code> returns a value depending on the thread\ncount, because the type's addition is not associative. Every individual component is correct.</p>\n<p>In each case, the type satisfies the concept, the code compiles, and the defect lives in the gap.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"writing-the-gap-down\">Writing the gap down<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/what-a-concept-does-not-say#writing-the-gap-down\" class=\"hash-link\" aria-label=\"Direct link to Writing the gap down\" title=\"Direct link to Writing the gap down\" translate=\"no\">​</a></h2>\n<p>The treatment used in this reference is unremarkable and effective: the concept states the\nsyntax, and the semantic obligations are enumerated beside it with numbers.</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token comment\" style=\"color:#999988;font-style:italic\">// Semantic requirements (unchecked by the compiler):</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#999988;font-style:italic\">//   S1. op is associative on T.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#999988;font-style:italic\">//   S2. identity is a two-sided identity for op.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token comment\" style=\"color:#999988;font-style:italic\">//   S3. op is a pure function of its arguments.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">template</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">&lt;</span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">T</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"color:#00009f\">class</span><span class=\"token plain\"> </span><span class=\"token class-name\">Op</span><span class=\"token operator\" style=\"color:#393A34\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">concept</span><span class=\"token plain\"> </span><span class=\"token class-name\">Monoid</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token comment\" style=\"color:#999988;font-style:italic\">/* syntax only */</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><br></div></code></pre></div></div>\n<p>The numbering earns its place immediately. An algorithm can then say which obligations it uses (\"requires <code>Monoid&lt;T, Op&gt;</code> including S1\") which distinguishes the algorithms that reassociate\nfrom those that do not, and tells a user supplying a non-associative operation exactly which\nroutines are safe.</p>\n<p>The obligations also become testable. A property test over a generator of representative values\ndischarges S1 probabilistically, and for <code>double</code> under addition it fails, correctly, which is\nthe specification: the type does not satisfy S1, and the algorithms depending on it compute an\napproximation whose bound is stated elsewhere.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-design-consequence\">The design consequence<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/what-a-concept-does-not-say#the-design-consequence\" class=\"hash-link\" aria-label=\"Direct link to The design consequence\" title=\"Direct link to The design consequence\" translate=\"no\">​</a></h2>\n<p>Once the gap is written down, a question becomes askable that is otherwise invisible: should this\nobligation be an obligation at all, or should it be an invariant?</p>\n<p>Some can be moved into the type. A normalised rational maintains <code>gcd(p, q) == 1</code> on\nconstruction, so the obligation disappears. A matrix type constructed only from a Cholesky\nfactorization is positive definite by provenance. A sorted-range wrapper that permits no\nunsorted construction removes the precondition from every algorithm consuming it.</p>\n<p>Others can be moved into a check. Symmetry of an operator is not verifiable in general but is\nverifiable probabilistically (<span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mo stretchy=\"false\">⟨</mo><mi>A</mi><mi>x</mi><mo separator=\"true\">,</mo><mi>y</mi><mo stretchy=\"false\">⟩</mo><mo>≈</mo><mo stretchy=\"false\">⟨</mo><mi>x</mi><mo separator=\"true\">,</mo><mi>A</mi><mi>y</mi><mo stretchy=\"false\">⟩</mo></mrow><annotation encoding=\"application/x-tex\">\\langle Ax, y\\rangle \\approx \\langle x, Ay\\rangle</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mopen\">⟨</span><span class=\"mord mathnormal\">A</span><span class=\"mord mathnormal\">x</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.0359em\">y</span><span class=\"mclose\">⟩</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span><span class=\"mrel\">≈</span><span class=\"mspace\" style=\"margin-right:0.2778em\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mopen\">⟨</span><span class=\"mord mathnormal\">x</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord mathnormal\">A</span><span class=\"mord mathnormal\" style=\"margin-right:0.0359em\">y</span><span class=\"mclose\">⟩</span></span></span></span> for a few\nrandom vectors) at the cost of a few applications, which is negligible against the iterations\nthat follow.</p>\n<p>The remainder stay as obligations, and the point of enumerating them is that the remainder is now\na short, explicit list rather than an unbounded body of assumptions distributed across the\nimplementation.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-this-is-the-interesting-part\">Why this is the interesting part<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/what-a-concept-does-not-say#why-this-is-the-interesting-part\" class=\"hash-link\" aria-label=\"Direct link to Why this is the interesting part\" title=\"Direct link to Why this is the interesting part\" translate=\"no\">​</a></h2>\n<p>Concepts are usually discussed for what they added: better diagnostics, overload ordering,\nconstrained interfaces. Those are real and were worth the wait.</p>\n<p>The more useful effect is that they made the boundary visible. Before C++20, requirements were\nimplicit and the distinction between the syntactic and semantic parts of an interface was not\nexpressible at all. Now the syntactic part is in the language, which throws the semantic part\ninto relief, and the semantic part is where the defects in generic numerical code actually live.</p>",
            "url": "https://hanielulises.github.io/high-performance-cpp/essays/what-a-concept-does-not-say",
            "title": "What a Concept Does Not Say",
            "summary": "A concept named Ring is satisfied by any type with +, *, and the two identities. It is not",
            "date_modified": "2026-06-19T00:00:00.000Z",
            "author": {
                "name": "High Performance C++"
            },
            "tags": [
                "concepts",
                "semantics",
                "interface-design"
            ]
        },
        {
            "id": "https://hanielulises.github.io/high-performance-cpp/essays/writing-the-reassociation",
            "content_html": "<p>Almost every fast reduction in existence is licensed by a property that floating-point addition\ndoes not have. The situation is stable, well understood, and routinely misdescribed (as a\ncompiler flag, as a precision setting, as a tolerance question) when it is none of those. It is\na question about which algorithm is being executed.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-situation\">The situation<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/writing-the-reassociation#the-situation\" class=\"hash-link\" aria-label=\"Direct link to The situation\" title=\"Direct link to The situation\" translate=\"no\">​</a></h2>\n<p>A sum of <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>n</mi></mrow><annotation encoding=\"application/x-tex\">n</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.4306em\"></span><span class=\"mord mathnormal\">n</span></span></span></span> terms evaluated left to right has one parenthesisation. A sum evaluated with four\naccumulators, or eight vector lanes, or sixteen threads, has a different one. If addition were\nassociative these would agree. It is not, and they do not.</p>\n<p>The differences are not pathological. For terms of like sign they are bounded by <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><msub><mi>γ</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>∑</mo><mi mathvariant=\"normal\">∣</mi><msub><mi>x</mi><mi>i</mi></msub><mi mathvariant=\"normal\">∣</mi></mrow><annotation encoding=\"application/x-tex\">\\gamma_{n-1}\n\\sum |x_i|</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.0556em\">γ</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3011em\"><span style=\"top:-2.55em;margin-left:-0.0556em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">n</span><span class=\"mbin mtight\">−</span><span class=\"mord mtight\">1</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2083em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mop op-symbol small-op\" style=\"position:relative;top:0em\">∑</span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord\">∣</span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3117em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">i</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mord\">∣</span></span></span></span> against <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><msub><mi>γ</mi><mrow><mi>n</mi><mi mathvariant=\"normal\">/</mi><mi>k</mi><mo>+</mo><mi>k</mi></mrow></msub><mo>∑</mo><mi mathvariant=\"normal\">∣</mi><msub><mi>x</mi><mi>i</mi></msub><mi mathvariant=\"normal\">∣</mi></mrow><annotation encoding=\"application/x-tex\">\\gamma_{n/k + k}\\sum|x_i|</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.1052em;vertical-align:-0.3552em\"></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.0556em\">γ</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3448em\"><span style=\"top:-2.5198em;margin-left:-0.0556em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">n</span><span class=\"mord mtight\">/</span><span class=\"mord mathnormal mtight\" style=\"margin-right:0.0315em\">k</span><span class=\"mbin mtight\">+</span><span class=\"mord mathnormal mtight\" style=\"margin-right:0.0315em\">k</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3552em\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mop op-symbol small-op\" style=\"position:relative;top:0em\">∑</span><span class=\"mspace\" style=\"margin-right:0.1667em\"></span><span class=\"mord\">∣</span><span class=\"mord\"><span class=\"mord mathnormal\">x</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3117em\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em\"><span class=\"pstrut\" style=\"height:2.7em\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\">i</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em\"><span></span></span></span></span></span></span><span class=\"mord\">∣</span></span></span></span>, and the reassociated form is <em>more</em> accurate\nthan the sequential one: the split reduces the depth of the accumulation, and error grows with\ndepth. For terms of mixed sign with cancellation, both are unbounded relative to the true sum,\nand which is closer is not predictable.</p>\n<p>So the reassociated reduction is faster, usually more accurate, and returns a different value.\nAll three are true simultaneously, and each is sometimes reported alone as though it settled the\nmatter.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-flag-framing\">The flag framing<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/writing-the-reassociation#the-flag-framing\" class=\"hash-link\" aria-label=\"Direct link to The flag framing\" title=\"Direct link to The flag framing\" translate=\"no\">​</a></h2>\n<p>The usual framing is: enable fast-math and the compiler will vectorize your reductions. This\ngets the structure exactly backwards.</p>\n<p><code>-ffast-math</code> grants a global permission to reassociate, to assume no NaN or infinity, to\ncontract multiplications and additions, and to treat denormals as zero. It applies to every\nfloating-point operation in the translation unit, including the ones that are correct only under\nstrict semantics: the error-free transformations in a compensated summation, for instance,\nwhich the flag deletes entirely because <code>(a - (s - b)) + (b - b')</code> is algebraically zero and is\nnot numerically zero, and the flag says to believe the algebra.</p>\n<p>The result is a program whose numerical behaviour is determined by an option, in which the\nreductions that should be reassociated and the ones that must not be are treated identically, and\nin which the change is invisible at every point where it applies.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-alternative\">The alternative<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/writing-the-reassociation#the-alternative\" class=\"hash-link\" aria-label=\"Direct link to The alternative\" title=\"Direct link to The alternative\" translate=\"no\">​</a></h2>\n<p>Write the reassociation.</p>\n<div class=\"language-cpp codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-cpp codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token keyword\" style=\"color:#00009f\">double</span><span class=\"token plain\"> a0 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> a1 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> a2 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> a3 </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0.0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"color:#00009f\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">(</span><span class=\"token plain\">std</span><span class=\"token double-colon punctuation\" style=\"color:#393A34\">::</span><span class=\"token plain\">size_t i </span><span class=\"token operator\" style=\"color:#393A34\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:#393A34\">&lt;=</span><span class=\"token plain\"> n</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">4</span><span class=\"token punctuation\" style=\"color:#393A34\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">    a0 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">0</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\">  a1 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">1</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\">  a2 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">2</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\">  a3 </span><span class=\"token operator\" style=\"color:#393A34\">+=</span><span class=\"token plain\"> x</span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">i </span><span class=\"token operator\" style=\"color:#393A34\">+</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">3</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token punctuation\" style=\"color:#393A34\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><br></div></code></pre></div></div>\n<p>This is a different algorithm from the sequential sum, and it says so. It compiles to the fast\nform under strict semantics, because no permission is needed for a transformation the source\nalready performed. It has a stated error bound, which the flag-based version also has but which\nnobody computes because the transformation was not visible. And the compensated summation\nelsewhere in the same translation unit continues to work.</p>\n<p>The cost is that the unrolling factor is in the source, and the right factor depends on the\ntarget's arithmetic latency and throughput. That is a real cost. It is also a decision that\nsomeone has to make, and making it explicitly is better than deferring it to a heuristic that has\nno error analysis attached.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-general-shape\">The general shape<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/writing-the-reassociation#the-general-shape\" class=\"hash-link\" aria-label=\"Direct link to The general shape\" title=\"Direct link to The general shape\" translate=\"no\">​</a></h2>\n<p>This is an instance of a pattern that recurs throughout the material in this reference. A\nmathematical structure licenses an algorithmic transformation; the C++ type approximates the\nstructure; the transformation is applied anyway; the gap is a bounded error rather than a\ncorrectness failure.</p>\n<p>Associativity licenses tree reductions. Commutativity licenses unordered accumulation. An\nidentity licenses empty subranges. Distributivity licenses Horner's rule and strength reduction.\nEvery one of these is exact over the mathematical structure and approximate over the\nfloating-point type that models it.</p>\n<p>The discipline that follows is to state which law each transformation uses, and to carry the\nerror bound alongside the performance claim. A reduction that is eight times faster and produces\na different answer is a good trade in almost every case; it is a trade, and it should be recorded\nas one.</p>",
            "url": "https://hanielulises.github.io/high-performance-cpp/essays/writing-the-reassociation",
            "title": "Writing the Reassociation",
            "summary": "Almost every fast reduction in existence is licensed by a property that floating-point addition",
            "date_modified": "2026-04-03T00:00:00.000Z",
            "author": {
                "name": "High Performance C++"
            },
            "tags": [
                "numerical-analysis",
                "vectorization",
                "semantics"
            ]
        },
        {
            "id": "https://hanielulises.github.io/high-performance-cpp/essays/checking-the-cost-of-an-abstraction",
            "content_html": "<p>The phrase \"zero-overhead abstraction\" is used as though it described a property that C++\nabstractions possess. It describes a property that particular abstractions possess under\nparticular conditions, and the conditions are checkable. Treating the phrase as a guarantee is\nhow libraries acquire abstractions that cost twenty percent and nobody notices.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-the-claim-actually-says\">What the claim actually says<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/checking-the-cost-of-an-abstraction#what-the-claim-actually-says\" class=\"hash-link\" aria-label=\"Direct link to What the claim actually says\" title=\"Direct link to What the claim actually says\" translate=\"no\">​</a></h2>\n<p>An abstraction is free when the code generated for a concrete use is what a competent\nhand-written monomorphic version would be. That is a statement about generated instructions, and\nit is decided by reading them, not by reasoning about the language's design philosophy.</p>\n<p>Three conditions have to hold. The parameterisation must be resolved during translation, so that\nno indirect call remains. The representation must be unchanged, so that no additional data\nmovement is introduced. And the abstraction must not obstruct an optimisation the concrete\nversion would have received, which is the condition that fails most often and most quietly.</p>\n<p>The first two are easy to check and are usually satisfied. <code>static_assert(sizeof(W) == sizeof(T))</code> settles the second; the absence of a virtual function settles the first.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-third-condition\">The third condition<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/checking-the-cost-of-an-abstraction#the-third-condition\" class=\"hash-link\" aria-label=\"Direct link to The third condition\" title=\"Direct link to The third condition\" translate=\"no\">​</a></h2>\n<p>The third fails in ways that have nothing to do with the abstraction's design.</p>\n<p>A wrapper type with a user-provided copy constructor is no longer trivially copyable, so an array\nof it can no longer be relocated with a <code>memcpy</code>, so vector growth becomes a loop of constructor\ncalls. The wrapper is still the same size. It still has no virtual functions. It costs a factor\nof several on any code that grows containers of it.</p>\n<p>A range adaptor pipeline three deep inlines and vectorizes; the same pipeline six deep exceeds\nan inlining budget, and every element access becomes a call. Nothing about the source changed\nexcept its length.</p>\n<p>A generic kernel taking two <code>std::span</code> parameters cannot be vectorized without a runtime overlap\ncheck, because the compiler cannot prove the spans are disjoint. The concrete version, written\nwith two local arrays, has no such problem. The abstraction did not add instructions; it removed\ninformation.</p>\n<p>In each case, the abstraction is free by the first two criteria and expensive in fact.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-discipline\">The discipline<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/checking-the-cost-of-an-abstraction#the-discipline\" class=\"hash-link\" aria-label=\"Direct link to The discipline\" title=\"Direct link to The discipline\" translate=\"no\">​</a></h2>\n<p>This suggests treating the claim the way any other performance claim is treated: as something to\nbe established for a specific abstraction in a specific use, and re-established when either\nchanges.</p>\n<p>The mechanics are unremarkable. Compile the abstract and concrete versions of a kernel and\ncompare the generated code. Keep the comparison in the build, so that a compiler upgrade or an\ninnocuous refactor that breaks it is caught when it happens rather than during the next\nperformance investigation. Assert the representational properties (size, triviality, alignment)\nnext to the type, since they are part of its interface for the code that depends on them.</p>\n<p>What makes this worth doing is not that abstractions are usually expensive. They are usually\nfree. It is that the cases where they are not are invisible in the source, and the cost is\nattributed to something else (to the algorithm, to the machine, to the compiler) for a long\ntime before anyone looks.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-stronger-case\">The stronger case<a href=\"https://hanielulises.github.io/high-performance-cpp/essays/checking-the-cost-of-an-abstraction#the-stronger-case\" class=\"hash-link\" aria-label=\"Direct link to The stronger case\" title=\"Direct link to The stronger case\" translate=\"no\">​</a></h2>\n<p>There is a stronger claim available, and it is the one worth making. A well-chosen abstraction is\nnot merely free; it is faster than the concrete code it replaces, because it makes a better\nimplementation feasible.</p>\n<p>An algorithm written against a concept can dispatch to a specialised path when the argument\nsupports one. A kernel taking <code>mdspan</code> with a layout policy can be blocked once and used for\nevery storage order. An expression template can fuse three traversals into one, removing memory\ntraffic that the concrete version has no way to avoid without being rewritten.</p>\n<p>This is the case for abstraction in performance-oriented code, and it is a stronger case than the\ndefensive one. It also has the same evidentiary requirement: the generated code, or the\nmeasurement, or neither claim is made.</p>",
            "url": "https://hanielulises.github.io/high-performance-cpp/essays/checking-the-cost-of-an-abstraction",
            "title": "Checking the Cost of an Abstraction",
            "summary": "The phrase \"zero-overhead abstraction\" is used as though it described a property that C++",
            "date_modified": "2026-02-14T00:00:00.000Z",
            "author": {
                "name": "High Performance C++"
            },
            "tags": [
                "generic-programming",
                "performance",
                "method"
            ]
        }
    ]
}