<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Computer, Enhance!]]></title><description><![CDATA[Programming courses, interviews, commentary.]]></description><link>https://www.computerenhance.com</link><image><url>https://substackcdn.com/image/fetch/$s_!7DRL!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4c646b6-92ad-4e9d-95da-e629e19689f4_800x800.png</url><title>Computer, Enhance!</title><link>https://www.computerenhance.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 28 Apr 2026 05:36:42 GMT</lastBuildDate><atom:link href="https://www.computerenhance.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Casey Muratori]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[computerenhance@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[computerenhance@substack.com]]></itunes:email><itunes:name><![CDATA[Casey Muratori]]></itunes:name></itunes:owner><itunes:author><![CDATA[Casey Muratori]]></itunes:author><googleplay:owner><![CDATA[computerenhance@substack.com]]></googleplay:owner><googleplay:email><![CDATA[computerenhance@substack.com]]></googleplay:email><googleplay:author><![CDATA[Casey Muratori]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Ethics of Generative AI]]></title><description><![CDATA[Listen now | What is the appropriate ethical framework for thinking about generative AI?]]></description><link>https://www.computerenhance.com/p/the-ethics-of-generative-ai</link><guid isPermaLink="false">https://www.computerenhance.com/p/the-ethics-of-generative-ai</guid><pubDate>Thu, 23 Apr 2026 16:05:46 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/194373057/df928c7c189c8d054e8d2a2e64758656.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<div id="youtube2-bjO-s4rNPlY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;bjO-s4rNPlY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/bjO-s4rNPlY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>The legal issues surrounding generative AI are something only the court system can decide. The ethical issues, on the other hand, are things that everyone must decide for themselves. Different people with different value systems will come to different conclusions.</p><p>In this episode, <a href="https://demetrispanos.com/">Demetri</a> and I open the can of worms that is &#8220;AI ethics&#8221; and walk through a series of incremental steps people should think through when deciding for themselves if they think generative AI is ethical.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.computerenhance.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.computerenhance.com/subscribe?"><span>Subscribe now</span></a></p><p><em>As always, the art for the thumbnail, podcast cover, and banner of Wading Through AI were all hand-drawn by <a href="https://x.com/aerettberg">Anna Rettberg</a> in her signature style. We do not currently use generative AI here at <a href="https://mollyrocket.com/">Molly Rocket</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Q&A #84 (2026-04-20)]]></title><description><![CDATA[Answers to questions from the last Q&A thread.]]></description><link>https://www.computerenhance.com/p/q-and-a-84-2026-04-20</link><guid isPermaLink="false">https://www.computerenhance.com/p/q-and-a-84-2026-04-20</guid><pubDate>Tue, 21 Apr 2026 02:46:08 GMT</pubDate><enclosure url="https://substack-video.s3.amazonaws.com/video_upload/post/194840638/9e584af3-4ea6-4c55-ba8d-3951879bbcc0/transcoded-61489.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>In each Q&amp;A video, I answer questions from the comments on the previous Q&amp;A video, which can be from any part of the course.</em></p><p>The questions addressed in this video are:</p><ul><li><p><strong>[00:04]</strong> &#8220;Quick question (for Casey or anyone with a suggestion!): I am neither a novice nor an experienced programmer, and would like to learn enough C++ to write some useful code, but I am struggling to find good material.&#8221;</p></li><li><p><strong>[02:18]</strong> &#8220;In the episode &#8216;In-order Interleaving&#8217;, you have a loop that handles multiple elements per loop iteration. When the list of elements isn&#8217;t a multiple of your &#8216;elements per loop&#8217;, we need something after the loop to handle the last few remaining elements. My question is: Is there a particular way to write this &#8216;residual handling&#8217; part? Whenever I&#8217;ve had to do this in my own code it always felt a little awkward.&#8221;</p></li><li><p><strong>[13:25]</strong> &#8220;Hey Casey, what&#8217;s your take on Arm making their own chips now? Sincerely, an Arm engineer.&#8221;</p></li><li><p><strong>[17:05]</strong> &#8220;On the topic of growable arenas, concretely, how do you implement them with respect to the &#8216;layered&#8217; architecture? To grow them, naturally you would need to mmap or VirtualAlloc more memory, but if you&#8217;re far removed from the platform layer and aren&#8217;t writing a program that is frame-based (for example, a compiler) and thus have no opportune time to go back to the platform layer and request more memory, what are your strategies? I can only come up with round-tripping back to the OS using a platform-layer API like &#8216;RequestMoreMemory()&#8217;, or something like this. For more context, this would be for the kind of program that also cannot place upper-bounds on memory usage (again, like in a compiler), but still does not want to be malloc&#8217;ing/free&#8217;ing excessively. I&#8217;m keen to hear how you would approach this problem?&#8221;</p></li><li><p><strong>[26:14]</strong> &#8220;Have you had occasion to use coroutines to write algorithms that must pause/resume? E.g., protocols in networking or software in a hardware simulator.&#8221;</p></li></ul>
      <p>
          <a href="https://www.computerenhance.com/p/q-and-a-84-2026-04-20">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA["Am I Crazy?"]]></title><description><![CDATA[Listen now | Why do people seem to be having such drastically different experiences with AI from one another?]]></description><link>https://www.computerenhance.com/p/am-i-crazy</link><guid isPermaLink="false">https://www.computerenhance.com/p/am-i-crazy</guid><dc:creator><![CDATA[Casey Muratori]]></dc:creator><pubDate>Thu, 16 Apr 2026 16:05:44 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/194370214/dbf03eabf21a7deb4403ee2883d2e758.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<div id="youtube2-Sp1EmFRDquA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Sp1EmFRDquA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/Sp1EmFRDquA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>When it comes to AI, people seem to be having very disparate experiences. Some people become enthusiastic, while others become frustrated, even when apparently attempting similar tasks.</p><p>In this episode of <em>Wading Through AI</em>, <a href="https://demetrispanos.com/">Demetri</a> and I address the root causes of the feeling a lot of people - both pro- and anti-AI - are having that either <em>they</em> must be crazy, or <em>everyone else</em> must be, because their experiences seem to differ so dramatically from what they are hearing from others.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.computerenhance.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.computerenhance.com/subscribe?"><span>Subscribe now</span></a></p><p><em>As always, the art for the thumbnail, podcast cover, and banner of Wading Through AI were all hand-drawn by <a href="https://x.com/aerettberg">Anna Rettberg</a> in her signature style. We do not currently use generative AI here at <a href="https://mollyrocket.com/">Molly Rocket</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[In-order Interleaving]]></title><description><![CDATA[By handing the CPU an instruction stream it can execute in order, we can exceed the limits we hit when we rely on its out-of-order execution capabilities.]]></description><link>https://www.computerenhance.com/p/in-order-interleaving</link><guid isPermaLink="false">https://www.computerenhance.com/p/in-order-interleaving</guid><pubDate>Thu, 16 Apr 2026 03:09:52 GMT</pubDate><enclosure url="https://substack-video.s3.amazonaws.com/video_upload/post/194365258/709f78f7-1627-4ee5-bf05-c53a76e185a0/transcoded-47060.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CKM1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CKM1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CKM1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CKM1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CKM1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CKM1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg" width="1456" height="740" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:740,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2362184,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.computerenhance.com/i/194365258?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CKM1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CKM1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CKM1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CKM1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc63b4f35-7718-4927-85e6-2f53f12fff82_5634x2864.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>This is the tenth video in Part 5 of the Performance-Aware Programming series. Please see the <a href="https://www.computerenhance.com/p/table-of-contents">Table of Contents</a> to quickly navigate through the rest of the course as it is updated, and <a href="https://github.com/cmuratori/computer_enhance">the code repository</a> for downloadable code listings.</em></p>
      <p>
          <a href="https://www.computerenhance.com/p/in-order-interleaving">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[My Thoughts on Notch's DLSS Post]]></title><description><![CDATA[The creator of Minecraft recently made a (controversial?) post about DLSS. I wanted to add some relevant context about GPU hardware.]]></description><link>https://www.computerenhance.com/p/my-thoughts-on-notchs-dlss-post</link><guid isPermaLink="false">https://www.computerenhance.com/p/my-thoughts-on-notchs-dlss-post</guid><dc:creator><![CDATA[Casey Muratori]]></dc:creator><pubDate>Fri, 03 Apr 2026 07:35:09 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/193044322/6404dc04de8b3718f207f10ec0f09064.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Recently, Minecraft creator Markus &#8220;Notch&#8221; Persson used his popular X account to express a negative opinion of DLSS:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gTQ8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gTQ8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png 424w, https://substackcdn.com/image/fetch/$s_!gTQ8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png 848w, https://substackcdn.com/image/fetch/$s_!gTQ8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png 1272w, https://substackcdn.com/image/fetch/$s_!gTQ8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gTQ8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png" width="588" height="315" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:315,&quot;width&quot;:588,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:27737,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.computerenhance.com/i/193044322?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gTQ8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png 424w, https://substackcdn.com/image/fetch/$s_!gTQ8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png 848w, https://substackcdn.com/image/fetch/$s_!gTQ8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png 1272w, https://substackcdn.com/image/fetch/$s_!gTQ8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc02332bc-3125-43ee-b8a7-48f0df0ed4f0_588x315.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Notch&#8217;s <a href="https://x.com/notch/status/2039561278495068337">post on X</a> about DLSS.</figcaption></figure></div><p>Technically, it was dated April 1st, so it may all have been a ruse! But April Fools joke or not, the vast majority of replies took it seriously.</p><p>While anyone can subjectively agree or disagree with Notch on the value of DLSS, there&#8217;s an underlying objective question regarding his use of the phrase &#8220;<em>THE SAME HARDWARE</em>&#8221;. Many replies took issue with this wording, claiming it was a clear sign Notch did not understand how DLSS worked.</p><p>I&#8217;m not so sure about that.</p><p>I think there is a good case to be made that - given what little NVIDIA tells us - Notch is not objectively wrong about NVIDIA hardware. I didn&#8217;t feel like a contorted X post would be the best way to elaborate on this, so I livestreamed my thoughts on <a href="https://www.twitch.tv/molly_rocket">Twitch</a>, <a href="https://www.youtube.com/mollyrocket">YouTube</a>, and here on Substack.</p><p>The video is included above for those of you that missed the stream.</p>]]></content:encoded></item><item><title><![CDATA[Making Sense of the Hype]]></title><description><![CDATA[Using the Anthropic C compiler post as an example, Demetri proposes a two-axis approach for assessing claims about AI.]]></description><link>https://www.computerenhance.com/p/making-sense-of-the-hype</link><guid isPermaLink="false">https://www.computerenhance.com/p/making-sense-of-the-hype</guid><dc:creator><![CDATA[Casey Muratori]]></dc:creator><pubDate>Fri, 13 Mar 2026 17:14:46 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/190781016/078fefeb331e8140f60a7167645512fe.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<div id="youtube2-HgNKa9UlRF8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;HgNKa9UlRF8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/HgNKa9UlRF8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>In this second episode of <em>Wading Through AI</em>, <a href="https://demetrispanos.com/">Demetri</a> and I discuss the recent <a href="https://www.anthropic.com/engineering/building-c-compiler">Anthropic blog post about &#8220;parallel Claudes&#8221; building a C Compiler</a>, and use it as a case study for how to assess AI announcements.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.computerenhance.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.computerenhance.com/subscribe?"><span>Subscribe now</span></a></p><p><em>As always, the art for the thumbnail, podcast cover, and banner of Wading Through AI were all hand-drawn by <a href="https://x.com/aerettberg">Anna Rettberg</a> in her signature style. We do not currently use generative AI here at <a href="https://mollyrocket.com/">Molly Rocket</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Q&A #83 (2026-03-11)]]></title><description><![CDATA[Answers to questions from the last Q&A thread.]]></description><link>https://www.computerenhance.com/p/q-and-a-83-2026-03-11</link><guid isPermaLink="false">https://www.computerenhance.com/p/q-and-a-83-2026-03-11</guid><pubDate>Thu, 12 Mar 2026 04:19:57 GMT</pubDate><enclosure url="https://substack-video.s3.amazonaws.com/video_upload/post/190667397/dd549d8f-4ef2-4367-8a4f-573842929d35/transcoded-194421.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>In each Q&amp;A video, I answer questions from the comments on the previous Q&amp;A video, which can be from any part of the course.</em></p><p>The questions addressed in this video are:</p><ul><li><p><strong>[0:00:03]</strong> &#8220;Building on using free lists to manage objects with complex lifetimes, how do you handle cases where an object type can vary in size?&#8221;</p></li><li><p><strong>[0:02:33]</strong> &#8220;Can you go into more detail about how to handle IO with queues vs callbacks? A small example on the fancy light-board would be nice.&#8221;</p></li><li><p><strong>[0:07:14]</strong> &#8220;With the recent widespread usage of AI to program in the industry and a fierce push from upper management to enforce usage of AI in development tasks, I am finding myself less and less motivated to program, and also depressed. I have mostly ceased my programming activities outside of working hours.</p><p>Do you have any advice on how to deal with the AI wave and also to continue motivated to program as a hobby and professionally in this environment?&#8221;</p></li><li><p><strong>[0:20:00]</strong> &#8220;Now that you are switching to Linux in full swing have you ported your codebases or what&#8217;s your strategy? I did the opposite thing and fled from Linux because I wanted to start my first big codebase in a more stable environment so it has been the year of the Windows desktop for me which after running a debloat script hasn&#8217;t actually been bad, nevertheless seeing Microsoft&#8217;s behavior does have me yearning for the penguin, and knowing how painful releasing something for Linux is has me wondering if programming against the windows API and using Wine for most of one&#8217;s graphical software is a valid way to proceed.&#8221;</p></li><li><p><strong>[0:29:50]</strong> &#8220;How much of the software you currently write is based on your own thoughts and creativity? I&#8217;ve found myself relying heavily on reading and using open-source projects where similar problems were already solved. After a while, this started to make me feel like an impostor. Do great programmers like yourself write their own code, or do they adapt and build on existing work?&#8221;</p></li><li><p><strong>[0:35:38]</strong> &#8220;This maybe jumping the gun a fair bit. but when you say back of the envelop calculation, does that include the time complexity of whatever algorithm to do correctly?&#8221;</p></li><li><p><strong>[0:39:45]</strong> &#8220;Have you ever written anything in ISPC? From my experience it seems much easier to write than rolling the simd myself, and much more portable.&#8221;</p></li><li><p><strong>[0:42:10]</strong> &#8220;Do you have any recommendations on how to use &#8216;pen &amp; paper&#8217; in the software development process? I&#8217;ve noticed that drawing a problem helps me visualize the problem easier than jumping straight into coding. I&#8217;m working with MIDI and writing a document explaining in my own words how does MIDI encode data helped me in unexpected ways. I&#8217;m wondering if I&#8217;m missing out on any other &#8216;pen &amp; paper&#8217; practice. Any useful tips?&#8221;</p></li><li><p><strong>[0:46:47]</strong> &#8220;Hello I come with another question. How does one go about implementing smooth window resizing with Dangerous Thread Crews? I have the two threads and do get non-blocking resizing but the UI contents of the window jiggle and stretch a bit when resizing (which gets way worse with vsync) and nothing I try (like adding synchronization and using WM_WINDOWPOSCHANGING to allow only one resize per frame) gets rid of the apparent discrepancy between the window size and the size my renderer targets that causes some ugliness. The only reference I have of a program that has smooth resizing and doesn&#8217;t achieve this by updating on each WM_PAINT is your refterm program but I don&#8217;t see any glaring differences between the way you rendered stuff there and it seems like there you just called GetClientRect on each update with no need for anything else... so am I just doing something dumb and missing something or is there some computer wizardry I need to invoke to fix this when programming more complex UIs?&#8221;</p></li><li><p><strong>[0:51:06]</strong> &#8220;In this talk about pathfinding in Age of Empires 2, around the 15-16 minute mark, he mentions turning off SIMD because they were losing floating point precision. I don&#8217;t understand why that was the case for them, can you provide more insight?&#8221;</p></li><li><p><strong>[1:01:33]</strong> &#8220;I&#8217;ve been trying to test how many simultaneous loads can I get with the repetition tester when I do 1, 2, 3 or 4 moves in a loop on the two machines I have access to. My laptop (which has Intel Skylake chip) reports that the memory bandwidth doubles only when I go from 1 to 2 moves per loop, which is expected and reproduces your results from the course. But when I do the same on my desktop (which has Intel Raptor lake chip), the results are the same. The Raptor lake apparently have two type of cores: P-cores and E-cores, where E-cores also have 2 ports capable of executing loads, while P-cores are supposed to be equipped with 3 ports of that type (at least that&#8217;s what I read in Agner Fog manual). To my understanding it means that I should see a bandwidth bump when going from 1 to 2 moves per loop, and when going from 2 to 3 moves per loop. But that doesn&#8217;t happen, I see only one bump (from 1 to 2 moves). I guess that there are some nuances with running the tester on this system that I might not be aware of. But one of them - which is clear to me - is that it is the OS who decides on which core should the tester be run on. So I set the affinity of the tester to CPU1 to make sure that it runs on the P-core. Process Explorer confirmed that it runs on CPU1. But I still could not see the improvement when going from 2 to 3 memory reads. Then I repeated the test with all the cores (one at a time), but I saw no difference in the results.</p><p>It is either my test setup that&#8217;s completely broken, or some other factor that I can&#8217;t see which prevents the bandwidth improvement of a 3 reads loop. I would be grateful if you could give me some pointers here.&#8221;</p></li><li><p><strong>[1:07:25]</strong> &#8220;What are your thoughts about the new dynamicdeopt in msvc that lets you run optimized builds that you can debug with full information because they switch the executable on the fly?&#8221;</p></li><li><p><strong>[1:08:15]</strong> &#8220;I&#8217;d like to ask you about the pass-by-ref vs pass-by-value &#8216;debate&#8217;. Traditional C++ advice is &#8216;always pass by const&amp; anything bigger than 8 bytes&#8217;, but I&#8217;ve recently started seeing some people advocate that 16 byte structs should also be pass-by-value. I know that you couldn&#8217;t care less about const, and you do seem to pass by value small stuff without worrying too much about it in your own code, so .. is there anything I&#8217;m failing to consider here? is this a stupid thing to worry about in the abstract, or is there some general principle that could be useful to keep in mind here?&#8221;</p></li></ul>
      <p>
          <a href="https://www.computerenhance.com/p/q-and-a-83-2026-03-11">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Should You Be A Carpenter?]]></title><description><![CDATA[Is entering the "knowledge economy" today too risky given the field's increasing focus on AI?]]></description><link>https://www.computerenhance.com/p/should-you-be-a-carpenter</link><guid isPermaLink="false">https://www.computerenhance.com/p/should-you-be-a-carpenter</guid><dc:creator><![CDATA[Casey Muratori]]></dc:creator><pubDate>Thu, 05 Mar 2026 21:22:13 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/190033507/29abaac6a753ac63fe0da0f2772487de.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<div id="youtube2-RJyPVLMyyuA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;RJyPVLMyyuA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/RJyPVLMyyuA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>A few weeks ago, I was approached by long time AI-researcher and personal friend <a href="https://demetrispanos.com/">Demetri Spanos</a> about producing a discussion series on emerging AI topics.</p><p>Since Demetri has been working on AI technology for decades, now that it&#8217;s the hot topic, he regularly gets bombarded with questions from friends who want an opinion from the inside. The idea for the series was to see if we could get those answers out to a wider audience.</p><p>As most of you already know, I don&#8217;t work with AI myself, so I&#8217;m really looking forward to these discussions. Demetri is exceptionally good at avoiding hyperbole, and does a fantastic job providing the technical context you need to draw your own conclusions. As you&#8217;ll see, he never tries to sell a specifically positive or specifically negative view of AI, which is very refreshing compared to the normal AI discourse.</p><p>I hope you enjoy this first discussion as much as I did. If you&#8217;re a subscriber, and have questions or topics you&#8217;d like us to cover on future episodes, please feel free to leave a suggestion in the comments! I will be checking regularly to see what our readers are most interested in.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.computerenhance.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.computerenhance.com/subscribe?"><span>Subscribe now</span></a></p><p><em>As always, the art for the thumbnail, podcast cover, and banner of Wading Through AI were all hand-drawn by <a href="https://x.com/aerettberg">Anna Rettberg</a> in her signature style. We do not currently use generative AI at <a href="https://mollyrocket.com/">Molly Rocket</a>.</em></p>]]></content:encoded></item><item><title><![CDATA[Dependency Chain Stalls]]></title><description><![CDATA[The CPU's ability to extract parallelism has its limits.]]></description><link>https://www.computerenhance.com/p/dependency-chain-stalls</link><guid isPermaLink="false">https://www.computerenhance.com/p/dependency-chain-stalls</guid><pubDate>Wed, 04 Mar 2026 03:31:39 GMT</pubDate><enclosure url="https://substack-video.s3.amazonaws.com/video_upload/post/189840675/0e97fb25-8257-4e41-9a4f-67b0d50eadf4/transcoded-77573.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AcnN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AcnN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AcnN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AcnN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AcnN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AcnN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg" width="1456" height="626" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:626,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:625880,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.computerenhance.com/i/189840675?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AcnN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AcnN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AcnN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AcnN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee94ce40-8301-48bb-be91-4060d4336723_1920x826.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>This is the ninth video in Part 5 of the Performance-Aware Programming series. Please see the <a href="https://www.computerenhance.com/p/table-of-contents">Table of Contents</a> to quickly navigate through the rest of the course as it is updated, and <a href="https://github.com/cmuratori/computer_enhance">the code repository</a> for downloadable code listings.</em></p>
      <p>
          <a href="https://www.computerenhance.com/p/dependency-chain-stalls">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[The Sitdown: Types of DRAM and the DRAM Shortage]]></title><description><![CDATA[On Wednesday mornings, I am often a guest on The Standup podcast. It&#8217;s a wide-audience podcast, so we don&#8217;t go too in-depth on any particular topic. To give myself more time to ramble, I&#8217;ve decided to occasionally do a post-show live stream where I can go into more depth for those interested.]]></description><link>https://www.computerenhance.com/p/the-sitdown-types-of-dram-and-the</link><guid isPermaLink="false">https://www.computerenhance.com/p/the-sitdown-types-of-dram-and-the</guid><dc:creator><![CDATA[Casey Muratori]]></dc:creator><pubDate>Sat, 31 Jan 2026 02:02:32 GMT</pubDate><enclosure url="https://substack-video.s3.amazonaws.com/video_upload/post/186369520/74f953a7-8520-4d9b-aa0b-046c55e7649a/transcoded-241067.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>On Wednesday mornings, I am often a guest on <a href="https://thestanduppod.com/">The Standup podcast</a>. It&#8217;s a wide-audience podcast, so we don&#8217;t go too in-depth on any particular topic. To give myself more time to ramble, I&#8217;ve decided to occasionally do a post-show live stream where I can go into more depth for those interested.</p><p>This past Wednesday, one of the topics was &#8220;the DRAM shortage&#8221;. I thought it might be nice to go through the different types of DRAM and talk about where they are made, just to give some context to the global supply situation (or lack thereof). I livestreamed it on <a href="https://www.twitch.tv/molly_rocket">Twitch</a>, <a href="https://www.youtube.com/mollyrocket">YouTube</a>, and of course, right here on Substack.</p>
      <p>
          <a href="https://www.computerenhance.com/p/the-sitdown-types-of-dram-and-the">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Q&A #82 (2026-01-27)]]></title><description><![CDATA[Answers to questions from the last Q&A thread.]]></description><link>https://www.computerenhance.com/p/q-and-a-82-2026-01-27</link><guid isPermaLink="false">https://www.computerenhance.com/p/q-and-a-82-2026-01-27</guid><pubDate>Tue, 27 Jan 2026 23:58:15 GMT</pubDate><enclosure url="https://substack-video.s3.amazonaws.com/video_upload/post/186010676/f8099312-2207-4fc3-a203-77f3cc4aaad6/transcoded-03188.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>In each Q&amp;A video, I answer questions from the comments on the previous Q&amp;A video, which can be from any part of the course.</em></p><p>The questions addressed in this video are:</p><ul><li><p><strong>[01:02]</strong> &#8220;Could you suggest a resource to learn how to work with large datasets that don&#8217;t fit into VRAM, or even regular RAM?&#8221;</p></li><li><p><strong>[07:24]</strong> &#8220;I do not know how this compares to other approaches, as I&#8217;ve not really tried to optimize my profilers much as it&#8217;s not really my main area of work, but your profiling explanation made me think of a lock-debug profiler I built. It sounds similar to me at least. Do you agree?</p><p>In my solution, each worker thread owns its profiling buffers completely. I keep a thread-local pointer to a block-based buffer that grows in chunks when needed, and all writes are done by the thread with no locks. The only shared step is that when a thread creates its first block, it registers it once by pushing it into a global linked list so the UI can later iterate all threads. To avoid stalling the writers, I double-buffered it. Each thread allocates two buffers and writes into one of them.&#8221;</p></li><li><p><strong>[09:46]</strong> &#8220;About memory usage and the program stack, I believed that this stack could more easily fit in the L1 cache. Isn&#8217;t there a higher risk of cache misses at that level if the data to use has been allocated elsewhere? Would it even be noticeable in terms of performance?&#8221;</p></li><li><p><strong>[14:32]</strong> &#8220;What&#8217;s the best way to multithread a software rasterizer? In my experience, scan line interlacing per triangle was horrific.&#8221;</p></li><li><p><strong>[18:18]</strong> &#8220;Do you know why in the file processing test on the same machine on linux mmaping the file could be outperforming all other methods on medium and large mapped chunk sizes, and on windows the same test was worse than everyone else?&#8221;</p></li><li><p><strong>[21:18]</strong> &#8220;Regarding callbacks, I think I understood the argument about moving things to a queue instead. However, I also can see the benefit of a callback because that&#8217;s synchronous. What if the file IO read some data and stored in a buffer, and the callback now is supposed to handle that read data. If instead you move things to a queue, you&#8217;d have to keep allocating new buffers to keep working on those asynchronous reads, because you don&#8217;t know when the client code will handle those reads. If instead you can very quickly handle this buffer of read data synchronously in the callback, the file IO can reuse the same buffer to store the next chunk.&#8221;</p></li><li><p><strong>[25:45]</strong> &#8220;Can you steelman cases for which an arena/bump allocator (are these the same thing?) is not the preferred way to allocate memory (I imagine it is when lifetimes are not apriori known, but perhaps I am missing more subtlety)? In such cases, what is your preferred method of allocation? Are you forced to go back to new/delete?&#8221;</p></li><li><p><strong>[33:01]</strong> &#8220;Re: Dead Code Elimination Prevention Macros, I&#8217;ve got identical results with `asm volatile (&#8221;&#8220; : &#8220;+v&#8221;(Value));` which tells the compiler that `Value` is both input and output, forcing it to initialize it, as well as preventing from assuming a specific value. It would generate `vpxor` for `0.0` and `vmovaps` for `0.5`. The advantage here is that it&#8217;s quite generic and doe<code>n&#8217;t depend on operand size/type.</code>Could you please elaborate on your choice of explicitly using instructions?&#8221;</p></li><li><p><strong>[35:14]</strong> &#8220;Concerning callbacks, is there a benefit to use callbacks for print-outs/messaging? We have a part of the program that do some calculations which can take time, and it uses callbacks to notify the user about the progress, and waiting to the end of all the computations is not good enough. We also use a callback for a type of mesh calculation that depends on things that this other part of the program shouldn&#8217;t know about. (These things were not my decision, but I guess making the module as isolated as possible makes it easier to use it as a module in another program)&#8221;</p></li><li><p><strong>[37:42]</strong> &#8220;How do you determine if a solution to a problem is more complex than it needs to be? And for inherently complex and interconnected problems, how do you determine if it needs to be subdivided or not? Is there a general approach for working on a complex system with lots of moving parts? (other than me complaining about it :) )&#8221;</p></li></ul>
      <p>
          <a href="https://www.computerenhance.com/p/q-and-a-82-2026-01-27">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[DynamoDB, Don't Leave Me Hanging!]]></title><description><![CDATA[Please put the "root" back into "root cause analysis".]]></description><link>https://www.computerenhance.com/p/dynamodb-dont-leave-me-hanging</link><guid isPermaLink="false">https://www.computerenhance.com/p/dynamodb-dont-leave-me-hanging</guid><dc:creator><![CDATA[Casey Muratori]]></dc:creator><pubDate>Mon, 05 Jan 2026 17:02:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/60cb3abd-769b-4211-9cd0-59930c31be68_2784x1856.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A Root Cause Analysis (RCA) post is like the final chapter of a murder mystery: we want to learn &#8220;whodunnit&#8221; and how. Unfortunately, for the large-scale AWS outage in October, the material put out by Amazon ends on more of a cliffhanger.</p><p>To elaborate, in <a href="https://aws.amazon.com/message/101925/">the official RCA</a>, you will see a lengthy explanation of the state that triggers the bug, as well as the cascading series of failures that took down much of AWS. However, the bug itself is described only by the following single sentence:</p><blockquote><p><em>Additionally, because the active plan was deleted, the system was left in an inconsistent state that prevented subsequent plan updates from being applied by any DNS Enactors.</em></p></blockquote><p>That&#8217;s not much to go on.</p><p>Earlier this month, my hopes for a more complete explanation were bolstered by the sudden appearance of <a href="https://www.youtube.com/watch?v=YZUNNzLDWb8">an AWS re:Invent presentation</a> devoted entirely to this particular outage. Sadly, in the hour-long video, only twelve seconds were spent on the actual bug:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;3e1f0133-5335-47ac-85b4-3a5b424596bf&quot;,&quot;duration&quot;:null}"></div><p>Both the RCA and the presentation do a good job of explaining the conditions that triggered the bug. Assuming I understood correctly, the setup goes like this:</p><ol><li><p>DynamoDB uses multiple DNS &#8220;enactors&#8221;, running concurrently, to update DNS records for load balancing (among other things).</p></li><li><p>Enactors use locking and backoff to partially serialize their behavior and make them &#8220;easier to reason about&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>.</p></li><li><p>Pathological lock contention can cause one enactor to be &#8220;enacting&#8221; a series of DNS records so old that another enactor will assume they couldn&#8217;t still be in use, and try to delete them.</p></li><li><p>An &#8220;inconsistent state&#8221; occurs when one enactor deletes DNS records it thought were sufficiently old while another enactor updates a DNS endpoint to refer to those same records as authoritative.</p></li><li><p>Enactors will stop operating if they attempt to update a DNS endpoint when it does not already refer to a resolvable name (which it won&#8217;t once the &#8220;inconsistent state&#8221; has occurred).</p></li></ol><p>After all that setup, the story leaves me hanging. To quote the twelve seconds of the presentation:</p><blockquote><p>&#8230; but when that plan&#8217;s missing, our code couldn&#8217;t handle the fact that we tried to point the rollback to nothing &#8230;</p></blockquote><p>To me, this is the <em>actual</em> bug, so I wanted to hear about it in detail. Why didn&#8217;t the code handle that? Or more specifically, why would the code even need to do anything special to &#8220;handle&#8221; that case at all?</p><p>Let me elaborate. Whenever I&#8217;m reading something like an RCA, I&#8217;m building a model of the system in my head. I&#8217;m sure many of you do this as well - it&#8217;s how programmers think through programming problems as they are being described.</p><p>My mental model of the AWS system at this point <em>doesn&#8217;t yet have</em> a bug. If I imagine myself implementing the code they&#8217;re describing here, the pseudo-code version is really just three steps:</p><pre><code><strong>1</strong> get the current value of <em>dynamodb.us-east-1.api.aws</em>
  (<em>"plan-110.ddb.aws"</em> in the presentation example)
<strong>2</strong> set <em>rollback.ddb.aws</em> to the value from step 1
<strong>3</strong> set <em>dynamodb.us-east-1.api.aws</em> to the new value
  (<em>"plan-145.ddb.aws"</em> in the presentation example<em>)</em></code></pre><p>When written in the straightforward way, there should be no issue with step 1 receiving an unresolvable name - some kind of &#8220;null&#8221;, garbage like <code>0.0.0.0</code>, or what I assume would have happened in the actual outage: the &#8220;old&#8221; name whose record had been deleted (shown as <code>plan-110.ddb.aws</code> in <a href="https://youtu.be/YZUNNzLDWb8?t=1562">the example from the re:Invent presentation</a>).</p><p>As far as we&#8217;ve been told, performing these DNS record modifications does not require the enactor to actually communicate with any target load balancers, so it shouldn&#8217;t matter if the target DNS records exist or not. The rollback entrypoint (<code>rollback.ddb.aws</code>) would just be set to the unresolvable name, just as <code>dynamodb.us-east-1.api.aws</code> had an unresolvable name prior to this update. As far as the explanation goes, the enactors shouldn&#8217;t have cared whether these names were resolvable or not.</p><p>Additionally, in step 3, the endpoint (<code>dynamodb.us-east-1.api.aws</code>) would be updated to a valid name. Everything except debug code that looks at <code>rollback.dds.aws</code> would work properly had the enactor continued running. On the <em>next</em> update, literally everything - even <code>rollback.ddb.aws</code> - would be back to normal. It would then point to <code>plan-145.ddb.aws</code>, which remains valid and will exist for some time before being cleaned up.</p><p>So to me, we have not yet hit the root cause! What is it? Something in the way Amazon wrote the enactor code is the <em>actual</em> root cause. I want to know what it is.</p><p>To underscore why I think this is important: taking the explanations at face value, DynamoDB could have been taken down in exactly the same way - causing the same catastrophic outage - simply by <em>manually</em> deleting the target DNS record of a DynamoDB endpoint. According to the available explanation, just that action alone would cause all enactors to cease functioning, and the endpoint would remain an unresolvable name forever.</p><p>So it&#8217;s hard to call any of the &#8220;setup&#8221; the root cause, because none of it is <em>actually required</em> for the exact same outage. An accidental manual deletion of an endpoint&#8217;s target - even just once - would bring the entire system down, and it would be unrecoverable without operator intervention.</p><p>Although the rare, emergent appearance of the &#8220;inconsistent state&#8221; is something that you would want to fix as well, by itself it wouldn&#8217;t have caused AWS to go down catastrophically. At worst it sounds like it would have been a momentary outage. If the enactors weren&#8217;t halted by the inconsistent state, one of them would shortly enact a new DNS plan, and things would be back to normal.</p><p>In closing, I should also mention that my interest in this is more than idle curiosity. A lot of programming paradigms today rely on architectural patterns I consider dangerous for mission-critical systems. As described in the RCA and presentation, this bug sounds like one that wasn&#8217;t really <em>caused</em> by a latent race condition as claimed - it was merely <em>exposed</em> by it. Given the disclosures so far, it sounds far more likely that this bug was <em>actually</em> caused by a bad programming practice in a piece of practical code that communicated with Route53 to change DNS entries.</p><p>So don&#8217;t leave me hanging, DynamoDB! Tell me what the actual code looked like that took down the internet last October. I want to know how something as basic as exchanging a DNS record was written in such a way that it could permanently halt not one but <em>three</em> different concurrent processes on a case as simple as an unresolvable prior record value.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>The presentation did not elaborate on what aspect of DNS &#8220;enacting&#8221;, specifically, the serialization makes easier to reason about.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Dead Code Elimination Prevention Macros]]></title><description><![CDATA[Watch now (26 mins) | This is the eighth video in Part 5 of the Performance-Aware Programming series.]]></description><link>https://www.computerenhance.com/p/dead-code-elimination-prevention</link><guid isPermaLink="false">https://www.computerenhance.com/p/dead-code-elimination-prevention</guid><pubDate>Mon, 29 Dec 2025 17:03:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!s3T5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s3T5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s3T5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg 424w, https://substackcdn.com/image/fetch/$s_!s3T5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg 848w, https://substackcdn.com/image/fetch/$s_!s3T5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!s3T5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s3T5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg" width="1456" height="572" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:572,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:989517,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.computerenhance.com/i/182383215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!s3T5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg 424w, https://substackcdn.com/image/fetch/$s_!s3T5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg 848w, https://substackcdn.com/image/fetch/$s_!s3T5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!s3T5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaddecc-49f3-4dd3-98d5-816573e1352d_1920x754.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>This is the eighth video in Part 5 of the Performance-Aware Programming series. Please see the <a href="https://www.computerenhance.com/p/table-of-contents">Table of Contents</a> to quickly navigate through the rest of the course as it is updated, and <a href="https://github.com/cmuratori/computer_enhance">the code repository</a> for downloadable code listings.</em></p>
      <p>
          <a href="https://www.computerenhance.com/p/dead-code-elimination-prevention">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Q&A #81 (2025-12-22)]]></title><description><![CDATA[Answers to questions from the last Q&A thread.]]></description><link>https://www.computerenhance.com/p/q-and-a-81-2025-12-22</link><guid isPermaLink="false">https://www.computerenhance.com/p/q-and-a-81-2025-12-22</guid><pubDate>Tue, 23 Dec 2025 00:10:14 GMT</pubDate><enclosure url="https://substack-video.s3.amazonaws.com/video_upload/post/182146727/3e1b2055-4dc9-4e9e-b1a5-55add88adf7f/transcoded-119548.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>In each Q&amp;A video, I answer questions from the comments on the previous Q&amp;A video, which can be from any part of the course.</em></p><p>The questions addressed in this video are:</p><ul><li><p><strong>[00:04]</strong> &#8220;What are your top 5 recommendations for must have projects or applications to build at least once in your life to make you a better programmer ?&#8221;</p></li><li><p><strong>[14:32]</strong> &#8220;My question is regarding your previous comment on stack below, where you mentioned that we don't want to do a lot with the stack for performance oriented code. Before this course, I had impression that I should prefer stack allocation to heap allocation (maybe just C++) because I read/watched somewhere saying that 1) stack allocation/dealloc is faster (just move the stack pointer) than heap allocation 2) stack object has more obvious lifetime, 3) stack has no fragmentation concern which improves locality 4) you call on stack object directly while heap object involves indirection.</p><p>I wonder whether my understanding above is correct or not. If not, does that mean I can prefer using heap over stack allocation most of the time? Could you please further comment? Thanks!&#8221;</p></li><li><p><strong>[32:48]</strong> &#8220;One idea is to avoid dynamic allocation in the critical path by pushing each measurement into a dedicated logging/profiler thread through a channel. The worker thread would record measurements while the computation threads only perform the minimal &#8216;send&#8217; operation. But atomic operations, queues, and cross-thread communication can also add overhead, but also distort the original program execution &#8230; I&#8217;d like advice on how to judge whether this dedicated-thread idea is sound, and in general how to think about designing a low-overhead profiler.&#8221;</p></li><li><p><strong>[44:20]</strong> &#8220;What is your opinion on using callbacks for say signal handling? They often seem necessary but I may be overusing them, which leads me to believe my overall architecture could be flawed. But generally speaking, what&#8217;s your view on callbacks? Love them or hate them? Do you try to avoid them?&#8221;</p></li></ul>
      <p>
          <a href="https://www.computerenhance.com/p/q-and-a-81-2025-12-22">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Our Nemesis Returns]]></title><description><![CDATA[To avoid spoiling the surprise for people who have not yet done the homework, I cannot be any more specific in the title.]]></description><link>https://www.computerenhance.com/p/our-nemesis-returns</link><guid isPermaLink="false">https://www.computerenhance.com/p/our-nemesis-returns</guid><pubDate>Mon, 03 Nov 2025 23:19:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yaoM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yaoM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yaoM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yaoM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yaoM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yaoM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yaoM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg" width="1456" height="826" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:826,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:420478,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.computerenhance.com/i/177937774?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yaoM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yaoM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yaoM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yaoM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd957f3c7-f9b3-44ab-85cf-52e2fda1e1ff_1920x1089.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>This is the seventh video in Part 5 of the Performance-Aware Programming series. Please see the <a href="https://www.computerenhance.com/p/table-of-contents">Table of Contents</a> to quickly navigate through the rest of the course as it is updated, and <a href="https://github.com/cmuratori/computer_enhance">the code repository</a> for downloadable code listings.</em></p>
      <p>
          <a href="https://www.computerenhance.com/p/our-nemesis-returns">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Q&A #80 (2025-10-31)]]></title><description><![CDATA[Answers to questions from the last Q&A thread.]]></description><link>https://www.computerenhance.com/p/q-and-a-80-2025-10-31</link><guid isPermaLink="false">https://www.computerenhance.com/p/q-and-a-80-2025-10-31</guid><pubDate>Sat, 01 Nov 2025 03:18:21 GMT</pubDate><enclosure url="https://substack-video.s3.amazonaws.com/video_upload/post/177680510/727f848b-cbfd-4080-bd9e-2556b1252cc8/transcoded-62883.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>In each Q&amp;A video, I answer questions from the comments on the previous Q&amp;A video, which can be from any part of the course.</em></p><p>The questions addressed in this video are:</p><ul><li><p><strong>[00:05]</strong> &#8220;Question regarding the &#8216;fat struct&#8217; approach: do you ever find yourself thinking about excess memory consumption caused by some entities having unused fields?&#8221;</p></li><li><p><strong>[04:29]</strong> &#8220;About fat structs, you said we would initialize the struct to be able to be A or B depending on the situation, if you imagine that fat struct to be of type Result with cases Success or Error, how would you be able to initialize the Error in the case you have a Success as there was no Error, and vice-versa. This type for example exists in F# and it makes sense to initialize Success only or Error only.&#8221;</p></li><li><p><strong>[07:40]</strong> &#8220;Do you have any suggestions for an off the shelf tool to measure bandwidth and flops for a machine your run it on?&#8221;</p></li><li><p><strong>[13:10]</strong> &#8220;I sense a recurring theme of reliability and predictability &#8211; preferring simple control flow to early returns, preferring simple compilers to strict aliasing, preferring large blocks of memory to pointer festivals, etc. You&#8217;ve also spoken about improving _robustness_ by preferring zero/dummy values that just flow through code to null pointers, and preferring handles to pointers (from the iCloud example we just saw).</p><p>What do you mean with &#8220;robustness&#8221;, and what other techniques can I use to make my code more robust in this way?&#8221;</p></li><li><p><strong>[18:00]</strong> &#8220;Do you have any thoughts on Apple&#8217;s approach to SIMD?&#8221;</p></li><li><p><strong>[20:10]</strong> &#8220;Hi Casey, on the recent podcast with Marco you said that if you could choose a single piece of software to be magically redesigned it would definitely be the browser because the software platform it defines is bad. Could you please elaborate on that? What are the main problems with today&#8217;s browsers from your perspective?&#8221;</p></li><li><p><strong>[22:30]</strong> &#8220;I&#8217;m a bit confused when analyzing the bandwidth I get when reading directly from the volume (using ReadFile with the path &#8216;\.\C:&#8217; with an offset, for example). As far as I know, that&#8217;s the correct way to read system files like the $MFT (which I can currently read properly, by the way).</p><p>When reading 20 GB of contiguous data from the beginning of the volume, I get 2.6 GB/s, and it doesn&#8217;t matter whether I use the FILE_FLAG_NO_BUFFERING flag or not&#8212;the result is the same. I&#8217;d expect something closer to a non-cached read (4.9 GB/s), but I&#8217;m getting the same throughput as a cold cached read. I&#8217;m not sure where this penalty comes from (assuming the read isn&#8217;t triggering extra cache operations since it&#8217;s non-buffered).</p><p>Any idea what might be going on here? Do you think these read bandwidths make sense?&#8221;</p></li><li><p><strong>[25:46]</strong> &#8220;Will we be able to reuse the coefficients we&#8217;re currently using for f64 sine for f32 sine or will we need new ones?&#8221;</p></li><li><p><strong>[28:24]</strong> &#8220;I have a question about PC hardware components. I&#8217;m not clear on things like the motherboard and chipset. Do they play any role in performance? They vary a lot in price even with similar features, so I assume some aspects must affect overall system performance. Could you give a brief overview of these system parts, if possible?</p><p>Or, to rephrase my question: When you&#8217;re building a PC, what do you specifically look at besides just the CPU, RAM, disk and GPU in terms of performance? How do you decide what&#8217;s suitable for your specific builds?&#8221;</p></li><li><p><strong>[36:09]</strong> &#8220;In my code, I ended up having a single loop over the input that directly produced the haversine sum, rather than splitting parsing and math into two loops. But that means if I want to time parsing vs math, I have to put blocks into the loop, which (seemingly) inevitably introduces a lot of overhead.</p><p>Is there a good way to handle this? The best way I can think of is to instead temporarily comment out parts and just time the rest, though while that&#8217;s easy to do with the math part, it seems harder to do for the parsing part, since you still have to somehow produce dummy data for the math while making sure this doesn&#8217;t lead to any compiler optimizations you wouldn&#8217;t otherwise get.&#8221;</p></li><li><p><strong>[39:28]</strong> &#8220;Sorry for repeating the question from the last Q&amp;A, but here is: I have just gotten to it, did it and looked up your solution in QA47 to cross reference. There is one thing that we got differently, and I don&#8217;t quite understand your reasoning about it:</p><p>You said that shl rbx, 0 should be recognized by the frontend as a nop and not do anything with flags, but would produce rbx.</p><p>1) If the frontend sees it as a nop, why would it RAW the value of rbx, and not just be a pure nop?</p><p>2) I actually thought that it would not be recognized as a nop (I didn&#8217;t find anything about this kind of optimization, i presumed it would be somewhere near zero idiom stuff in the manual), and then it seems like shl will have not only a RAW on rbx, but also on all the flags, as it has be ready that the ALU will say that the shift was 0 and the previous value of flags should be preserved (i. e. RAW)</p><p>So the question is, why is it that rbx is a RAW and flags are skipped, and do you know if there is any place in the docs where such a frontend optimization might be mentioned?&#8221;</p></li></ul>
      <p>
          <a href="https://www.computerenhance.com/p/q-and-a-80-2025-10-31">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Better Prevention of Dead Code Elimination - Or Is It?]]></title><description><![CDATA[The most straightforward way of isolating a section of optimized code has a hidden gotcha.]]></description><link>https://www.computerenhance.com/p/better-prevention-of-dead-code-elimination</link><guid isPermaLink="false">https://www.computerenhance.com/p/better-prevention-of-dead-code-elimination</guid><pubDate>Wed, 22 Oct 2025 20:47:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!A3vD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A3vD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A3vD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg 424w, https://substackcdn.com/image/fetch/$s_!A3vD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg 848w, https://substackcdn.com/image/fetch/$s_!A3vD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!A3vD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A3vD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg" width="1456" height="567" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:567,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:385791,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.computerenhance.com/i/176867812?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A3vD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg 424w, https://substackcdn.com/image/fetch/$s_!A3vD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg 848w, https://substackcdn.com/image/fetch/$s_!A3vD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!A3vD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F432ddd68-15ae-4a28-a4ab-dc40c4a96688_2912x1133.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em>This is the sixth video in Part 5 of the Performance-Aware Programming series. Please see the <a href="https://www.computerenhance.com/p/table-of-contents">Table of Contents</a> to quickly navigate through the rest of the course as it is updated, and <a href="https://github.com/cmuratori/computer_enhance">the code repository</a> for downloadable code listings.</em></p>
      <p>
          <a href="https://www.computerenhance.com/p/better-prevention-of-dead-code-elimination">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Q&A #79 (2025-09-28)]]></title><description><![CDATA[Answers to questions from the last Q&A thread.]]></description><link>https://www.computerenhance.com/p/q-and-a-79-2025-09-28</link><guid isPermaLink="false">https://www.computerenhance.com/p/q-and-a-79-2025-09-28</guid><pubDate>Mon, 29 Sep 2025 04:17:35 GMT</pubDate><enclosure url="https://substack-video.s3.amazonaws.com/video_upload/post/174646817/1658adc6-67d6-4d53-a840-0e2a6bff63ab/transcoded-368844.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>In each Q&amp;A video, I answer questions from the comments on the previous Q&amp;A video, which can be from any part of the course.</em></p><p>The questions addressed in this video are:</p><ul><li><p><strong>[00:00:09]</strong> &#8220;How far can we take SIMD use? What if we put a way bigger onus on eliminating branching and developing parallellizable code? The language K, the simdjson library, the Co-dfns compiler, and the new Box2D engine all blast competitors out of the water by thinking of data parallelism. SIMD use is arduous now - should we start designing our languages and APIs around it? What&#8217;s the path to broader cross pollination as an industry? It really seems an untapped potential, right?&#8221;</p></li><li><p><strong>[00:04:01]</strong> &#8220;Could you give examples of the kind of substrate work you&#8217;re hoping more people take seriously? Are you referring to teams like the WSL or Visual Studio performance teams, or something even deeper (or higher-level)? You&#8217;ve cited companies rewriting websites for performance and Microsoft&#8217;s console output claims - are these the kinds of things you mean? And if you mean something different, how do you think someone can get involved in that kind of work? I&#8217;m trying to understand the bigger vision. Is it that everything on the internet runs as fast as the McMaster-Carr Supply Store website?&#8221;</p></li><li><p><strong>[00:07:45]</strong> &#8220;When you critique tools like Git, are you expressing a personal frustration, or do you think there&#8217;s an objectively better way these tools could work? It&#8217;s hard for me to imagine a world where I don&#8217;t need to memorize Git or AWS minutiae - are there products today that represent what you think &#8220;just working&#8221; should look like?&#8221;</p></li><li><p><strong>[00:13:00]</strong> &#8220;What do you think about coroutines?&#8221;</p></li><li><p><strong>[00:15:50]</strong> &#8220;Will a VOD of the &#8216;Research Overview for &#8220;The Big OOPs&#8221;&#8217; livestream be made available later?&#8221;</p></li><li><p><strong>[00:16:10]</strong> &#8220;Do you find that this performance aware development you are talking about also improves the quality of the software in general? Is there any connection? Further, once you decide that something needs to have its own test or tests, what techniques(as in test code organization, handling of test data etc.) and tools you find useful in creating those tests?&#8221;</p></li><li><p><strong>[00:23:18]</strong> &#8220;I&#8217;m currently onboarding at my first ever job. It&#8217;s an giant legacy PHP codebase which primarily uses OOP. I don&#8217;t think OOP is great. But if you were forced to use classes for everything, what would be the best way to do it?&#8221;</p></li><li><p><strong>[00:26:40]</strong> &#8220;It&#8217;s interesting how I get much better performance on Zen3 on Linux, than reference haversine even for the replacement case. &#8221;</p></li><li><p><strong>[00:30:47]</strong> &#8220;I&#8217;ve been watching nearly all the BSC talks, and they&#8217;ve made me realize I might have a wrong understanding of what a type is. What would be the best definition?&#8221;</p></li><li><p><strong>[00:35:19]</strong> &#8220;It seems like there has been a push in recent years towards languages with stronger type systems and static analysis (such as Rust&#8217;s borrow checker). Do you think that this trend meaningfully improves software quality, and if so what static analysis tools (both existing and hypothetical) do you think would be the most beneficial for a performance-minded programmer?&#8221;</p></li><li><p><strong>[00:40:35]</strong> &#8220;I watched a YouTube video about the Montana mini-computer, and I understood how the concept of a function is implemented at the assembly level. I was wondering: what is a virtual function as defined in a high-level language, and how does that translate to a CPU? Along the same lines, I didn&#8217;t fully understand the concept of volatile. It seems to be related to the stack&#8212;could you explain how a volatile variable is represented at the assembly/CPU level?&#8221;</p></li><li><p><strong>[01:04:10]</strong> &#8220;With Intel AMX becoming more mature or widely-known about, do you think it is or will be possible to start doing things typically done on GPUs (texturing, filtering, convolving, etc) on CPUs in the future? Assuming it will be, do you think GPU vendors will finally start opening up a l&#225; the 30 million line problem in a fight to remain competitive with CPU vendors?&#8221;</p></li><li><p><strong>[01:13:00]</strong> &#8220;Unlike games, a lot of the value in the Apple world comes from tight integration with all of their ecosystem and design language (ex: iphone widgets, watch now-playing view, siri searchability, sharing to other apps or airdrop, accessibility integration, etc...) But of course Apple is has a lot of OOP style and &#8220;declarative frameworks,&#8221; which means that I wouldn&#8217;t have control over the code that actually runs these features.</p><p>How can I still use a handmade philosophy of writing my own simpler more focused code rather than depending on lots of slow and volatile libraries?&#8221;</p></li><li><p><strong>[01:15:36]</strong> &#8220;do you have any advice for gracefully avoiding or recovering when Apple helpfully deletes your stuff in the background (kills your process when you switch apps, makes you redownload files from icloud)&#8221;</p></li><li><p><strong>[01:19:21]</strong> &#8220;In your talk at the Better Software Conference you mention the &#8220;fat struct&#8221; as a good default option for programming in a systems level language. I think I know the gist of what you mean by this, but I am curious if you have a slightly more formal definition for the term and a general explanation for why it&#8217;s a good default approach.&#8221;</p></li><li><p><strong>[01:27:32]</strong> &#8220;Most of the course so far talk about programs and assembly for actual chips. How do the aspects of concern under performance aware programming change, if at all, if the target is WASM?&#8221;</p></li><li><p><strong>[01:30:13]</strong> &#8220;I perfectly understand why writing to al in a loop is slower than writing to rax, but I get different results for al, ax, eax and rax. The loop writing to al and ax goes at nearly 1/4 of the loop writing to rax, but the eax loop goes at 1/2 that speed. Shouldn&#8217;t they run the same since writing to eax does not preserve the upper bits?&#8221;</p></li><li><p><strong>[01:31:01]</strong> &#8220;If there&#8217;s really no &#8216;rax&#8217; in a cpu at any given point of time, why (how?) debuggers show a single value what you stop them, or linux will only write a single value in the core dump file? Shouldn&#8217;t there be some kind of a tree? I just don&#8217;t know if I can&#8217;t trust this information for debugging... What if it shows a register value from one branch, but the bug was caused by the value from another, won&#8217;t I be misled?&#8221;</p></li><li><p><strong>[01:40:21]</strong> &#8220;I was trying to reproduce your results from the RAT and register file lecture. I am running them on Alder Lake chip (i7-12700H). My results were quite the opposite to yours the add only loop was either having similar performance or run much faster compared to mov and add one. I found your article that hints that Alder Lake is able to decouple those chained adds.&#8221;</p></li></ul>
      <p>
          <a href="https://www.computerenhance.com/p/q-and-a-79-2025-09-28">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Catch the Tower Stream Live Today]]></title><description><![CDATA[For those interested, I will be appearing on Prime's live stream later today.]]></description><link>https://www.computerenhance.com/p/catch-the-tower-stream-live-today</link><guid isPermaLink="false">https://www.computerenhance.com/p/catch-the-tower-stream-live-today</guid><dc:creator><![CDATA[Casey Muratori]]></dc:creator><pubDate>Tue, 23 Sep 2025 18:57:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HjeV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ea04c0d-d268-4fd2-ab3b-1b001428b05b_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In about two hours, I&#8217;ll be appearing as a guest on ThePrimeagen&#8217;s &#8220;tower stream&#8221; event where he and a rotating cast of streamers are working on a tower defense game. I have no idea <em>what</em> I will be doing exactly, so I'm afraid I can't provide any more details than that!</p><p>If you're interested in checking out the stream, it is already live at <a href="https://twitch.tv/theprimeagen">twitch.tv/theprimeagen</a>. It runs all week, and if I understand correctly, it is somehow 24 hours a day as well! If you're interested in catching the stream while I am on, I should be appearing in the 2PM-6PM range, Pacific Time.</p><p>Hope to see you all on the chat!</p><p>&#8212; Casey</p>]]></content:encoded></item><item><title><![CDATA[New Collaboration with Marco Behler]]></title><description><![CDATA[This one's for all the Java folks out there!]]></description><link>https://www.computerenhance.com/p/new-collaboration-with-marco-behler</link><guid isPermaLink="false">https://www.computerenhance.com/p/new-collaboration-with-marco-behler</guid><dc:creator><![CDATA[Casey Muratori]]></dc:creator><pubDate>Thu, 18 Sep 2025 03:11:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/n-YK3B4_xPA" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As you may have guessed from the venue of my <a href="https://www.youtube.com/watch?v=wo84LFzx5nI">Big OOPs talk</a>, I traveled to Europe over the summer. While in Stockholm, I met with <a href="https://x.com/MarcoBehler">Marco Behler</a> from <a href="https://www.jetbrains.com/">JetBrains</a> for this interview:</p><div id="youtube2-apREl0KmTdQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;apREl0KmTdQ&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/apREl0KmTdQ?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>One of the things Marco mentions during the interview is the <a href="https://github.com/gunnarmorling/1brc">One Billion Row Challenge</a>, a recent popular Java benchmark. It&#8217;s actually quite similar to the Haversine distance problem we use as a recurring example in the <a href="https://www.computerenhance.com/i/99218768/performance-aware-programming-series">Performance Aware Programming series</a>: it involves computing a small number of numerical results from a large amount of data stored in a text file.</p><p>After the interview was over, Marco floated the idea of doing a collaboration based on the One Billion Row Challenge. He would write some Java code to solve the challenge, and I would give advice on how to improve its performance. We&#8217;d do this a few times, and see how far it would get him toward having a competitive solution.</p><p>This sounded like a great idea to me, because not only does it mesh well with what we do here on <em>Computer Enhance</em>, but it would also give me a chance to see first-hand the performance issues that arise when working with Java, a language I don&#8217;t generally work with.</p><p>So we&#8217;re doing it! You can start watching it right now, in fact:</p><div id="youtube2-n-YK3B4_xPA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;n-YK3B4_xPA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/n-YK3B4_xPA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>And if you like it, <a href="https://www.youtube.com/playlist?list=PLIRBoI92yMam5ubzfdzoyLOW51cb3W72F">there&#8217;s a playlist</a> that will have new episodes as they are posted.</p><p>Since there&#8217;s a lot to talk about with anything performance-related, from time to time I may also do some follow-up videos here where I go further into some of the details of the challenge. I don&#8217;t expect I&#8217;ll do any actual Java code - I&#8217;ll leave that to Marco - but there are plenty of things that come up during our discussions that would make for good stand-alone posts here on <em>Computer Enhance</em>.</p><p>So stay tuned for those as well. Until then, happy viewing everyone!</p><p>&#8212; Casey</p>]]></content:encoded></item></channel></rss>