<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://codereport.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://codereport.github.io/" rel="alternate" type="text/html" /><updated>2026-03-05T14:22:01+00:00</updated><id>https://codereport.github.io/feed.xml</id><title type="html">the code report</title><subtitle>A blog about programming languages and more</subtitle><author><name>Conor Hoekstra</name></author><entry><title type="html">NVIDIA GTC 2025 Trip Report</title><link href="https://codereport.github.io/GTC2025TripReport/" rel="alternate" type="text/html" title="NVIDIA GTC 2025 Trip Report" /><published>2025-03-20T00:00:00+00:00</published><updated>2025-03-20T00:00:00+00:00</updated><id>https://codereport.github.io/GTC2025TripReport</id><content type="html" xml:base="https://codereport.github.io/GTC2025TripReport/"><![CDATA[<p>This will be a short “trip report” of the talks I watched over the week of the GTC 2025 (March 18 - 21). All talks are freely available online. You can read previous GTC trip reports here:</p>

<ul>
  <li><a href="https://codereport.github.io/GTC2024TripReport/">2024 GTC trip report</a></li>
  <li><a href="https://codereport.github.io/GTC2023TripReport/">2023 GTC trip report</a></li>
  <li><a href="https://codereport.github.io/GTC2022TripReport/">2022 GTC trip report</a></li>
</ul>

<h3 id="summary">Summary</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Speaker(s)</th>
      <th style="text-align: center">Talk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Huang</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=_waPvOwL9Z8">🌟⭐GTC 2025 Keynote with NVIDIA CEO Jensen Huang <img src="https://user-images.githubusercontent.com/36027403/159814936-5d2289c8-5ac5-4c04-b4b2-22b6f8f4b9a9.png" alt="image" /></a></td>
    </tr>
    <tr>
      <td style="text-align: center">Bhat et al.</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727176757800001qp7T">Accelerated Python: The Community and Ecosystem</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Lelbach</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727452471839001RhBW">⭐ The CUDA C++ Developer’s Toolbox</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Armstrong</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727452240578001KWZG">What’s CUDA All About Anyway? </a></td>
    </tr>
    <tr>
      <td style="text-align: center">Jones</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1726614035480001yvEQ">⭐ CUDA: New Features and Beyond</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Goel et al.</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1728073363553001mzFs">Horizontal Scaling of LLM Training with JAX</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Tillet &amp; Miller</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727899732188001d9Fa">Blackwell Programming for the Masses With OpenAI Triton</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Riehl</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727174376274001QQQl">The CUDA Python Developer’s Toolbox</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Fang</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727175449007001EIKh">⭐ 1,001 Ways to Write CUDA Kernels in Python</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Evtushenko</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727453154835001sGzr">⭐ How You Should Write a CUDA C++ Kernel</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Maynard</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727452901850001PkH4">Build CUDA Software at the Speed of Light</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Cecka &amp; Awatramani</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727748479221001aI91">Programming Blackwell Tensor Cores with CUTLASS</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Sun &amp; Bando</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1738891305735001ygGc">Enable Tensor Core Programming in Python with CUTLASS 4.0</a></td>
    </tr>
  </tbody>
</table>

<p><br /></p>

<table>
  <tbody>
    <tr>
      <td><strong>Legend</strong></td>
      <td>🌟 - Keynote</td>
      <td>⭐ - Best talks</td>
      <td><img src="https://user-images.githubusercontent.com/36027403/159814936-5d2289c8-5ac5-4c04-b4b2-22b6f8f4b9a9.png" alt="image" /> - Available on YouTube</td>
    </tr>
  </tbody>
</table>

<h3 id="highlights-and-thoughts">Highlights and Thoughts</h3>

<h4 id="jensens-keynote">Jensen’s Keynote</h4>

<p>I tweeted this while recording ADSP Episodes 226-228.</p>

<blockquote class="bluesky-embed" data-bluesky-uri="at://did:plc:iyuh5mhvphwyxordfys7nth4/app.bsky.feed.post/3lksx3onrz22q" data-bluesky-cid="bafyreihpofnlan7jkfx3ataphmcknjclngipvodibklzomtfwg5g3a66zq" data-bluesky-embed-color-mode="system"><p lang="en">Jensen vs Bryce<br /><br /><a href="https://bsky.app/profile/did:plc:iyuh5mhvphwyxordfys7nth4/post/3lksx3onrz22q?ref_src=embed">[image or embed]</a></p>&mdash; Conor Hoekstra (<a href="https://bsky.app/profile/did:plc:iyuh5mhvphwyxordfys7nth4?ref_src=embed">@codereport.bsky.social</a>) <a href="https://bsky.app/profile/did:plc:iyuh5mhvphwyxordfys7nth4/post/3lksx3onrz22q?ref_src=embed">March 20, 2025 at 10:50 AM</a></blockquote>
<script async="" src="https://embed.bsky.app/static/embed.js" charset="utf-8"></script>

<p>Here is the standalone slide from Jensen’s deck.</p>

<p><img src="https://github.com/user-attachments/assets/7644e99f-4682-4704-9349-aa55c6f1adc9" alt="image" /></p>

<h4 id="accelerated-python-the-community-and-ecosystem"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727176757800001qp7T">Accelerated Python: The Community and Ecosystem</a></h4>
<h5 id="speakers-anshuman-bhat-jeremy-tanner-andy-terrel">Speakers: Anshuman Bhat, Jeremy Tanner, Andy Terrel</h5>

<p>This talk covers Python initiatives at NVIDIA. Pretty crazy to think that the first decade of GPU Python initiatives all started outside of NVIDIA.</p>

<p><img src="https://github.com/user-attachments/assets/cad15527-748a-4754-84c1-7db6acbad252" alt="Screenshot from 2025-03-19 15-06-45" /></p>

<h4 id="the-cuda-c-developers-toolbox"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727452471839001RhBW">The CUDA C++ Developer’s Toolbox</a></h4>
<h5 id="speaker-bryce-adelstein-lelbach">Speaker: Bryce Adelstein Lelbach</h5>

<p>Screenshots from Bryce’s talk.</p>

<p><img src="https://github.com/user-attachments/assets/5ba83609-c718-4f9f-9a9a-018c0482c23f" alt="image" />
<img src="https://github.com/user-attachments/assets/77faf64c-c628-4940-b74a-60f626f94bfe" alt="Screenshot from 2025-03-20 02-07-19" />
<img src="https://github.com/user-attachments/assets/d523231a-6b03-4171-abb1-a4457791ea15" alt="Screenshot from 2025-03-20 02-08-48" />
<img src="https://github.com/user-attachments/assets/78680651-88a5-42d4-999b-28027e0fe47e" alt="Screenshot from 2025-03-20 02-12-57" />
<img src="https://github.com/user-attachments/assets/699f41a5-3e58-4749-88c1-3bba47ca839b" alt="Screenshot from 2025-03-20 02-22-46" /></p>

<h4 id="whats-cuda-all-about-anyway"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727452240578001KWZG">What’s CUDA All About Anyway?</a></h4>
<h5 id="speaker-rob-armstrong">Speaker: Rob Armstrong</h5>

<p>This image is similar to the 2nd screenshot from Bryce’s talk above. Rob also notes that Stephen has a slide in his talk covering the same thing. So 3 different slides for the same ecosystem (4 if you include Jensen’s slide).</p>

<p><img src="https://github.com/user-attachments/assets/fc05a9a5-4336-4c2e-be0a-4120f81f5d25" alt="image" /></p>

<h4 id="cuda-new-features-and-beyond"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1726614035480001yvEQ">CUDA: New Features and Beyond</a></h4>
<h5 id="speaker-stephen-jones">Speaker: Stephen Jones</h5>

<p>This seems to be the slide that Rob (Armstrong) referred to.</p>

<p><img src="https://github.com/user-attachments/assets/04c3d60b-2121-4373-b4a0-7bcf45c1f4b6" alt="image" /></p>

<p>And a Python version of this graphic:</p>

<p><img src="https://github.com/user-attachments/assets/23fc4e90-5700-4c0d-9cf5-9c7584e5dbba" alt="image" /></p>

<p>And a slightly different graphic for kernel authoring:</p>

<p><img src="https://github.com/user-attachments/assets/dbb39424-7f71-4227-af9f-2a3bc24b38d8" alt="image" /></p>

<h4 id="blackwell-programming-for-the-masses-with-openai-triton"><a href="https://register.nvidia.com/flow/nvidia/gtcs25/vap/page/vsessioncatalog/session/1727899732188001d9Fa">Blackwell Programming for the Masses With OpenAI Triton</a></h4>
<h5 id="speakers-phil-tillet--depaul-miller">Speakers: Phil Tillet &amp; dePaul Miller</h5>

<p>An interesting graphic showing where OpenAI Triton sits between PyTorch and CUDA C++ for authoring kernels.</p>

<p><img src="https://github.com/user-attachments/assets/23a03a78-2111-4020-ba32-9b1c6369f8f6" alt="image" /></p>

<h4 id="how-you-should-write-a-cuda-c-kernel">How You Should Write a CUDA C++ Kernel</h4>
<h5 id="speakers-georgii-evtushenko">Speakers: Georgii Evtushenko</h5>

<p>This is a fantastic talk. Walks you through how to handroll your own <code class="language-plaintext highlighter-rouge">transform</code> kernel using <code class="language-plaintext highlighter-rouge">nvbench</code> while comparing it to speed of light <code class="language-plaintext highlighter-rouge">thrust::transform</code>. A must watch.</p>]]></content><author><name>Conor Hoekstra</name></author><category term="GTC" /><category term="Trip Report" /><summary type="html"><![CDATA[This will be a short “trip report” of the talks I watched over the week of the GTC 2025 (March 18 - 21). All talks are freely available online. You can read previous GTC trip reports here:]]></summary></entry><entry><title type="html">NVIDIA GTC 2024 Trip Report</title><link href="https://codereport.github.io/GTC2024TripReport/" rel="alternate" type="text/html" title="NVIDIA GTC 2024 Trip Report" /><published>2024-03-22T00:00:00+00:00</published><updated>2024-03-22T00:00:00+00:00</updated><id>https://codereport.github.io/GTC2024TripReport</id><content type="html" xml:base="https://codereport.github.io/GTC2024TripReport/"><![CDATA[<p>This will be a short / light weight “trip report” of the talks I watched over the week of the GTC 2024 (March 18 - 22). All talks are freely available online. You can read previous GTC trip reports here:</p>

<ul>
  <li><a href="https://codereport.github.io/GTC2023TripReport/">2023 GTC trip report</a></li>
  <li><a href="https://codereport.github.io/GTC2022TripReport/">2022 GTC trip report</a></li>
</ul>

<h3 id="summary">Summary</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Speaker(s)</th>
      <th style="text-align: center">Talk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Huang  ✅</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=Y2F8yisiS6E">🌟GTC 2024 Keynote with NVIDIA CEO Jensen Huang <img src="https://user-images.githubusercontent.com/36027403/159814936-5d2289c8-5ac5-4c04-b4b2-22b6f8f4b9a9.png" alt="image" /></a></td>
    </tr>
    <tr>
      <td style="text-align: center">Li ✅</td>
      <td style="text-align: center">🔥 <a href="https://register.nvidia.com/flow/nvidia/gtcs24/attendeeportaldigital/page/sessioncatalog/session/1690423197613001jzhz">Fei-Fei Li and Bill Dally¹</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Jones ✅</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs24/attendeeportaldigital/page/sessioncatalog/session/1696033648682001S1DC">CUDA: New Features and Beyond</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Lattner</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs24/attendeeportaldigital/page/sessioncatalog/session/1695673381291001GYwP">Unlocking Developer Productivity across CPU and GPU with Mojo</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Catanzaro ✅</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs24/attendeeportaldigital/page/sessioncatalog/session/1706747368510001RGVh">🔥 David Luan &amp; Bryan Catanzaro²</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Hemstad</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs24/attendeeportaldigital/page/sessioncatalog/session/1695315322330001eIye">Mastering CUDA C++³</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Bastien ✅</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs24/attendeeportaldigital/page/sessioncatalog/session/1696886819345001AqHd">What’s New in JAX</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Shoham ✅</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcs24/attendeeportaldigital/page/sessioncatalog/session/1709084371927001buHn">🔥 Yoav Shoham &amp; Vartika Singh⁴</a></td>
    </tr>
  </tbody>
</table>

<ul>
  <li>1 - The High-Speed Revolution in AI and Managing the Impact on Humanity</li>
  <li>2 - The Future of AI and the Path to AGI</li>
  <li>3 - Mastering CUDA C++: Modern Best Practices with the CUDA C++ Core Libraries</li>
  <li>4 - Going Beyond LLMs, the Future of AI That Understands</li>
</ul>

<p>✅ - I have watched</p>

<p><br /></p>

<table>
  <thead>
    <tr>
      <th style="text-align: center"> </th>
      <th style="text-align: center">Meaning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">🌟</td>
      <td style="text-align: center">Keynote</td>
    </tr>
    <tr>
      <td style="text-align: center">🔥</td>
      <td style="text-align: center">Fireside Chat</td>
    </tr>
    <tr>
      <td style="text-align: center"><img src="https://user-images.githubusercontent.com/36027403/159814936-5d2289c8-5ac5-4c04-b4b2-22b6f8f4b9a9.png" alt="image" /></td>
      <td style="text-align: center">Available on YouTube</td>
    </tr>
  </tbody>
</table>

<h3 id="screenshot-from-whats-new-in-jax">Screenshot from “What’s New in JAX?”</h3>

<p><img src="https://github.com/codereport/jello/assets/36027403/41dbfd97-0148-49e1-882f-691f58ab43fa" alt="image" /></p>]]></content><author><name>Conor Hoekstra</name></author><category term="GTC" /><category term="Trip Report" /><summary type="html"><![CDATA[This will be a short / light weight “trip report” of the talks I watched over the week of the GTC 2024 (March 18 - 22). All talks are freely available online. You can read previous GTC trip reports here:]]></summary></entry><entry><title type="html">NVIDIA GTC 2023 Trip Report</title><link href="https://codereport.github.io/GTC2023TripReport/" rel="alternate" type="text/html" title="NVIDIA GTC 2023 Trip Report" /><published>2023-03-24T00:00:00+00:00</published><updated>2023-03-24T00:00:00+00:00</updated><id>https://codereport.github.io/GTC2023TripReport</id><content type="html" xml:base="https://codereport.github.io/GTC2023TripReport/"><![CDATA[<p>This will be a short “trip report” on the talks I watched over the week of the virtual GTC 2023 (March 20 - 24). All talks are freely available online. You can read <a href="https://codereport.github.io/GTC2022TripReport/">my GTC trip report from 2022 here</a>.</p>

<h3 id="summary">Summary</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Speaker(s)</th>
      <th style="text-align: center">Talk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Huang</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=DiGB5uAYKAg">🌟⭐GTC 2023 Keynote with NVIDIA CEO Jensen Huang <img src="https://user-images.githubusercontent.com/36027403/159814936-5d2289c8-5ac5-4c04-b4b2-22b6f8f4b9a9.png" alt="image" /></a></td>
    </tr>
    <tr>
      <td style="text-align: center">Jones</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcspring2023/attendeeportal/page/sessioncatalog/session/1666205357204001Efly">⭐ How to Write a CUDA Program</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Buck</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcspring2023/attendeeportal/page/sessioncatalog/session/1670537753408001LtOT">Advances in Accelerated Computing for AI &amp; Scientific Computing</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Jones</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcspring2023/attendeeportal/page/sessioncatalog/session/1666224659650001N9mU">⭐ CUDA: New Features and Beyond (2023)</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Huang &amp; Suskever</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcspring2023/attendeeportal/page/sessioncatalog/session/1669748941314001t6Nv">⭐ Fireside Chat with Ilya Sutskever and Jensen Huang: AI Today and Vision of the Future</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Lelbach</td>
      <td style="text-align: center"><a href="https://register.nvidia.com/flow/nvidia/gtcspring2023/attendeeportal/page/sessioncatalog/session/1666644507044001AzeW">C++ Standard Parallelism</a></td>
    </tr>
  </tbody>
</table>

<p><br /></p>

<table>
  <thead>
    <tr>
      <th style="text-align: center"> </th>
      <th style="text-align: center">Meaning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">🌟</td>
      <td style="text-align: center">Keynote</td>
    </tr>
    <tr>
      <td style="text-align: center">⭐</td>
      <td style="text-align: center">Best talks</td>
    </tr>
    <tr>
      <td style="text-align: center"><img src="https://user-images.githubusercontent.com/36027403/159814936-5d2289c8-5ac5-4c04-b4b2-22b6f8f4b9a9.png" alt="image" /></td>
      <td style="text-align: center">Available on YouTube</td>
    </tr>
  </tbody>
</table>

<h3 id="gtc-keynote"><a href="https://www.youtube.com/watch?v=DiGB5uAYKAg">GTC Keynote</a></h3>

<h4 id="speaker-jensen-huang-ceo-of-nvidia">Speaker: Jensen Huang, CEO of NVIDIA</h4>

<p><img src="https://user-images.githubusercontent.com/36027403/226699501-fc6d9377-3aa8-4ec4-a738-83f9582258c3.png" alt="image" /></p>

<h3 id="how-to-write-a-cuda-program"><a href="https://register.nvidia.com/flow/nvidia/gtcspring2023/attendeeportal/page/sessioncatalog/session/1666205357204001Efly">How to Write a CUDA Program</a></h3>

<h4 id="speaker-stephen-jones">Speaker: Stephen Jones</h4>

<p>This was a great talk, especially if you are new to CUDA. It walks you through a building a simple CUDA program in steps:</p>

<ol>
  <li><a href="https://developer.nvidia.com/cuda-downloads">Downloading CUDA and the CUDA toolkit</a></li>
  <li>Writing a “hello world” GPU kernel</li>
  <li>Determining the number of blocks and threads for your kernel (image below)
    <ul>
      <li>When in doubt, use a block size of 256</li>
      <li>Corollary: avoid block sizes smaller than 128 if you can</li>
    </ul>
  </li>
  <li>Using <a href="https://developer.nvidia.com/nsight-systems">NVIDIA Nsight Systems</a> for profiling and analysis</li>
</ol>

<p><img src="https://user-images.githubusercontent.com/36027403/226651965-66fc82fd-d13b-413f-a214-26177aa98d71.png" alt="image" /></p>

<h3 id="-cuda-new-features-and-beyond-2023"><a href="https://register.nvidia.com/flow/nvidia/gtcspring2023/attendeeportal/page/sessioncatalog/session/1666224659650001N9mU">⭐ CUDA: New Features and Beyond (2023)</a></h3>

<h4 id="speaker-stephen-jones-1">Speaker: Stephen Jones</h4>

<p>This is a summary of the latest and greatest things in CUDA and the CUDA ecosystem. Highlights include:</p>

<ul>
  <li>Overview of <a href="https://developer.nvidia.com/cunumeric">cuNumeric</a> and Legate</li>
  <li>Overview of CUTLASS 3.0 and CuTe</li>
  <li>Overview of NVIDIA GPU Computing Tools</li>
</ul>

<p>and much more!</p>

<p><img src="https://user-images.githubusercontent.com/36027403/226760336-25228af5-4374-4eb3-a9c4-17af5f842019.png" alt="image" /></p>

<h3 id="c-standard-parallelism"><a href="https://register.nvidia.com/flow/nvidia/gtcspring2023/attendeeportal/page/sessioncatalog/session/1666644507044001AzeW">C++ Standard Parallelism</a></h3>

<h4 id="speaker-bryce-adelstein-lelbach">Speaker: <a href="https://twitter.com/blelbach">Bryce Adelstein Lelbach</a></h4>

<p>This talk is largely the same as Bryce’s <a href="https://youtu.be/1wFtONGVRI8">GTC 2022 with the same name</a>. However, it has been updated, as shown by the slide below. ⬇️</p>

<p><img src="https://user-images.githubusercontent.com/36027403/228353941-d8663b87-af0c-4a1d-9dfd-c670ceafef2d.png" alt="image" /></p>

<h2 id="hope-to-see-you-next-year">Hope to See You Next Year!</h2>

<p>This was my fourth virtual GTC I have “attended” since joining NVIDIA back in 2019. I’ve got my fingers crossed that in 2024 we will be able to attend in person and I can meet some of you there!</p>]]></content><author><name>Conor Hoekstra</name></author><category term="GTC" /><category term="Trip Report" /><summary type="html"><![CDATA[This will be a short “trip report” on the talks I watched over the week of the virtual GTC 2023 (March 20 - 24). All talks are freely available online. You can read my GTC trip report from 2022 here.]]></summary></entry><entry><title type="html">The B₁ and ϕ₁ Combinators</title><link href="https://codereport.github.io/B1andPhi1/" rel="alternate" type="text/html" title="The B₁ and ϕ₁ Combinators" /><published>2023-02-03T00:00:00+00:00</published><updated>2023-02-03T00:00:00+00:00</updated><id>https://codereport.github.io/B1andPhi1</id><content type="html" xml:base="https://codereport.github.io/B1andPhi1/"><![CDATA[<p>On the most recent episode of <a href="https://www.arraycast.com/">ArrayCast</a>, we interviewed Michael Higginson about his path to the the array languages <a href="https://code.kx.com/q/">Q</a> and <a href="https://www.dyalog.com/dyalog/dyalog-versions/182.htm">APL</a>. He was the most recent winner of the Dyalog APL Contest (in the professional category). During the podcast, he mentioned two beautiful solutions to two of the <a href="https://www.dyalog.com/uploads/files/student_competition/2022_problems_phase1.pdf">Phase 1 problems in the contest</a> that, although never mentioned, were beautiful examples of using combinators.</p>

<div id="buzzsprout-player-18617081"></div>
<script src="https://www.buzzsprout.com/2592851/episodes/18617081-michael-higginson-2022-dyalog-contest-winner.js?container_id=buzzsprout-player-18617081&amp;player=small" type="text/javascript" charset="utf-8"></script>

<h2 id="the-b-combinator">The B₁ Combinator</h2>
<h3 id="problem-2-attack-of-the-mutations">Problem 2: Attack of the Mutations</h3>

<p>This problem asks you to identify the number of different values (compared elementwise) for two equally lengthed strings. In Python, it might look something like this:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">num_different</span><span class="p">(</span><span class="n">s1</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
    <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="n">s2</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">a</span> <span class="o">!=</span> <span class="n">b</span><span class="p">:</span>
            <span class="n">n</span> <span class="o">+=</span> <span class="mi">1</span>
    <span class="k">return</span> <span class="n">n</span>
</code></pre></div></div>
<p><a href="https://godbolt.org/z/6eM3j86ro">⬆️ Run this Code</a></p>

<p>However, if you have watched my <a href="https://www.youtube.com/watch?v=vOgyn1jcKGY">ITM anti-pattern</a> talk or <a href="https://www.youtube.com/watch?v=nXZQfdxWgh0">one of my Python talks</a>, you will know I dislike this kind of Python code. I would prefer something more like this:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">num_different</span><span class="p">(</span><span class="n">s1</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
    <span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="n">a</span> <span class="o">!=</span> <span class="n">b</span> <span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="n">s2</span><span class="p">))</span>
</code></pre></div></div>
<p><a href="https://godbolt.org/z/76rYvT6fs">⬆️ Run this Code</a></p>

<p>If you don’t like implicity converting booleans to integers, you can also do something like:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">num_different</span><span class="p">(</span><span class="n">s1</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">s2</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
    <span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="mi">1</span> <span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="n">s2</span><span class="p">)</span> <span class="k">if</span> <span class="n">a</span> <span class="o">!=</span> <span class="n">b</span><span class="p">)</span>
</code></pre></div></div>
<p><a href="https://godbolt.org/z/rdo9oKx8n">⬆️ Run this Code</a></p>

<p>Or if you C++, you can make use of <code class="language-plaintext highlighter-rouge">transform_reduce</code>:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">auto</span> <span class="nf">num_different</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string_view</span> <span class="n">s1</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string_view</span> <span class="n">s2</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">transform_reduce</span><span class="p">(</span>
        <span class="n">s1</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">s1</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">s2</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="mi">0</span><span class="p">,</span> 
        <span class="n">std</span><span class="o">::</span><span class="n">plus</span><span class="p">{},</span> 
        <span class="n">std</span><span class="o">::</span><span class="n">not_equal_to</span><span class="p">{});</span>
<span class="p">}</span>
</code></pre></div></div>
<p><a href="https://godbolt.org/z/5EoYs1cjY">⬆️ Run this Code</a></p>

<p>Whichever solution you prefer, hopefully the idea behind the problem is clear.</p>

<p>However, in APL, the solution is the following:</p>

<p><img src="https://user-images.githubusercontent.com/36027403/215878368-cc7518d1-6ada-47a3-9c95-1e8f34e153e8.png" alt="image" /></p>

<p>This is an example of a “2-train” in APL. The <code class="language-plaintext highlighter-rouge">+/</code> reads <code class="language-plaintext highlighter-rouge">plus reduce</code>, in other words <code class="language-plaintext highlighter-rouge">sum</code>. The <code class="language-plaintext highlighter-rouge">≠</code> reads (hopefully obviously) <code class="language-plaintext highlighter-rouge">not equal</code>. So together, <code class="language-plaintext highlighter-rouge">+/≠</code> reads <code class="language-plaintext highlighter-rouge">sum not equal</code>, which is a pretty good description of what we are doing. The tricky (and beautiful) part of this solution is what a “2-train” is in APL. In our case where we will be passing 2 arguments to this function (<code class="language-plaintext highlighter-rouge">s1</code> and <code class="language-plaintext highlighter-rouge">s2</code>), it is the <strong>B₁ combinator</strong>. The B₁ combinator has the following evaluation (assuming our two arguments are <code class="language-plaintext highlighter-rouge">s1</code> and <code class="language-plaintext highlighter-rouge">s2</code>):</p>

<p><img src="https://user-images.githubusercontent.com/36027403/215880148-1344b56b-2805-4ec7-87a2-584f3dbfa430.png" alt="image" /></p>

<p>We pass both arguments to the binary function <code class="language-plaintext highlighter-rouge">≠</code> (note that binary functions are always infix in APL). We then take the result of this operation and pass it to the unary function, in our case <code class="language-plaintext highlighter-rouge">+/</code>. Tracing the example of using the two strings <code class="language-plaintext highlighter-rouge">cats</code> and <code class="language-plaintext highlighter-rouge">city</code>, we get:</p>

<p><img src="https://user-images.githubusercontent.com/36027403/215881091-d801c900-f750-451a-bf19-557cd006628e.png" alt="image" /></p>

<p><a href="https://tryapl.org/?clear&amp;q=%27city%27%20(%2B%2F%E2%89%A0)%20%27cats%27&amp;run">⬆️ Run this Code</a></p>

<p>The B₁ combinator is a beautiful thing and is one of my favorite combinators. It was nicknamed the Blackbird by Raymond Smullyan. It implictly exists in the C++ solution. Whenever you use the <code class="language-plaintext highlighter-rouge">std::transform_reduce</code> algorithm, you provide two binary operations. The first will be combined with <code class="language-plaintext highlighter-rouge">std::reduce</code> to form a reduction. The reduction takes place after zipping the two sequences together using the second binary operation. If you squint hard, you can see the relationship between the APL and C++ soluiton.</p>

<p>It might is easier to see relationship between APL and C++ by looking at an in-between language, Haskell (for the Haskell uninitiated, <code class="language-plaintext highlighter-rouge">/=</code> is <code class="language-plaintext highlighter-rouge">not equal</code>)</p>

<div class="language-hs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">import</span> <span class="nn">Data.Composition</span> <span class="p">(</span><span class="o">.:</span><span class="p">)</span> <span class="c1">-- The B₁ Combinator</span>

<span class="n">transformReduce</span> <span class="n">reduceOp</span> <span class="n">zipOp</span> <span class="o">=</span> <span class="n">foldl1</span> <span class="n">reduceOp</span> <span class="o">.:</span> <span class="n">zipWith</span> <span class="n">zipOp</span>
<span class="n">numDiffs</span> <span class="o">=</span> <span class="n">transformReduce</span> <span class="p">(</span><span class="o">+</span><span class="p">)</span> <span class="p">(</span><span class="o">/=</span><span class="p">)</span>

<span class="n">numDiffs</span> <span class="s">"cats"</span> <span class="s">"city"</span> <span class="c1">-- 2</span>
</code></pre></div></div>

<p>Absolutely beautiful. Now, the Haskell expert will know that this doesn’t actually work. That is because <code class="language-plaintext highlighter-rouge">(/=)</code> returns a boolean and you can’t <code class="language-plaintext highlighter-rouge">sum</code> booleans. So the working Haskell solution is actually:</p>

<div class="language-hs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">transformReduce</span> <span class="n">reduceOp</span> <span class="n">zipOp</span> <span class="o">=</span> <span class="n">foldl1</span> <span class="n">reduceOp</span> <span class="o">.:</span> <span class="n">zipWith</span> <span class="n">zipOp</span>
<span class="n">numDiffs</span> <span class="o">=</span> <span class="n">transformReduce</span> <span class="p">(</span><span class="o">+</span><span class="p">)</span> <span class="p">(</span><span class="n">fromEnum</span> <span class="o">.:</span> <span class="p">(</span><span class="o">/=</span><span class="p">))</span>

<span class="n">numDiffs</span> <span class="s">"cats"</span> <span class="s">"city"</span> <span class="c1">-- 2</span>
</code></pre></div></div>
<p><a href="https://godbolt.org/z/7ddrqT75T">⬆️ Run this Code</a></p>

<p>Would you look at that! Another use of the B₁ combinator. We need to convert the boolen to an integer, aka apply <code class="language-plaintext highlighter-rouge">fromEnum</code> (which does that conversion) after applying the <code class="language-plaintext highlighter-rouge">(/=)</code> binary operation, aka - the B₁ Combinator! So amazing!</p>

<p>And just to satisfy the Haskell programmer that is thinking in their head “that function wouldn’t be called <code class="language-plaintext highlighter-rouge">transformReduce</code> in Haskell” and “those argument names are too long” (which I agree), here you are:</p>

<div class="language-hs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">zipFold</span> <span class="n">f</span> <span class="n">g</span> <span class="o">=</span> <span class="n">foldl1</span> <span class="n">f</span> <span class="o">.:</span> <span class="n">zipWith</span> <span class="n">g</span>
<span class="n">numDiffs</span> <span class="o">=</span> <span class="n">zipFold</span> <span class="p">(</span><span class="o">+</span><span class="p">)</span> <span class="p">(</span><span class="n">fromEnum</span> <span class="o">.:</span> <span class="p">(</span><span class="o">/=</span><span class="p">))</span>

<span class="n">numDiffs</span> <span class="s">"cats"</span> <span class="s">"city"</span> <span class="c1">-- 2</span>
</code></pre></div></div>
<p><a href="https://godbolt.org/z/6YhhrEdxE">⬆️ Run this Code</a></p>

<p>I haven’t mentioned this till now, but in APL, they don’t refer to combinators as combinators. If it is function juxtaposition they are called trains, otherwise it is an operator. The two argument 2-train in APL is called <code class="language-plaintext highlighter-rouge">atop</code>, but there is also an <code class="language-plaintext highlighter-rouge">atop</code> operator: <code class="language-plaintext highlighter-rouge">⍤</code>. So the following two are equivalent:</p>

<p><img src="https://user-images.githubusercontent.com/36027403/215885285-52bbc8d3-980d-4cb2-a6d0-27b5b132bd0d.png" alt="image" /></p>

<p>This is also highlighted in my ARRAY 2022 paper <a href="https://web.archive.org/web/20220617020347id_/https://dl.acm.org/doi/pdf/10.1145/3520306.3534504">Combinatory Logic and Combinators in Array Languages</a>. The relevant excerpt from that paper highlights the B₁ Combinator in J and BQN as well, two other array languages.</p>

<p><img src="https://user-images.githubusercontent.com/36027403/215885702-19b7044c-f393-4f58-8de8-a04afd9fe912.png" alt="image" /></p>

<h2 id="the-ϕ-combinator">The ϕ₁ Combinator</h2>
<h3 id="problem-3-uniquely-qualified">Problem 3: Uniquely Qualified</h3>

<p>This problem is: given two lists, what elements only show up in <strong>one</strong> of the lists (not both). A basic solution in Python might look like the following:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">only_in_one_list</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
    <span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">b</span><span class="p">:</span>
            <span class="n">res</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">b</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
            <span class="n">res</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">res</span>
</code></pre></div></div>
<p><a href="https://godbolt.org/z/a6qGq4xKs">⬆️ Run this Code</a></p>

<p>However, this solution once again violates my least favorite anti-pattern, ITM. A better and much more idiomatic Python solution is the following:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">only_in_one_list</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
    <span class="n">both</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">&amp;</span> <span class="nb">set</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
    <span class="k">return</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="k">if</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">both</span><span class="p">]</span>
</code></pre></div></div>
<p><a href="https://godbolt.org/z/bjdPe7jE1">⬆️ Run this Code</a></p>

<p>However, the solution in APL is the following:</p>

<p><img src="https://user-images.githubusercontent.com/36027403/216158473-4d067b52-6c94-4cf5-9480-88f9d976e197.png" alt="image" /></p>

<p>This is an example of a “3-train” in APL. The <code class="language-plaintext highlighter-rouge">∪</code> reads <code class="language-plaintext highlighter-rouge">union</code>, the <code class="language-plaintext highlighter-rouge">~</code> reads <code class="language-plaintext highlighter-rouge">without</code>, and the <code class="language-plaintext highlighter-rouge">∩</code> reads intersection. So together, <code class="language-plaintext highlighter-rouge">∪~∩</code> reads <code class="language-plaintext highlighter-rouge">union without intersection</code>, which once again is a pretty good (if not amazing) description of what we are doing. And once again, the tricky (and beautiful) part of this solution is what a “3-train” is in APL. In our case where we will be passing 2 arguments to this function (<code class="language-plaintext highlighter-rouge">a</code> and <code class="language-plaintext highlighter-rouge">b</code>), it is the <strong>ϕ₁ combinator</strong>. The ϕ₁ combinator has the following evaluation (assuming are two arguments are <code class="language-plaintext highlighter-rouge">a</code> and <code class="language-plaintext highlighter-rouge">b</code>):</p>

<p><img src="https://user-images.githubusercontent.com/36027403/216159468-49ff83c8-a4cc-47b4-89b2-e3a58255fd8a.png" alt="image" /></p>

<p>We pass both arguments to the binary functions <code class="language-plaintext highlighter-rouge">∪</code> and <code class="language-plaintext highlighter-rouge">∩</code>. We then take the results of these operation and pass it to the middle binary function, in our case <code class="language-plaintext highlighter-rouge">~</code>. Tracing the example of using the two lists <code class="language-plaintext highlighter-rouge">1 2 3 4</code> and <code class="language-plaintext highlighter-rouge">3 4 5 6</code>, we get:</p>

<p><img src="https://user-images.githubusercontent.com/36027403/216160267-0448540e-4b7f-41d3-bbc8-8fe9bce711e1.png" alt="image" /></p>

<p><a href="https://tryapl.org/?clear&amp;q=1%202%203%204%20(%E2%88%AA~%E2%88%A9)%203%204%205%206&amp;run">⬆️ Run this Code</a></p>

<p>Although the ϕ combinator was given a nickname by Raymond Smullyan (the Phoenix), the ϕ₁ combinator wasn’t given a nickname … until recently that is. It was nicked the Pheasant in my aforementioned <a href="https://web.archive.org/web/20220617020347id_/https://dl.acm.org/doi/pdf/10.1145/3520306.3534504">paper on combinators in array langauges</a>.</p>

<p>In APL, 3-trains are called “forks.” Spefically, this is a dyadic fork because we are passing it two arguments. The Table 16 is the relevant table from my paper but it isn’t super interesting as every array language (APL, BQN &amp; J) call it the same thing.</p>

<p><img src="https://user-images.githubusercontent.com/36027403/216729874-81ffc2ab-d057-47dd-b3bd-852612a6d47a.png" alt="image" /></p>

<h2 id="what-is-the-point">What is the point?</h2>

<p>As Michael mentions in the ArrayCast podcast:</p>

<blockquote>
  <p>“It is like a line from a haiku…<br />there is something poetic about it…<br />it is very beautiful.”</p>
</blockquote>

<p>This was in reference to the APL 3-train solution to Problem 3. However, it isn’t all about aesthetics.</p>

<p>I assert that combinators provide a greater opportunity for linear <a href="https://wiki.c2.com/?CollectionOrientedProgramming">collection oriented programming</a>, which is my favorite programming paradigm. Furthermore, I assert that in an collection oriented programming libraries such as:</p>

<p><strong>Standard Libraries</strong></p>

<ul>
  <li><a href="https://en.cppreference.com/w/cpp/ranges">C++20’s Ranges</a></li>
  <li><a href="https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html">Java 8 Streams</a></li>
  <li><a href="https://doc.rust-lang.org/std/iter/trait.Iterator.html">Rust <code class="language-plaintext highlighter-rouge">std::iter::Iterator</code></a></li>
</ul>

<p><strong>Third Party Libraries</strong></p>

<ul>
  <li><a href="https://cmuparlay.github.io/parlaylib/">ParlayLib</a> - Parallel Algorithms in C++17</li>
  <li><a href="https://ericniebler.github.io/range-v3/">Range-v3</a> - Ranges library for C++14/17/20</li>
  <li><a href="https://docs.rs/itertools/latest/itertools/">Rust <code class="language-plaintext highlighter-rouge">Itertools</code></a> - Extension to the Rust <code class="language-plaintext highlighter-rouge">Iterator</code> trait</li>
</ul>

<p>combinators can increase the opportunity for stream fusion and potentially index fusion as well. How far you could get with a library versus how far you could get with a compiler and new programming language is a question I hope to answer in the future.</p>

<p>Feel free to leave a comment on the <a href="https://github.com/codereport/codereport.github.io/discussions/1">GitHub discussion</a> or the <a href="https://old.reddit.com/r/functionalprogramming/comments/10tkizk/the_b%E2%82%81_and_%CF%95%E2%82%81_combinators/">Reddit thread</a>.</p>]]></content><author><name>Conor Hoekstra</name></author><category term="APL" /><category term="C++" /><category term="Combinatory Logic" /><category term="Haskell" /><category term="Python" /><summary type="html"><![CDATA[On the most recent episode of ArrayCast, we interviewed Michael Higginson about his path to the the array languages Q and APL. He was the most recent winner of the Dyalog APL Contest (in the professional category). During the podcast, he mentioned two beautiful solutions to two of the Phase 1 problems in the contest that, although never mentioned, were beautiful examples of using combinators.]]></summary></entry><entry><title type="html">GPU Array Languages, Compiler &amp;amp; Libraries</title><link href="https://codereport.github.io/GPUArrayLanguages/" rel="alternate" type="text/html" title="GPU Array Languages, Compiler &amp;amp; Libraries" /><published>2022-10-01T00:00:00+00:00</published><updated>2022-10-01T00:00:00+00:00</updated><id>https://codereport.github.io/GPUArrayLanguages</id><content type="html" xml:base="https://codereport.github.io/GPUArrayLanguages/"><![CDATA[<p><img src="https://user-images.githubusercontent.com/36027403/193055974-8d8008a2-a1e6-4bd4-8ecc-7624fa611f25.png" alt="image" /></p>

<p>On the most recent episode of <a href="https://www.arraycast.com/">ArrayCast</a>, we interviewed <a href="https://sigkill.dk/">Troels Henriksen</a> about <a href="https://futhark-lang.org/">the Futhark Programming Language</a>. From the website, “Futhark is a statically typed, data-parallel, and purely functional array language in the ML family, and comes with a heavily optimising ahead-of-time compiler that presently generates either GPU code via CUDA and OpenCL, or multi-threaded CPU code.”</p>

<div id="buzzsprout-player-18617090"></div>
<script src="https://www.buzzsprout.com/2592851/episodes/18617090-troels-henriksen-and-futhark.js?container_id=buzzsprout-player-18617090&amp;player=small" type="text/javascript" charset="utf-8"></script>

<p>While talking to Troels about accelerating array languages, I asked what other languages and projects operate in the same space. This short blog post is basically highlighting the response we got from Troels.</p>

<ul>
  <li>🇩🇰 <strong><a href="https://futhark-lang.org/">Futhark</a></strong>, a Haskell-inspired language out of DIKU at the University of Copenhagen</li>
  <li>🏴󠁧󠁢󠁳󠁣󠁴󠁿 <strong><a href="https://www.sac-home.org/index">Single Assignment C</a></strong> (SaC), a C-inspired language out of Heriot-Watt University</li>
  <li>🇺🇸 <strong><a href="https://github.com/google-research/dex-lang">Dex</a></strong>, a research array language out of Google</li>
  <li>🇺🇸 <strong><a href="https://github.com/Co-dfns/Co-dfns">Co-dfns</a></strong>, an APL compiler out of Indiana University / Aaron Hsu</li>
  <li>🇦🇺 <strong><a href="https://www.acceleratehs.org/">Accelerate</a></strong>, a Haskell library out of University of New South Wales and NVIDIA</li>
  <li>🇺🇸 <strong><a href="https://github.com/bryancatanzaro/copperhead">Copperhead</a></strong>, a Python-inspired research language/compiler out of NVIDIA</li>
</ul>

<p>On top of this, several other initiatives were mentioned, including:</p>

<ul>
  <li>🇩🇰 <strong><a href="http://hiperfit.dk/pdf/array14_final.pdf">Typed Array Intermediate Language (TAIL)</a></strong>, out of the University of Copenhagen</li>
  <li>🇩🇰 <strong><a href="https://github.com/melsman/apltail">apltail</a></strong>, an APL compiler targeting TAIL, out of the University of Copenhagen</li>
  <li>🇺🇸 <strong><a href="https://www.ccs.neu.edu/home/jrslepak/typed-j.pdf">Remora</a></strong>, a typed array language out of Northeastern University</li>
  <li>🇨🇦 <strong><a href="https://gitlab.com/bernecky/apex">APEX</a></strong>, a Dyalog APL compiler targeting SaC out of Snake Island Research</li>
</ul>

<p>The following people have been or are actively involved in working on the above projects:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center"> </th>
      <th style="text-align: center">Project</th>
      <th style="text-align: center">Individual*</th>
      <th style="text-align: center">Twitter</th>
      <th style="text-align: center">GitHub</th>
      <th style="text-align: center">ArrayCast?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">Futhark</td>
      <td style="text-align: center"><a href="https://sigkill.dk/">Troels Henriksen</a></td>
      <td style="text-align: center"><a href="https://twitter.com/sigkill_dk">Twitter</a></td>
      <td style="text-align: center"><a href="https://github.com/Athas/sigkill.dk">GitHub</a></td>
      <td style="text-align: center"><a href="https://www.arraycast.com/episodes/episode37-futhark">Episode 37</a></td>
    </tr>
    <tr>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">Co-dfns</td>
      <td style="text-align: center"><a href="https://www.sacrideo.us/">Aaron Hsu</a></td>
      <td style="text-align: center">-</td>
      <td style="text-align: center"><a href="https://github.com/arcfide">GitHub</a></td>
      <td style="text-align: center"><a href="https://www.arraycast.com/episodes/episode19-aaron-hsu">Episode 19</a></td>
    </tr>
    <tr>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">APEX</td>
      <td style="text-align: center"><a href="https://www.snakeisland.com/">Bob Bernecky</a></td>
      <td style="text-align: center">-</td>
      <td style="text-align: center"><a href="https://github.com/bernecky">GitHub</a></td>
      <td style="text-align: center"><a href="https://www.arraycast.com/episodes/episode55-bob-bernecky">Episode 55</a></td>
    </tr>
    <tr>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">SaC</td>
      <td style="text-align: center"><a href="https://www.macs.hw.ac.uk/~sbs/homepage/main/Welcome.html">Sven-Bodo Scholz</a></td>
      <td style="text-align: center">-</td>
      <td style="text-align: center"><a href="https://github.com/sbscholz">GitHub</a></td>
      <td style="text-align: center"><a href="https://www.arraycast.com/episodes/episode107-sac">Episode 107</a></td>
    </tr>
    <tr>
      <td style="text-align: center"> </td>
      <td style="text-align: center">SaC</td>
      <td style="text-align: center"><a href="https://ashinkarov.github.io/">Artem Shinkarov</a></td>
      <td style="text-align: center">-</td>
      <td style="text-align: center"><a href="https://github.com/ashinkarov">GitHub</a></td>
      <td style="text-align: center">-</td>
    </tr>
    <tr>
      <td style="text-align: center"> </td>
      <td style="text-align: center">Remora</td>
      <td style="text-align: center"><a href="https://jrslepak.github.io/">Justin Slepak</a></td>
      <td style="text-align: center">-</td>
      <td style="text-align: center"><a href="https://github.com/jrslepak">GitHub</a></td>
      <td style="text-align: center">-</td>
    </tr>
    <tr>
      <td style="text-align: center"> </td>
      <td style="text-align: center">TAIL/apltail</td>
      <td style="text-align: center"><a href="https://elsman.com/">Martin Elsman</a></td>
      <td style="text-align: center">-</td>
      <td style="text-align: center"><a href="https://github.com/melsman">GitHub</a></td>
      <td style="text-align: center">-</td>
    </tr>
    <tr>
      <td style="text-align: center"> </td>
      <td style="text-align: center">Copperhead</td>
      <td style="text-align: center"><a href="https://ctnzr.io/">Bryan Catanzaro</a></td>
      <td style="text-align: center"><a href="https://twitter.com/ctnzr">Twitter</a></td>
      <td style="text-align: center"><a href="https://github.com/bryancatanzaro">GitHub</a></td>
      <td style="text-align: center">-</td>
    </tr>
    <tr>
      <td style="text-align: center"> </td>
      <td style="text-align: center">Accelerate</td>
      <td style="text-align: center"><a href="https://justtesting.org/">Manuel Chakravarty</a></td>
      <td style="text-align: center"><a href="https://twitter.com/TacticalGrace">Twitter</a></td>
      <td style="text-align: center"><a href="https://github.com/mchakravarty">GitHub</a></td>
      <td style="text-align: center">-</td>
    </tr>
    <tr>
      <td style="text-align: center"> </td>
      <td style="text-align: center">Accelerate</td>
      <td style="text-align: center"><a href="https://tmcdonell.github.io/">Trevor McDonell</a></td>
      <td style="text-align: center">-</td>
      <td style="text-align: center"><a href="https://github.com/tmcdonell">GitHub</a></td>
      <td style="text-align: center">-</td>
    </tr>
    <tr>
      <td style="text-align: center">✅</td>
      <td style="text-align: center">Dex/PyTorch</td>
      <td style="text-align: center"><a href="http://apaszke.github.io/">Adam Paszke</a></td>
      <td style="text-align: center"><a href="https://twitter.com/apaszke">Twitter</a></td>
      <td style="text-align: center"><a href="https://github.com/apaszke">GitHub</a></td>
      <td style="text-align: center"><a href="https://www.arraycast.com/episodes/episode58-adam-paszke">Episode 58</a></td>
    </tr>
    <tr>
      <td style="text-align: center"> </td>
      <td style="text-align: center">Dex</td>
      <td style="text-align: center"><a href="https://dougalmaclaurin.com/index.html">Dougal Maclaurin</a></td>
      <td style="text-align: center"><a href="https://twitter.com/dougalmaclaurin">Twitter</a></td>
      <td style="text-align: center"><a href="https://github.com/dougalm">GitHub</a></td>
      <td style="text-align: center">-</td>
    </tr>
  </tbody>
</table>

<p>* Links to personal website</p>

<p>My plan is to try and have as many of the above folks on ArrayCast in the future. I will update this blog post with links whenever one of them appears.</p>

<p>Some honorable mention projects (some that didn’t get mentioned) but are relevant to the space are:</p>

<ul>
  <li><a href="https://github.com/google/jax"><strong>JAX</strong></a>, Autograd and XLA, brought together for high-performance ML research</li>
  <li><a href="https://www.tensorflow.org/xla"><strong>XLA</strong></a>, a domain-specific compiler for linear algebra that targets CPUs, GPUs and TPUs</li>
  <li><a href="https://github.com/pytorch/pytorch"><strong>PyTorch</strong></a>, tensors and dynamic neural networks in Python with strong GPU acceleration</li>
  <li><a href="https://github.com/tensorflow/tensorflow"><strong>TensorFlow</strong></a>, an open source platform for machine learning</li>
  <li><a href="https://github.com/elixir-nx/nx"><strong>Nx</strong></a>, multidimensional arrays (tensors) and numerical definitions for Elixir</li>
  <li><a href="https://mlir.llvm.org/"><strong>MLIR</strong></a>, a hybrid IR for building compiler infrastructure</li>
  <li><a href="http://www.cs.cmu.edu/~scandal/nesl.html"><strong>NESL</strong></a>, a parallel, functional, array programming language designed at CMU</li>
  <li><a href="http://nessie.cs.uchicago.edu/"><strong>Nessie</strong></a>, a NESL compiler the generates CUDA code for NVIDIA GPUs</li>
</ul>

<p>Other links of interest that I came across while compiling all the links for this blog are:</p>

<ul>
  <li><a href="https://futhark-lang.org/blog/2020-12-28-futhark-and-dex.html">A comparison of Futhark and Dex</a></li>
  <li><a href="https://mlochbaum.github.io/BQN/implementation/compile/intro.html">Array language compilation in context</a> specifically the section on <a href="https://mlochbaum.github.io/BQN/implementation/compile/intro.html#typed-array-languages">Typed Array Languages</a></li>
  <li><a href="https://futhark-lang.org/blog/2022-10-03-futhark-on-arraycast.html">Futhark on ArrayCast</a></li>
</ul>

<p>The last link was written a few days after the ArrayCast episode aired. Finally, you can find comparisons of different array languages at my <a href="https://github.com/codereport/array-language-comparisons">Array Language Comparison GitHub repository</a>, which is where the graphic at the top of the article is from.</p>

<p>Feel free to leave a comment on the <a href="https://old.reddit.com/r/programming/comments/xsxetm/gpu_array_languages_compiler_libraries/?">reddit thread</a>.</p>]]></content><author><name>Conor Hoekstra</name></author><category term="Programming Languages" /><category term="Array Languages" /><category term="GPU" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">NVIDIA GTC 2022 Trip Report</title><link href="https://codereport.github.io/GTC2022TripReport/" rel="alternate" type="text/html" title="NVIDIA GTC 2022 Trip Report" /><published>2022-03-28T00:00:00+00:00</published><updated>2022-03-28T00:00:00+00:00</updated><id>https://codereport.github.io/GTC2022TripReport</id><content type="html" xml:base="https://codereport.github.io/GTC2022TripReport/"><![CDATA[<p>This will be a <del>short</del> “trip report” on the talks I watched over the week of the virtual GTC 2022 (March 21 - 24). All talks are freely available online.</p>

<h3 id="summary">Summary</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Speaker(s)</th>
      <th style="text-align: center">Talk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Larkin</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1637347431411001IRfd">⭐ No More Porting: Coding for GPUs with ISO C++, Fortran, and Python</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Jones</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/16372907317160016bDB">⭐ How CUDA Programming Works</a></td>
    </tr>
    <tr>
      <td style="text-align: center">AH &amp; MM</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1639159624485001KeMt">⛔ Deep Dive into GPU-accelerated Big Data and DS Technologies</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Huang</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=39ubNuxnrK8">🌟⭐ GTC 2022 Keynote with NVIDIA CEO Jensen Huang <img src="https://user-images.githubusercontent.com/36027403/159814936-5d2289c8-5ac5-4c04-b4b2-22b6f8f4b9a9.png" alt="image" /></a></td>
    </tr>
    <tr>
      <td style="text-align: center">Costa</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1637338932019001yA05">⭐ A Deep Dive into the Latest HPC Software</a></td>
    </tr>
    <tr>
      <td style="text-align: center">GP &amp; MA</td>
      <td style="text-align: center"><a href="https://www.nvidia.com/gtc/session-catalog/?search=Hopper&amp;tab.scheduledorondemand=1583520458947001NJiE&amp;search=Hopper#/session/1644354440262001BZNv">Inside the NVIDIA Hopper Architecture</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Jones</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1637286764806001dtJj">⭐ CUDA: New Features and Beyond</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Lelbach</td>
      <td style="text-align: center"><a href="https://youtu.be/1wFtONGVRI8">⭐ C++ Standard Parallelism <img src="https://user-images.githubusercontent.com/36027403/159814936-5d2289c8-5ac5-4c04-b4b2-22b6f8f4b9a9.png" alt="image" /></a></td>
    </tr>
    <tr>
      <td style="text-align: center">GT &amp; VM</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/16373134932300012k2M">⛔ Optimizing CUDA Applications for NVIDIA Hopper Architecture</a></td>
    </tr>
    <tr>
      <td style="text-align: center">MC &amp; NG</td>
      <td style="text-align: center"><a href="https://events.rainfocus.com/widget/nvidia/gtcspring2022/sessioncatalog/session/1638833046344001X1tZ">Accelerating PyTorch with Native CUDA Graphs Support</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Enemark</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1639779978640001b7km">⭐ Scaling Web and Visualization Apps with GPUs</a></td>
    </tr>
    <tr>
      <td style="text-align: center">MA, AD, NB</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/16385568434230010NKr">Large-scale Machine Learning with Snowflake and RAPIDS</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Hammond</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1638453336105001vPx8">⭐ Shifting through the Gears of GPU Programming</a></td>
    </tr>
    <tr>
      <td style="text-align: center">CWE</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1638815023541001evyQ">⭐ Standard and CUDA C++ User Forum</a></td>
    </tr>
    <tr>
      <td style="text-align: center">CWE</td>
      <td style="text-align: center"><a href="https://www.nvidia.com/gtc/session-catalog/?search=CWE41948">👋 Thrust, CUB, and libcu++ User Forum</a></td>
    </tr>
    <tr>
      <td style="text-align: center">CWE</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1638579379537001IMpK">NVCC CUDA Compiler Toolchain</a></td>
    </tr>
    <tr>
      <td style="text-align: center">Panel</td>
      <td style="text-align: center"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1638830085320001YWIE">⭐ Future of Standard and CUDA C++</a></td>
    </tr>
  </tbody>
</table>

<p><br /></p>

<table>
  <thead>
    <tr>
      <th style="text-align: center"> </th>
      <th style="text-align: center">Meaning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">🌟</td>
      <td style="text-align: center">Keynote</td>
    </tr>
    <tr>
      <td style="text-align: center">⭐</td>
      <td style="text-align: center">Best talks / CWEs</td>
    </tr>
    <tr>
      <td style="text-align: center">👋</td>
      <td style="text-align: center">I participated in</td>
    </tr>
    <tr>
      <td style="text-align: center">⛔</td>
      <td style="text-align: center">Bad audio / don’t watch</td>
    </tr>
    <tr>
      <td style="text-align: center"><img src="https://user-images.githubusercontent.com/36027403/159814936-5d2289c8-5ac5-4c04-b4b2-22b6f8f4b9a9.png" alt="image" /></td>
      <td style="text-align: center">Available on YouTube</td>
    </tr>
    <tr>
      <td style="text-align: center">CWE</td>
      <td style="text-align: center"><strong>C</strong>onnect <strong>W</strong>ith the <strong>E</strong>xperts (Panel Q&amp;A)</td>
    </tr>
  </tbody>
</table>

<h3 id="-no-more-porting-coding-for-gpus-with-iso-c-fortran-and-python"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1637347431411001IRfd">⭐ No More Porting: Coding for GPUs with ISO C++, Fortran, and Python</a></h3>

<h4 id="speaker-jeff-larkin">Speaker: Jeff Larkin</h4>

<p>This was an awesome talk, one of my favorites of the conference. It shows multiple examples of refactoring code from C++ with OpemMP/OpenACC to Standard C++. The refactoring code is always cleaner, smaller and faster. The talks also gives a couple algorithm tips when refactoring, such as preferring <code class="language-plaintext highlighter-rouge">std::transform_reduce</code> to <code class="language-plaintext highlighter-rouge">std::trasform</code> + <code class="language-plaintext highlighter-rouge">std::reduce</code>.</p>

<p><img src="https://user-images.githubusercontent.com/36027403/159341504-f1072e7c-80e1-4e0e-af53-b238ee920930.png" alt="image" />
<img src="https://user-images.githubusercontent.com/36027403/159341792-b997229c-8473-44df-ad08-bef982303fbf.png" alt="image" />
<img src="https://user-images.githubusercontent.com/36027403/159342041-f62cdc05-e97a-4819-b650-d19f0001395a.png" alt="image" />
<img src="https://user-images.githubusercontent.com/36027403/159342316-3149aa0d-5571-4273-abe9-20197e51edb0.png" alt="image" /></p>

<h3 id="-how-cuda-programming-works"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/16372907317160016bDB">⭐ How CUDA Programming Works</a></h3>

<h4 id="speaker-stephen-jones">Speaker: Stephen Jones</h4>

<p>This was a summary of not just <strong>how</strong> CUDA programming but <strong>why</strong> it works the way it does. If you have ever been curious of what a grid, warp, (thread) block or thread is and how that relates to CUDA programming and writing CUDA kernels, this is the talk for you.</p>

<p><img src="https://user-images.githubusercontent.com/36027403/159525764-aca5bee8-dcc4-41fe-9382-eaf1dd51c09b.png" alt="image" />
<img src="https://user-images.githubusercontent.com/36027403/159525889-05882be5-48ae-426b-b5e8-27b88307f3bc.png" alt="image" /></p>

<h3 id="-standard-and-cuda-c-user-forum"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1638815023541001evyQ">⭐ Standard and CUDA C++ User Forum</a></h3>

<p>If you are interested in either Standard C++ or CUDA C++, this CWE is worth a watch. Some of the “experts” come and go as they split off into separate 1-on-1 rooms, but many of the panelists remain in the main room to answer audience questions.</p>

<h4 id="panelists">Panelists:</h4>

<p><img src="https://user-images.githubusercontent.com/36027403/160424321-e330fb13-7c92-42f7-ba5e-451baa4ab5eb.png" alt="image" /></p>

<h3 id="-gtc-2022-keynote-with-nvidia-ceo-jensen-huang-"><a href="https://www.youtube.com/watch?v=39ubNuxnrK8">🌟⭐ GTC 2022 Keynote with NVIDIA CEO Jensen Huang <img src="https://user-images.githubusercontent.com/36027403/159814936-5d2289c8-5ac5-4c04-b4b2-22b6f8f4b9a9.png" alt="image" /></a></h3>

<h4 id="speaker-jensen-huang-ceo-of-nvidia">Speaker: Jensen Huang, CEO of NVIDIA</h4>

<p>The keynote was awesome (as always). It started out with a “virtual fly through” of NVIDIA HQ in Santa Clara. It looks surreal but that is actually what HQ looks like (minus the robots trapped in the basement). JHH designed it to feel like a futuristic spaceship. I always feel inspired after watching Jensen keynotes. Key announcements:</p>

<ul>
  <li><a href="https://nvidianews.nvidia.com/news/nvidia-announces-hopper-architecture-the-next-generation-of-accelerated-computing?ncid=so-yout-835293&amp;sfdcid=undefined#cid=gtcs22_so-yout_en-us">NVIDIA Announces Hopper Architecture, the Next Generation of Accelerated Computing</a></li>
  <li><a href="https://nvidianews.nvidia.com/news/nvidia-announces-dgx-h100-systems-worlds-most-advanced-enterprise-ai-infrastructure?ncid=so-yout-469678&amp;sfdcid=undefined#cid=gtcs22_so-yout_en-us">NVIDIA Announces DGX H100 Systems – World’s Most Advanced Enterprise AI Infrastructure</a></li>
  <li><a href="https://nvidianews.nvidia.com/news/nvidia-introduces-grace-cpu-superchip?ncid=so-yout-373335&amp;sfdcid=undefined#cid=gtcs22_so-yout_en-us">NVIDIA Introduces Grace CPU Superchip</a></li>
  <li><a href="https://nvidianews.nvidia.com/news/nvidia-introduces-60+-updates-to-cuda-x-libraries-opening-new-science-and-industries-to-accelerated-computing?ncid=so-yout-811963&amp;sfdcid=undefined#cid=gtcs22_so-yout_en-us">NVIDIA Introduces 60+ Updates to CUDA-X Libraries, Opening New Science and Industries to Accelerated Computing</a></li>
  <li><a href="https://nvidianews.nvidia.com/news/nvidia-announces-digital-twin-platform-for-scientific-computing">NVIDIA Announces Digital Twin Platform for Scientific Computing</a></li>
</ul>

<h3 id="-a-deep-dive-into-the-latest-hpc-software"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1637338932019001yA05">⭐ A Deep Dive into the Latest HPC Software</a></h3>

<h4 id="speaker-tim-costa">Speaker: <a href="https://twitter.com/timothybcosta">Tim Costa</a></h4>

<p>This was another great talk. This talk has some overlap with the <a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1637347431411001IRfd">No More Porting</a> talk but most of it is different. The highlight (for me at least) was the example of Maxwell’s equation using <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2300r4.html">Senders and Receivers</a> (a C++ proposal that looks like it will go into C++ early in the C++26 cycle). I am really looking forward to the new paradigm that senders &amp; receivers will unlock for C++.</p>

<p><img src="https://user-images.githubusercontent.com/36027403/159545703-88537eb2-550a-47ec-8fca-df5040dec32b.png" alt="image" />
<img src="https://user-images.githubusercontent.com/36027403/159545413-1b06ed0a-8b9c-43ca-b271-a5009015119b.png" alt="image" /></p>

<h3 id="-cuda-new-features-and-beyond"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1637286764806001dtJj">⭐ CUDA: New Features and Beyond</a></h3>

<h4 id="speaker-stephen-jones-1">Speaker: Stephen Jones</h4>

<p>Another great CUDA talk from Stephen Jones. This talk covers how the architecture changes of Hopper will affect how you program GPUs with CUDA. Specifically, the Hopper architecture introduces the Thread Block Cluster and Cluster Distributed Shared Memory. You can get a high level introduction to it in Stephen’s talk and for a deeper dive, you can check out <a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/16373134932300012k2M">Optimizing CUDA Applications for NVIDIA Hopper Architecture</a> (note: this is one of the talks that has pretty bad audio, so if you are reading this in the future - it might be worth googling to see if the talk has been given again with better audio quality).</p>

<p><img src="https://user-images.githubusercontent.com/36027403/159725085-e4379c63-6e43-4cd4-b380-f29670b0c00b.png" alt="image" />
<img src="https://user-images.githubusercontent.com/36027403/159725235-90eabe64-cc7c-49bf-bfd4-bfddc8d3b643.png" alt="image" /></p>

<h3 id="-c-standard-parallelism"><a href="https://youtu.be/1wFtONGVRI8">⭐ C++ Standard Parallelism</a></h3>

<h4 id="speaker-bryce-adelstein-lelbach">Speaker: <a href="https://twitter.com/blelbach">Bryce Adelstein Lelbach</a></h4>

<p>Bryce always gives great talks and always has some of the nicest slide decks. I have seen different versions of this talk before but there are a few new things in this talk. If you’ve watched Jeff’s <a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1637347431411001IRfd">No More Porting</a> talk or Tim’s <a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1637338932019001yA05">A Deep Dive into the Latest HPC Software</a> you will recognize some of the examples. However, most of the content is totally different and there are tons of awesome modern C++ examples. My favorite example is probably using <code class="language-plaintext highlighter-rouge">std::transform_reduce</code> to get a word count in parallel.</p>

<p>For the sake of transparency, I should state that Bryce and I have a <a href="https://adspthepodcast.com/">podcast</a> together.</p>

<p><img src="https://user-images.githubusercontent.com/36027403/160429832-f5c53750-9dc9-48cf-b982-49900533cbc0.png" alt="image" /></p>

<h3 id="-shifting-through-the-gears-of-gpu-programming"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1638453336105001vPx8">⭐ Shifting through the Gears of GPU Programming</a></h3>

<h4 id="speaker-jeff-hammond">Speaker: <a href="https://twitter.com/science_dot">Jeff Hammond</a></h4>

<p>This might be my favorite talk of the conference as it was the only talk that I tweeted about during the conference. Jeff takes you through a whirlwind history of GPU computing and then compares different models / languages for accelerating your code on GPUs and compares to see which is fastest over three different examples. Definitely worth the watch if you have 30 minutes (or 15 minutes on 2x).</p>

<p><img src="https://user-images.githubusercontent.com/36027403/159998921-b1db31c3-c4b3-41d4-a188-53dd29d666ed.png" alt="image" /></p>

<center>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">One of the highlights of <a href="https://twitter.com/NVIDIAGTC?ref_src=twsrc%5Etfw">@NVIDIAGTC</a> 2022 was <a href="https://twitter.com/science_dot?ref_src=twsrc%5Etfw">@science_dot</a>&#39;s talk comparing CUDA <a href="https://twitter.com/hashtag/Python?src=hash&amp;ref_src=twsrc%5Etfw">#Python</a>, CUDA C++, CUDA <a href="https://twitter.com/hashtag/Fortran?src=hash&amp;ref_src=twsrc%5Etfw">#Fortran</a>, CuPy, Standard C++, OpenMP, OpenACC, and so much more! If you are curious which gets you the most perf, check it out: <a href="https://t.co/pEWaNzEOe4">https://t.co/pEWaNzEOe4</a> <a href="https://twitter.com/hashtag/cpp?src=hash&amp;ref_src=twsrc%5Etfw">#cpp</a> <a href="https://twitter.com/hashtag/cuda?src=hash&amp;ref_src=twsrc%5Etfw">#cuda</a> <a href="https://t.co/TIhvGR8bhE">pic.twitter.com/TIhvGR8bhE</a></p>&mdash; Conor Hoekstra (@code_report) <a href="https://twitter.com/code_report/status/1507099684841693192?ref_src=twsrc%5Etfw">March 24, 2022</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</center>

<h3 id="-future-of-standard-and-cuda-c"><a href="https://reg.rainfocus.com/flow/nvidia/gtcspring2022/aplive/page/ap/session/1638830085320001YWIE">⭐ Future of Standard and CUDA C++</a></h3>

<p>Last but not least, this panel was definitely my favorite panel / CWE of GTC 2022. It doesn’t list her below but <a href="https://twitter.com/The_Whole_Daisy">Daisy Hollman</a> of Google and formerly Sandia National Labs was on the panel as well. It was super interesting to hear the thoughts of both NVIDIAns and non-NVIDIAns about the future of standard C++ and parallel compute. There were some pretty interesting exchanges. I would definitely recommend this talk if you are interested.</p>

<p><img src="https://user-images.githubusercontent.com/36027403/160431115-91af6fcc-e020-4c7e-9f47-ade3ea1846f6.png" alt="image" /></p>

<h2 id="hope-to-see-you-next-year">Hope to See You Next Year!</h2>

<p>This was my third virtual GTC I have “attended” since joining NVIDIA back in 2019. I’ve got my fingers crossed that in 2023 we will be able to attend in person and I can meet some of you there!</p>

<p>Feel free to leave a comment on the <a href="https://old.reddit.com/r/nvidia/comments/tqfm1g/nvidia_gtc_2022_trip_report/?">reddit thread</a>.</p>]]></content><author><name>Conor Hoekstra</name></author><category term="GTC" /><category term="Trip Report" /><summary type="html"><![CDATA[This will be a short “trip report” on the talks I watched over the week of the virtual GTC 2022 (March 21 - 24). All talks are freely available online.]]></summary></entry><entry><title type="html">HOPL IV Trip Report</title><link href="https://codereport.github.io/HOPLIVTripReport/" rel="alternate" type="text/html" title="HOPL IV Trip Report" /><published>2021-09-06T00:00:00+00:00</published><updated>2021-09-06T00:00:00+00:00</updated><id>https://codereport.github.io/HOPLIVTripReport</id><content type="html" xml:base="https://codereport.github.io/HOPLIVTripReport/"><![CDATA[<p>This trip report is a bit delayed, but better late than never. <a href="https://en.wikipedia.org/wiki/History_of_Programming_Languages">HOPL</a> stands for <strong>History of Programming Languages</strong> and is a conference that happens roughly once every 14 years. The past HOPL conferences happened in the following years:</p>

<ul>
  <li><a href="https://en.wikipedia.org/wiki/History_of_Programming_Languages#HOPL_I">1978 - HOPL I (Los Angeles, CA, USA)</a></li>
  <li><a href="https://en.wikipedia.org/wiki/History_of_Programming_Languages#HOPL_II">1993 - HOPL II (Cambride, MA, USA)</a></li>
  <li><a href="https://en.wikipedia.org/wiki/History_of_Programming_Languages#HOPL_III">2007 - HOPL III (San Diego, CA, USA)</a></li>
  <li><a href="https://en.wikipedia.org/wiki/History_of_Programming_Languages#HOPL_IV">2021 - HOPL IV (Online)</a></li>
</ul>

<p>HOPL IV took place from June 20 to 22. HOPL IV was originally supposed to take place in 2020, but due to COVID it was postponed to 2021 and happened virtually.</p>

<h2 id="talks">Talks</h2>

<p>Here is a list of all the talks given and hyperlinks if you would like to watch them.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Language</th>
      <th style="text-align: center">Talk</th>
      <th style="text-align: center">Authors/Speaker</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">APL</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.2.html">APL Since 1978</a></td>
      <td style="text-align: center">Roger Hui, Morten Kromberg</td>
    </tr>
    <tr>
      <td style="text-align: center">C++</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.5.html">Thriving in a crowded and changing world: C++ 2006-2020</a></td>
      <td style="text-align: center">Bjarne Stroustrup</td>
    </tr>
    <tr>
      <td style="text-align: center">Clojure</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.11.html">A History of Clojure</a></td>
      <td style="text-align: center">Rich Hickey</td>
    </tr>
    <tr>
      <td style="text-align: center">Fortran</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.26.html">History of Coarrays and SPMD Parallelism in Fortran</a></td>
      <td style="text-align: center">John Reid et al.</td>
    </tr>
    <tr>
      <td style="text-align: center">D</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.23.html">Origins of the D Programming Language</a></td>
      <td style="text-align: center">Walter Bright et al.</td>
    </tr>
    <tr>
      <td style="text-align: center">Emacs Lisp</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.16.html">Evolution of Emacs Lisp</a></td>
      <td style="text-align: center">Stefan Monnier, Michael Sperber</td>
    </tr>
    <tr>
      <td style="text-align: center">F#</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.19.html">The Early History of F#</a></td>
      <td style="text-align: center">Don Syme</td>
    </tr>
    <tr>
      <td style="text-align: center">Groovy</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.10.html">A history of the Groovy programming language</a></td>
      <td style="text-align: center">Paul King</td>
    </tr>
    <tr>
      <td style="text-align: center">JavaScript</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.12.html">JavaScript: The First 20 Years</a></td>
      <td style="text-align: center">Allen Wirfs-Brock, Brendan Eich</td>
    </tr>
    <tr>
      <td style="text-align: center">LabVIEW</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.3.html">LabVIEW</a></td>
      <td style="text-align: center">Jeff Kodosky</td>
    </tr>
    <tr>
      <td style="text-align: center">Logo</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.9.html">History of Logo</a></td>
      <td style="text-align: center">Cynthia Solomon et al.</td>
    </tr>
    <tr>
      <td style="text-align: center">MATLAB</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.4.html">A History of MATLAB</a></td>
      <td style="text-align: center">Jack Little, Cleve Moler</td>
    </tr>
    <tr>
      <td style="text-align: center">Objective-C</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.25.html">The Origins of Objective-C at PPI/Stepstone and its Evolution at NeXT</a></td>
      <td style="text-align: center">Brad Cox et al.</td>
    </tr>
    <tr>
      <td style="text-align: center">Oz</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.14.html">A history of the Oz multiparadigm language</a></td>
      <td style="text-align: center">Peter Van Roy et al.</td>
    </tr>
    <tr>
      <td style="text-align: center">S/R</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.6.html">S, R and Data Science</a></td>
      <td style="text-align: center">John Chambers</td>
    </tr>
    <tr>
      <td style="text-align: center">Smalltalk</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.17.html">The Evolution of Smalltalk from Smalltalk-72 through Squeak</a></td>
      <td style="text-align: center">Daniel Ingalls</td>
    </tr>
    <tr>
      <td style="text-align: center">SML</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.21.html">The History of Standard ML</a></td>
      <td style="text-align: center">David MacQueen et al.</td>
    </tr>
    <tr>
      <td style="text-align: center">Verilog</td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.7.html">Verilog HDL and its ancestors and descendants</a></td>
      <td style="text-align: center">Peter Flake et al.</td>
    </tr>
    <tr>
      <td style="text-align: center"> </td>
      <td style="text-align: center"><a href="https://www.pldi21.org/prerecorded_hopl.13.html">Hygienic Macro Technology</a></td>
      <td style="text-align: center">William D. Clinger, Mitchell Wand</td>
    </tr>
  </tbody>
</table>

<h2 id="highlights">Highlights</h2>

<p>My top two favorite talks were the histories of <a href="https://www.pldi21.org/prerecorded_hopl.2.html">APL</a> and <a href="https://www.pldi21.org/prerecorded_hopl.11.html">Clojure</a>. They were both great talks but I am also a bit biased because APL is my #1 favorite language and Clojure is my #3 favorite language. The other highlight of the conference were the conversations that took place in between the talks. I spent a lot of time talking with <a href="">Aaron Hsu</a>, author of <a href="https://www.google.com/search?q=co-dfns&amp;oq=co-dfns&amp;aqs=chrome..69i57j69i61.1233j0j7&amp;sourceid=chrome&amp;ie=UTF-8">Co-dfns</a>, a GPU-accelerated APL compiler. At one point, we had a great group conversation with the following folks:</p>

<ul>
  <li>Aaron Hsu, Dyalog, author of <a href="https://www.google.com/search?q=co-dfns&amp;oq=co-dfns&amp;aqs=chrome..69i57j69i61.1233j0j7&amp;sourceid=chrome&amp;ie=UTF-8">Co-dfns</a></li>
  <li><a href="https://twitter.com/sigkill_dk">Troels Henriksen</a>, creator of <a href="https://futhark-lang.org/">Futhark</a></li>
  <li><a href="https://twitter.com/apaszke">Adam Paszke</a>, Google, creator of <a href="https://pytorch.org/">PyTorch</a></li>
  <li>Justin Slepak, Facebook, creator of <a href="https://arxiv.org/abs/1912.13451">Remora</a></li>
</ul>

<center><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Highlight of <a href="https://twitter.com/PLDI?ref_src=twsrc%5Etfw">@PLDI</a> 2021 so far: an awesome conversation with Aaron Hsu (<a href="https://twitter.com/dyalogapl?ref_src=twsrc%5Etfw">@dyalogapl</a> &amp; Co-dfns), Justin Slepak (Remora &amp; <a href="https://twitter.com/hashtag/jlang?src=hash&amp;ref_src=twsrc%5Etfw">#jlang</a>), <a href="https://twitter.com/sigkill_dk?ref_src=twsrc%5Etfw">@sigkill_dk</a> (Futhark) and <a href="https://twitter.com/apaszke?ref_src=twsrc%5Etfw">@apaszke</a> (<a href="https://twitter.com/PyTorch?ref_src=twsrc%5Etfw">@pytorch</a>, JAX &amp; Dex) at ARRAY 2021! (permission for screenshot was approved by all) <a href="https://t.co/aP5HBqiwZB">pic.twitter.com/aP5HBqiwZB</a></p>&mdash; Conor Hoekstra (@code_report) <a href="https://twitter.com/code_report/status/1407062396267544581?ref_src=twsrc%5Etfw">June 21, 2021</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></center>

<p>Several folks asked if the discussion was recorded but sadly it was not. However, there is potential to reconvene the panel at some point or have them on <a href="https://www.arraycast.com/">ArrayCast</a>, a podcast on array languages that I host.</p>

<h2 id="thank-you">Thank You</h2>

<p>Thanks to the volunteers and organizers of the conference. It was great to meet and chat with programming language folks online.</p>

<p>Feel free to leave a comment on the <a href="https://old.reddit.com/r/ProgrammingLanguages/comments/pjes2y/a_brief_hopl_iv_trip_report/?">reddit thread</a>.</p>

<center>Hope to see you in person at a conference 2022!</center>]]></content><author><name>Conor Hoekstra</name></author><category term="HOPL IV" /><category term="Trip Report" /><summary type="html"><![CDATA[This trip report is a bit delayed, but better late than never. HOPL stands for History of Programming Languages and is a conference that happens roughly once every 14 years. The past HOPL conferences happened in the following years:]]></summary></entry><entry><title type="html">🌌 Galaxy Brain Programming Languages 🌌</title><link href="https://codereport.github.io/Galaxy-Brain-Languages/" rel="alternate" type="text/html" title="🌌 Galaxy Brain Programming Languages 🌌" /><published>2021-04-16T00:00:00+00:00</published><updated>2021-04-16T00:00:00+00:00</updated><id>https://codereport.github.io/Galaxy-Brain-Languages</id><content type="html" xml:base="https://codereport.github.io/Galaxy-Brain-Languages/"><![CDATA[<p>One of my favorite tweets is by <a href="https://twitter.com/ben_deane">Ben Deane</a>:</p>

<center><blockquote class="twitter-tweet"><p lang="en" dir="ltr">One of my favorite tweets. <a href="https://t.co/ToHq1coTqb">https://t.co/ToHq1coTqb</a></p>&mdash; Conor Hoekstra (@code_report) <a href="https://twitter.com/code_report/status/1362214546568544256?ref_src=twsrc%5Etfw">February 18, 2021</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></center>

<p>This tweet restates a point that Ben asserts in a blog post of his from 2007 called <a href="http://www.elbeno.com/blog/?p=420">Six Languages Worth Knowing</a>. The blog lists seven (6 + 1 that was added later) programming languages that he considers worth learning. Combining the tweet and the blog results in <strong>eight</strong> programming languages that represent different programming paradigms.</p>

<ol>
  <li><strong>ALGOL:</strong> (1958) The original imperative programming language</li>
  <li><strong>Forth:</strong> (1970) The original stack-based programming language</li>
  <li><strong>Lisp:</strong> (1958) The original Lisp</li>
  <li><strong>Haskell:</strong> (1990) A pure functional language</li>
  <li><strong>Smalltalk:</strong> (1972) The original object-oriented programming language</li>
  <li><strong>Erlang:</strong> (1986) The original actor-based/concurrent programming language</li>
  <li><strong>Prolog:</strong> (1972) The original logic programming language</li>
  <li><strong>APL:</strong> (1966) The original array programming language</li>
</ol>

<p><img src="https://user-images.githubusercontent.com/36027403/114962279-6680b400-9e38-11eb-9e0f-c6636d357f2d.png" alt="image" /></p>

<p>I think these eight programming languages can be considered <strong>Galaxy Brain Programming Languages.</strong></p>

<p>I borrow the term “galaxy brain language” from a fantastic talk by <a href="https://twitter.com/ScottWlaschin">Scott Wlaschin</a>: Four Languages from Forty Years Ago.</p>

<center><iframe width="560" height="315" src="https://www.youtube.com/embed/0fpDlAEQio4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></center>

<p>This talk focuses on four programming languages: SQL, Prolog, ML and Smalltalk. They come from a list of programming languages that get introduced at then beginning of the talk that appeared between 1955 and 1980. Scott argues the following programming languages are all <strong>“galaxy brain”</strong> because they all did something novel at the time.</p>

<ol>
  <li><strong>FORTRAN</strong> (1957) - “first high-level language”</li>
  <li><strong>LISP</strong> (1959) - “the perfect language”</li>
  <li><strong>APL</strong> (1966) - “notation as an aid to thought, won a turing award”</li>
  <li><strong>Simula</strong> 67 (1967) - “first language with classes, inheritance”</li>
  <li><strong>FORTH</strong> (1970) - “first use of concatenative programming, read Thinking Forth”</li>
  <li><strong>Prolog</strong> (1972) - “introduced new paradigm, logic pragramming”</li>
  <li><strong>ML</strong> (1973) - “introduced new paradigm: functional programming”</li>
  <li><strong>SQL</strong> (1974) - “introduced new paradigm: relational databases”</li>
  <li><strong>Smalltalk</strong> (1976) - “interactice IDE, VM, GC, real OO”</li>
</ol>

<p>Note that five (six if you count ML ~ Haskell), show up identically on each list (LISP, APL, Prolog, Forth &amp; Smalltalk).</p>

<h2 id="the-point-of-this-article">The point of this article:</h2>

<blockquote>
  <p>If you are going to learn a second language, learn a programming language from a different paradigm.</p>
</blockquote>

<p>I was motivated to write this article after watching a YouTube video entitled <a href="https://youtu.be/gyZtxZVPfPI">Programming Languages DON’T MATTER</a> where the creator says at one point:</p>

<blockquote>
  <p>I have courses on … C, C++, Python, Java, Ruby, PHP, Dart, JavaScript, all these different languages … teaching these different languages, I’m literally doing the same thing.</p>
</blockquote>

<p>You are “literally doing the same thing” because all of those langauges are from the same family, the ALGOL/C family (it could be argued Ruby is in the Smalltalk family). Learning Python or Java after learning C++ isn’t going to change the way you think about solving problems. However, learning Haskell or APL definitely will. Borrowing a quote that Ben Deane used in his article:</p>

<blockquote>
  <p>A language that doesn’t affect the way you think about programming, is not worth knowing – Alan Perlis.</p>
</blockquote>

<p>So next time you choose to learn a new language - choose one that will teach you a new way to solve problems. And note, there are many “modern” languages in the less familiar paradigms. <a href="https://elixir-lang.org/">Elixir</a> is a modern Erlang (+ Ruby). <a href="https://clojure.org/">Clojure</a> is a modern Lisp. <a href="https://pharo.org/">Pharo</a> is a modern Smalltalk. You can learn a modern language while exploring these different paradigms.</p>

<p><img src="https://user-images.githubusercontent.com/36027403/112069752-c25e6280-8b42-11eb-8d19-6736b15dae20.png" alt="image" /></p>

<p>Feel free to leave a comment on the <a href="https://old.reddit.com/r/programming/comments/ms5n3c/galaxy_brain_programming_languages/?ref=share&amp;ref_source=link">reddit thread</a>.</p>

<p>If you enjoyed this article, feel free to check out the <a href="https://adspthepodcast.com/">Algorithms + Data Structures = Programs Podcast</a> episode on Galaxy Brain Programming Languages.</p>

<div id="buzzsprout-player-8347258"></div>
<script src="https://www.buzzsprout.com/1501960/8347258-episode-21-galaxy-brain-programming-languages.js?container_id=buzzsprout-player-8347258&amp;player=small" type="text/javascript" charset="utf-8"></script>]]></content><author><name>Conor Hoekstra &amp; Ben Deane</name></author><category term="Programming Languages" /><category term="Programming Paradigms" /><summary type="html"><![CDATA[One of my favorite tweets is by Ben Deane:]]></summary></entry><entry><title type="html">Algorithm Selection</title><link href="https://codereport.github.io/Algorithm-Selection/" rel="alternate" type="text/html" title="Algorithm Selection" /><published>2021-03-07T00:00:00+00:00</published><updated>2021-03-07T00:00:00+00:00</updated><id>https://codereport.github.io/Algorithm-Selection</id><content type="html" xml:base="https://codereport.github.io/Algorithm-Selection/"><![CDATA[<p>Yesterday, a contributor to one of my open source projects (<a href="https://twitter.com/sebanisu">Robert</a>) <a href="https://github.com/codereport/An-Algorithm-Library/issues/5">pointed out</a> to me that <code class="language-plaintext highlighter-rouge">std::find_if(f, l, pred) != l</code> is just <code class="language-plaintext highlighter-rouge">std::any_of(f, l, pred)</code>. I totally missed this while refactoring even though it is implicitly covered in my <a href="https://github.com/codereport/Algorithms/blob/master/CheatSheet/The%20STL%20Algorithm%20Cheat%20Sheet%20v0.0.pdf">STL Algorithm Cheatsheet</a>:</p>

<p><img src="https://user-images.githubusercontent.com/36027403/110241938-9d9ea400-7f21-11eb-9be1-45ebf264f539.png" alt="image" /></p>

<p>So thank you Robert for pointing it out! And because of this I decided to write up a short blog about the following:</p>

<blockquote>
  <p>Always choose the most specialized algorithm.</p>
</blockquote>

<p>Below is a diagram that captures the specializations / relationships between <code class="language-plaintext highlighter-rouge">std::find_if</code>, <code class="language-plaintext highlighter-rouge">std::any_of</code> and all of the <code class="language-plaintext highlighter-rouge">std::mismatch</code> algorithms.</p>

<p><img src="https://user-images.githubusercontent.com/36027403/110241992-dc345e80-7f21-11eb-9a63-3dd5993a924b.png" alt="image" /></p>

<p>I assert that you should always choose the most specialized algorithm, aka the algorithm that is furthest from <code class="language-plaintext highlighter-rouge">mismatch</code> <em>that works for your problem</em>. Here are a couple of C++ snippets that show how you can implement these in terms of each other. The implementations also double as examples of code that should just be replaced by the more specialized / better named algorithm.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">auto</span> <span class="nf">adjacent_find</span><span class="p">(</span><span class="k">auto</span> <span class="n">f</span><span class="p">,</span> <span class="k">auto</span> <span class="n">l</span><span class="p">,</span> <span class="k">auto</span> <span class="n">pred</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">mismatch</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">prev</span><span class="p">(</span><span class="n">l</span><span class="p">),</span> <span class="n">std</span><span class="o">::</span><span class="n">next</span><span class="p">(</span><span class="n">f</span><span class="p">),</span> <span class="n">pred</span><span class="p">).</span><span class="n">first</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">auto</span> <span class="n">is_sorted_until</span><span class="p">(</span><span class="k">auto</span> <span class="n">f</span><span class="p">,</span> <span class="k">auto</span> <span class="n">l</span><span class="p">,</span> <span class="k">auto</span> <span class="n">comp</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">less_equal</span><span class="p">{})</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">adjacent_find</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">not_fn</span><span class="p">(</span><span class="n">comp</span><span class="p">));</span>
<span class="p">}</span>

<span class="k">auto</span> <span class="n">is_sorted</span><span class="p">(</span><span class="k">auto</span> <span class="n">f</span><span class="p">,</span> <span class="k">auto</span> <span class="n">l</span><span class="p">,</span> <span class="k">auto</span> <span class="n">comp</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">less_equal</span><span class="p">{})</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">is_sorted_until</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">comp</span><span class="p">)</span> <span class="o">==</span> <span class="n">l</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">auto</span> <span class="n">equal</span><span class="p">(</span><span class="k">auto</span> <span class="n">f</span><span class="p">,</span> <span class="k">auto</span> <span class="n">l</span><span class="p">,</span> <span class="k">auto</span> <span class="n">f2</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">mismatch</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">f2</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">not_equal_to</span><span class="p">{}).</span><span class="n">first</span> <span class="o">==</span> <span class="n">l</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">auto</span> <span class="n">find_if</span><span class="p">(</span><span class="k">auto</span> <span class="n">f</span><span class="p">,</span> <span class="k">auto</span> <span class="n">l</span><span class="p">,</span> <span class="k">auto</span> <span class="n">pred</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">mismatch</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="p">[</span><span class="o">&amp;</span><span class="p">](</span><span class="k">auto</span> <span class="n">a</span><span class="p">,</span> <span class="k">auto</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">pred</span><span class="p">(</span><span class="n">a</span><span class="p">);</span>
    <span class="p">}).</span><span class="n">first</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">auto</span> <span class="n">any_of</span><span class="p">(</span><span class="k">auto</span> <span class="n">f</span><span class="p">,</span> <span class="k">auto</span> <span class="n">l</span><span class="p">,</span> <span class="k">auto</span> <span class="n">pred</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">find_if</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">pred</span><span class="p">)</span> <span class="o">!=</span> <span class="n">l</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">auto</span> <span class="n">find</span><span class="p">(</span><span class="k">auto</span> <span class="n">f</span><span class="p">,</span> <span class="k">auto</span> <span class="n">l</span><span class="p">,</span> <span class="k">auto</span> <span class="n">val</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">find_if</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="p">[</span><span class="o">&amp;</span><span class="p">](</span><span class="k">auto</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">e</span> <span class="o">==</span> <span class="n">val</span><span class="p">;</span> <span class="p">});</span>
<span class="p">}</span>
</code></pre></div></div>
<p><a href="https://www.godbolt.org/z/Ts5ca1">Godbolt link</a></p>

<hr />

<h3 id="update">Update</h3>

<p><a href="https://twitter.com/StephanTLavavej">Stephan T. Lavavej</a> (aka STL, one of the <a href="https://github.com/microsoft/STL/graphs/contributors?from=2019-09-01&amp;to=2021-03-08&amp;type=a">MSVC Standard Library</a> implementers) pointed out that <code class="language-plaintext highlighter-rouge">is_partitioned_until</code> and <code class="language-plaintext highlighter-rouge">is_partitioned</code> could be added to the diagram.</p>

<center><blockquote class="twitter-tweet"><p lang="en" dir="ltr">is_partitioned_until and is_partitioned could be added to the diagram, as they can be thought of as weaker versions of is_sorted.</p>&mdash; Stephan T. Lavavej (@StephanTLavavej) <a href="https://twitter.com/StephanTLavavej/status/1368701581839925251?ref_src=twsrc%5Etfw">March 7, 2021</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></center>

<p>So I updated my diagram. Note that <code class="language-plaintext highlighter-rouge">is_partitioned_until</code> isn’t actually in the C++ Standard Library which is why it is in grey. The code snippets have been provided as well.</p>

<p><img src="https://user-images.githubusercontent.com/36027403/110389223-37557680-8032-11eb-867c-39d8d67b7b1b.png" alt="image" /></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">auto</span> <span class="nf">is_partitioned_until</span><span class="p">(</span><span class="k">auto</span> <span class="n">f</span><span class="p">,</span> <span class="k">auto</span> <span class="n">l</span><span class="p">,</span> <span class="k">auto</span> <span class="n">pred</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">next</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">adjacent_find</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="p">[</span><span class="o">&amp;</span><span class="p">](</span><span class="k">auto</span> <span class="n">a</span><span class="p">,</span> <span class="k">auto</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> 
        <span class="k">return</span> <span class="n">not</span> <span class="n">pred</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="n">and</span> <span class="n">pred</span><span class="p">(</span><span class="n">b</span><span class="p">);</span>
    <span class="p">}));</span>
<span class="p">}</span>

<span class="k">auto</span> <span class="n">is_partitioned</span><span class="p">(</span><span class="k">auto</span> <span class="n">f</span><span class="p">,</span> <span class="k">auto</span> <span class="n">l</span><span class="p">,</span> <span class="k">auto</span> <span class="n">pred</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">is_partitioned_until</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">pred</span><span class="p">)</span> <span class="o">!=</span> <span class="n">l</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p><a href="https://www.godbolt.org/z/YrfbTf">Updated Godbolt</a></p>

<p>Finally, I have received a couple comments on Reddit and Twitter asking “Why?” or stating that I did not provide any reasoning. That was an oversight on my part.</p>

<blockquote>
  <p>The motivation for choosing the most specialized algorithm is that it leads to simpler and more readable code.</p>
</blockquote>

<p>The more specialized algorithms contain more <em>meaning</em> and therefore communicates more information to future readers of the code. For example, <code class="language-plaintext highlighter-rouge">is_sorted</code> is much more meaningful than <code class="language-plaintext highlighter-rouge">adjacent_find</code> with the <code class="language-plaintext highlighter-rouge">greater</code> function object or the <code class="language-plaintext highlighter-rouge">less_equal</code> function object + <code class="language-plaintext highlighter-rouge">not_fn</code>. Furthermore, code using more specialized algorithms is simpler. An example of this is that using many of the specialized algorithms avoids having to write <code class="language-plaintext highlighter-rouge">!= container.end()</code>.</p>

<p>That’s all. Happy coding!</p>

<p>Feel free to leave a comment on the <a href="https://old.reddit.com/r/cpp/comments/lzrqv4/algorithm_selection/">reddit thread</a> or <a href="https://twitter.com/code_report/status/1368569503379042304">tweet</a>.</p>]]></content><author><name>Conor Hoekstra</name></author><category term="Algorithms" /><category term="STL" /><category term="C++" /><summary type="html"><![CDATA[Yesterday, a contributor to one of my open source projects (Robert) pointed out to me that std::find_if(f, l, pred) != l is just std::any_of(f, l, pred). I totally missed this while refactoring even though it is implicitly covered in my STL Algorithm Cheatsheet:]]></summary></entry><entry><title type="html">Meeting C++ 2020 Trip Report</title><link href="https://codereport.github.io/MeetingCpp2020TripReport/" rel="alternate" type="text/html" title="Meeting C++ 2020 Trip Report" /><published>2020-11-14T00:00:00+00:00</published><updated>2020-11-14T00:00:00+00:00</updated><id>https://codereport.github.io/MeetingCpp2020TripReport</id><content type="html" xml:base="https://codereport.github.io/MeetingCpp2020TripReport/"><![CDATA[<p>This was my second time attending <a href="https://twitter.com/CppCon">Meeting C++</a>. The first time I attended was in 2019, when I gave my first Meeting C++ presentation, <a href="https://youtu.be/TSZzvo4htTQ">Better Algorithm Intuition</a>.</p>

<p>This year I gave one full length talk, <strong>C++ Concepts vs Rust Traits vs Haskell Typeclasses vs Swift Protocols</strong>, which covered an introduction to C++ concepts and compared them to similar language features in Rust, Swift, Haskell and D. This broad category of language features is sometimes referred to as “constrained parametric polymorphism.”</p>

<p>I will update this blog with links to the YouTube videos when they become available. You can see a short preview in the tweet below.</p>

<center><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Slideware by <a href="https://twitter.com/code_report?ref_src=twsrc%5Etfw">@code_report</a> <a href="https://twitter.com/hashtag/meetingcpp?src=hash&amp;ref_src=twsrc%5Etfw">#meetingcpp</a> <a href="https://t.co/jpMfo6clh8">pic.twitter.com/jpMfo6clh8</a></p>&mdash; Meeting C++ (@meetingcpp) <a href="https://twitter.com/meetingcpp/status/1326912706125983744?ref_src=twsrc%5Etfw">November 12, 2020</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></center>

<h2 id="diversity-spotlight">Diversity Spotlight</h2>

<p>Since my first <a href="https://codereport.github.io/CppCon2020TripReport/">trip report from CppCon 2020</a>, I have decided to try and highlight diversity in my trip reports. I have decided to focus on the representation of female vs total number of speakers.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Conference</th>
      <th style="text-align: center">F/Total</th>
      <th style="text-align: center">%</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">CppCon 2020</td>
      <td style="text-align: center">6/87</td>
      <td style="text-align: center">6.9%</td>
    </tr>
    <tr>
      <td style="text-align: center">Meeting C++ 2020</td>
      <td style="text-align: center">1/14</td>
      <td style="text-align: center">7.1%</td>
    </tr>
  </tbody>
</table>

<p>The 7.1% is very similar to CppCon. If you include AMAs, it goes up to 2/18, which is <strong>11.1%</strong>. It was great to see such diversity in the keynote talks. It was also great to see the D&amp;I (Diversity &amp; Inclusivity) Panel on the first day. Hoping to see more of these at future conferences.</p>

<h2 id="thoughts-on-remo">Thoughts on Remo</h2>

<p>I have attended (fully in some cases, briefly popped in for others) 7 online virtual conferences this year:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Conference</th>
      <th style="text-align: center">Date</th>
      <th style="text-align: center">Technology Used</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center"><a href="https://www.italiancpp.org/event/itcppcon20/">Italian C++ 2020</a></td>
      <td style="text-align: center">Jun</td>
      <td style="text-align: center">YouTube + Discord</td>
    </tr>
    <tr>
      <td style="text-align: center"><a href="https://conf.researchr.org/home/pldi-2020">PLDI 2020</a></td>
      <td style="text-align: center">Aug</td>
      <td style="text-align: center">Gather</td>
    </tr>
    <tr>
      <td style="text-align: center"><a href="https://cppcon.org/program2020/">CppCon 2020</a></td>
      <td style="text-align: center">Sep</td>
      <td style="text-align: center">Remo</td>
    </tr>
    <tr>
      <td style="text-align: center"><a href="https://con.racket-lang.org/2020/">10th RacketCon</a></td>
      <td style="text-align: center">Oct</td>
      <td style="text-align: center">Gather</td>
    </tr>
    <tr>
      <td style="text-align: center"><a href="https://www.dyalog.com/uploads/conference/dyalog20/Conference%20Programme%202020.pdf">Dyalog 2020</a></td>
      <td style="text-align: center">Nov</td>
      <td style="text-align: center">Zoom</td>
    </tr>
    <tr>
      <td style="text-align: center"><a href="http://meetingcpp.com/2020/">Meeting C++ 2020</a></td>
      <td style="text-align: center">Nov</td>
      <td style="text-align: center">Remo</td>
    </tr>
  </tbody>
</table>

<p>From my experience, two things stand out:</p>

<ul>
  <li>Remo is by far my favorite platform</li>
  <li>Remo tables should be 10+</li>
</ul>

<p>I am not sure what the limit is for table size on Remo - but the size of 6 that Meeting C++ chose I found to be too small. Typically what happened in the Meeting C++ Remo was there was only 1 or 2 tables with conversations happening. If there is only going to be 1 or 2 tables of active conersation, it is better (in my opinion) to have those tables be a bit larger.</p>

<p><img src="https://user-images.githubusercontent.com/36027403/99158131-9109ed80-269d-11eb-9a62-009867e794d0.png" alt="image" /></p>

<h2 id="overall-thoughts">Overall Thoughts</h2>

<p>The virtual Meeting C++ was enjoyable but I definitely missed the in person aspect from the previous year’s meeting. The highlights were:</p>

<ul>
  <li>Jonathan O’Connor’s talk on Templates</li>
  <li>Dawid Zalewski’s talk on Lambdas</li>
  <li>The D&amp;I panel</li>
  <li>All of the keynotes were first time talks :)</li>
  <li>The conversations that I had with folks in between talks</li>
</ul>

<p>If there is one thing I would improve on it would be have more “new” talks. From what I understand, there were a lower number of submissions this year for both CppCon &amp; Meeting C++, so maybe it isn’t possible to avoid the issue of having many repeat talks from CppCon. It is also worth noting (thanks to Jonathan O’Connor for pointing this out) that CFPs for both conferences sometimes overlap, making it difficult to know what talks will be accepted for CppCon. However, it would be nice (especially for a single track conference) if there were more new (aka first time talks). To be clear, I don’t consider talks given at meetups (I presented at <a href="https://www.meetup.com/CPPTORONTO/">C++TO</a> and others at <a href="https://www.meetup.com/MUCplusplus/">MUC++</a>) as “previous” talks, I view these as practice runs. A repeat talk for me is a talk that has been presented previously at another conference. Of the 11 non-keynote talks, I gave one of them and I had already seen 6 of them, which left only 4 new talks + the keynotes. That combined with only a couple tables of active conversation in Remo left me with the feeling that Meeting C++ was sort of living in the shadow of CppCon. I only say this because after C++Now in 2019, Meeting C++ 2019 was probably my favorite conference.</p>

<h2 id="keynotes--talks">Keynotes &amp; Talks</h2>

<h4 id="keynotes">Keynotes</h4>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Day</th>
      <th style="text-align: center">Speaker</th>
      <th style="text-align: center">Talk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">Jonathan Boccara</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=mU_n_ohIHQk">Metapolymorphism</a></td>
    </tr>
    <tr>
      <td style="text-align: center">2</td>
      <td style="text-align: center">Teresa Johnson</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=VAMvr1rXmg8">ThinLTO: Whole Program Optimization</a></td>
    </tr>
    <tr>
      <td style="text-align: center">3</td>
      <td style="text-align: center">Gabriel Dos Reis</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=j4du4LNsLiI">Programming in the Large with C++20</a></td>
    </tr>
  </tbody>
</table>

<h4 id="talks">Talks</h4>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Day</th>
      <th style="text-align: center">Speaker</th>
      <th style="text-align: center">Talk</th>
      <th style="text-align: center">Previous Version</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">Timur Doumler</td>
      <td style="text-align: center">How C++20 changes the <br />way we write code</td>
      <td style="text-align: center"><a href="https://youtu.be/ImLFlLjSveM">CppCon 2020</a></td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">Nicolai Josuttis</td>
      <td style="text-align: center">Hidden Features and <br />Traps of C++ Move Semantics</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=TFMKjL38xAI">CppCon 2020</a><br /> <a href="https://youtu.be/OOLR96-GjsI?t=1633">Italian C++ 2020</a></td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">Conor Hoekstra</td>
      <td style="text-align: center">C++ Concepts vs Rust Traits <br />vs Haskell Typeclasses <br />vs Swift Protocols</td>
      <td style="text-align: center">C++TO</td>
    </tr>
    <tr>
      <td style="text-align: center">2</td>
      <td style="text-align: center">Sy Brand</td>
      <td style="text-align: center">Building an Intuition for Composition</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=AGRWRwi7rD0">CppCon 2020</a></td>
    </tr>
    <tr>
      <td style="text-align: center">2</td>
      <td style="text-align: center">Jonathan O’Connor</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=83fMx7Grxys">Template Shenanigans</a></td>
      <td style="text-align: center">-</td>
    </tr>
    <tr>
      <td style="text-align: center">2</td>
      <td style="text-align: center">Jonathan Müller</td>
      <td style="text-align: center">The Static Initialization Order Fiasco</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=dlTrziwQU-w">MUC++</a></td>
    </tr>
    <tr>
      <td style="text-align: center">2</td>
      <td style="text-align: center">Dawid Zalewski</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=Onv9w6FGwIQ">Lambdas, uses and abuses</a></td>
      <td style="text-align: center">-</td>
    </tr>
    <tr>
      <td style="text-align: center">2</td>
      <td style="text-align: center">Phil Nash</td>
      <td style="text-align: center">OO Considered Harmful</td>
      <td style="text-align: center"><a href="https://youtu.be/pH-q2m5sb04">CppCon 2020</a></td>
    </tr>
    <tr>
      <td style="text-align: center">3</td>
      <td style="text-align: center">Klaus Iglberger</td>
      <td style="text-align: center">Calling Functions: A Tutorial</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=GydNMuyQzWo">CppCon 2020</a><br /><a href="https://www.youtube.com/watch?v=B9RT5sVunmk">MUC++</a></td>
    </tr>
    <tr>
      <td style="text-align: center">3</td>
      <td style="text-align: center">Rainer Grimm</td>
      <td style="text-align: center">40 Years Of Evolution <br />from Functions to Coroutines</td>
      <td style="text-align: center"><a href="https://youtu.be/jd6P9X8l2bY">CppCon 2020</a></td>
    </tr>
    <tr>
      <td style="text-align: center">3</td>
      <td style="text-align: center">Marc Mutz</td>
      <td style="text-align: center">Partially-Formed Objects <br />For Fun And Profit</td>
      <td style="text-align: center">-</td>
    </tr>
  </tbody>
</table>

<h4 id="amas--panels">AMAs &amp; Panels</h4>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Day</th>
      <th style="text-align: center">Speaker</th>
      <th style="text-align: center">AMA/Panel</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">Jason Turner &amp; Rob Irving</td>
      <td style="text-align: center">AMA</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">D&amp;I</td>
      <td style="text-align: center"><a href="https://www.youtube.com/watch?v=5Typh0bp2SY">Panel</a></td>
    </tr>
    <tr>
      <td style="text-align: center">2</td>
      <td style="text-align: center">Hana Dusíková</td>
      <td style="text-align: center">AMA</td>
    </tr>
    <tr>
      <td style="text-align: center">3</td>
      <td style="text-align: center">Bjarne Stroustrup</td>
      <td style="text-align: center">AMA</td>
    </tr>
    <tr>
      <td style="text-align: center">3</td>
      <td style="text-align: center">Nicolai Josuttis</td>
      <td style="text-align: center">AMA</td>
    </tr>
  </tbody>
</table>

<h2 id="top-2-talks">Top 2 Talks</h2>

<p>For my favorite talks, I chose from talks that I hadn’t already seen at a previous conference.</p>

<h4 id="1-template-shenanigans-testing-debugging-and-benchmarking-template-code">#1: Template Shenanigans: Testing, debugging and benchmarking template code</h4>

<p><strong>Speaker:</strong> <a href="https://twitter.com/ninkibah">Jonathan O’Connor</a><br />
<strong>Link:</strong> <a href="https://www.youtube.com/watch?v=83fMx7Grxys">Watch Here</a> <br /></p>

<p>Alpacas! Sy Brand may have kittens, but Jonathan O’Connor has alpacas (and pointed out that I do not - at least for now). Alpacas aside, this talk was a distillation of resources for development and debugging tools for metaprogramming in C++. This is a subset of tools/techniques covered (there were many more):</p>

<ul>
  <li><a href="https://twitter.com/supahvee1234">Vittorio Romeo</a>’s <a href="https://github.com/SuperV1234/camomilla">Camomilla</a> (which Vittorio gave a <a href="https://www.youtube.com/watch?v=3dUZn3eloWE">lightning talk on at CppCon 2019</a>)</li>
  <li>An interactive template metaprogramming shell: <a href="http://metashell.org/">Metashall</a></li>
  <li>A gui for Metashell: <a href="https://github.com/RangelReale/msgui">MSGUI</a></li>
  <li><a href="https://twitter.com/LouisDionne">Louis Dionne</a>’s compile time framework for microprofiling: <a href="https://github.com/ldionne/metabench">metabench</a></li>
</ul>

<center><blockquote class="twitter-tweet"><p lang="en" dir="ltr">This was in response to <a href="https://twitter.com/ninkibah?ref_src=twsrc%5Etfw">@ninkibah</a> saying &quot;Conor Hoekstra ... doesn&#39;t have alpacas!&quot; 🦙🦙🦙 <a href="https://twitter.com/meetingcpp?ref_src=twsrc%5Etfw">@meetingcpp</a> <a href="https://t.co/zJ18hgyG1N">https://t.co/zJ18hgyG1N</a> <a href="https://t.co/ML8Pc7ZYn6">pic.twitter.com/ML8Pc7ZYn6</a></p>&mdash; Conor Hoekstra (@code_report) <a href="https://twitter.com/code_report/status/1327236748032815105?ref_src=twsrc%5Etfw">November 13, 2020</a></blockquote> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></center>

<h4 id="2-lambdas-uses-and-abuses">#2: Lambdas, uses and abuses</h4>

<p><strong>Speaker:</strong> Dawid Zalewski<br />
<strong>Link:</strong> <a href="https://www.youtube.com/watch?v=Onv9w6FGwIQ">Watch Here</a> <br /></p>

<p>This was a continuation of Dawid’s talk from Meeting C++2019, “Lambdas - the old, the new and the tricky” (which doesn’t seem to be online yet). It quickly went from the basics and worked it’s way up to implement the Y-Combinator using lambdas. A great talk that everyone should check out (as well as his 2019 talk when it goes online).</p>

<h2 id="thank-you">Thank You</h2>

<p>Thanks to the volunteers and organizers of the conference. It was great to meet and chat with C++ folks online.</p>

<p>Feel free to leave a comment on the <a href="https://old.reddit.com/r/cpp/comments/juald6/meeting_c_2020_trip_report/">reddit thread</a>.</p>

<center>Hope to see you in person at a C++ conference in 2021 or 2022!</center>]]></content><author><name>Conor Hoekstra</name></author><category term="C++" /><category term="Meeting C++" /><category term="Trip Report" /><summary type="html"><![CDATA[This was my second time attending Meeting C++. The first time I attended was in 2019, when I gave my first Meeting C++ presentation, Better Algorithm Intuition.]]></summary></entry></feed>