<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Machine-Learning on Suriya's site</title><link>https://suriya.cc/tags/Machine-Learning/</link><description>Recent content in Machine-Learning on Suriya's site</description><generator>Hugo</generator><language>en</language><copyright>This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.</copyright><item><title>Cambrian Era of Models</title><link>https://suriya.cc/essays/cambrian-era/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://suriya.cc/essays/cambrian-era/</guid><description>&lt;p>about 540 million years ago, life on earth went from a handful of simple body plans to almost every major animal phylum we have today. once the foundations needed were aligned, more oxygen in the water, new genetic toolkits, eyes, and predators. once the environment could support it, evolution stopped being slow and became combinatorial.&lt;/p></description></item><item><title>RL, in pictures and videos</title><link>https://suriya.cc/tech/ML/rl_in_pictures/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/rl_in_pictures/</guid><description>&lt;h2 id="drone-trained-by-rl-beat-the-worlds-best-human-pilots-2023">drone trained by RL beat the world&amp;rsquo;s best human pilots (2023)&lt;/h2>
&lt;p>UZH, 2023. Trained in simulation. Onboard camera only. Beat three FPV world champions on a real track.&lt;/p></description></item><item><title>1d convolution</title><link>https://suriya.cc/tech/algos/cuda/06_1d_convolution/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/06_1d_convolution/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">convolution_1d_kernel&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> kernel, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> input_size, &lt;span style="color:#66d9ef">int&lt;/span> kernel_size) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> blockDim.x &lt;span style="color:#f92672">*&lt;/span> blockIdx.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> output_size &lt;span style="color:#f92672">=&lt;/span> input_size &lt;span style="color:#f92672">-&lt;/span> kernel_size &lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (i &lt;span style="color:#f92672">&amp;lt;&lt;/span> output_size ) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">float&lt;/span> sum &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0.0f&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> ( &lt;span style="color:#66d9ef">int&lt;/span> j &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>; j&lt;span style="color:#f92672">&amp;lt;&lt;/span>kernel_size; j&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sum &lt;span style="color:#f92672">+=&lt;/span> input[i&lt;span style="color:#f92672">+&lt;/span>j]&lt;span style="color:#f92672">*&lt;/span>kernel[j];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> output[i] &lt;span style="color:#f92672">=&lt;/span> sum;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// input, kernel, output are device pointers (i.e. pointers to memory on the GPU)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> kernel, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> input_size, &lt;span style="color:#66d9ef">int&lt;/span> kernel_size) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> output_size &lt;span style="color:#f92672">=&lt;/span> input_size &lt;span style="color:#f92672">-&lt;/span> kernel_size &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> threadsPerBlock &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">256&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> blocksPerGrid &lt;span style="color:#f92672">=&lt;/span> (output_size &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> convolution_1d_kernel&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(input, kernel, output, input_size, kernel_size);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>color inversion</title><link>https://suriya.cc/tech/algos/cuda/04_color_inversion/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/04_color_inversion/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">invert_kernel&lt;/span>(&lt;span style="color:#66d9ef">unsigned&lt;/span> &lt;span style="color:#66d9ef">char&lt;/span>&lt;span style="color:#f92672">*&lt;/span> image, &lt;span style="color:#66d9ef">int&lt;/span> width, &lt;span style="color:#66d9ef">int&lt;/span> height) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> blockIdx.x &lt;span style="color:#f92672">*&lt;/span> blockDim.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> image[i&lt;span style="color:#f92672">*&lt;/span>&lt;span style="color:#ae81ff">4&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">255&lt;/span> &lt;span style="color:#f92672">-&lt;/span> image[i&lt;span style="color:#f92672">*&lt;/span>&lt;span style="color:#ae81ff">4&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> image[i&lt;span style="color:#f92672">*&lt;/span>&lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">255&lt;/span> &lt;span style="color:#f92672">-&lt;/span> image[i&lt;span style="color:#f92672">*&lt;/span>&lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> image[i&lt;span style="color:#f92672">*&lt;/span>&lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">255&lt;/span> &lt;span style="color:#f92672">-&lt;/span> image[i&lt;span style="color:#f92672">*&lt;/span>&lt;span style="color:#ae81ff">4&lt;/span>&lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// image_input, image_output are device pointers (i.e. pointers to memory on the GPU)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">unsigned&lt;/span> &lt;span style="color:#66d9ef">char&lt;/span>&lt;span style="color:#f92672">*&lt;/span> image, &lt;span style="color:#66d9ef">int&lt;/span> width, &lt;span style="color:#66d9ef">int&lt;/span> height) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> threadsPerBlock &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">256&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> blocksPerGrid &lt;span style="color:#f92672">=&lt;/span> (width &lt;span style="color:#f92672">*&lt;/span> height &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> invert_kernel&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(image, width, height);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>count 2d array element</title><link>https://suriya.cc/tech/algos/cuda/14_count_2d_array/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/14_count_2d_array/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c++" data-lang="c++">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">count_2d_equal_kernel&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">int&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">int&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> N, &lt;span style="color:#66d9ef">int&lt;/span> M, &lt;span style="color:#66d9ef">int&lt;/span> K) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> idx &lt;span style="color:#f92672">=&lt;/span> blockDim.x&lt;span style="color:#f92672">*&lt;/span>blockIdx.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> idy &lt;span style="color:#f92672">=&lt;/span> blockDim.y&lt;span style="color:#f92672">*&lt;/span>blockIdx.y &lt;span style="color:#f92672">+&lt;/span> threadIdx.y;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> ((idx&lt;span style="color:#f92672">&amp;lt;&lt;/span>N &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> idy&lt;span style="color:#f92672">&amp;lt;&lt;/span>M) &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> input[idx&lt;span style="color:#f92672">*&lt;/span>M&lt;span style="color:#f92672">+&lt;/span>idy]&lt;span style="color:#f92672">==&lt;/span>K) atomicAdd(output,&lt;span style="color:#ae81ff">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// input, output are device pointers (i.e. pointers to memory on the GPU)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">int&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">int&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> N, &lt;span style="color:#66d9ef">int&lt;/span> M, &lt;span style="color:#66d9ef">int&lt;/span> K) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dim3 &lt;span style="color:#a6e22e">threadsPerBlock&lt;/span>(&lt;span style="color:#ae81ff">16&lt;/span>, &lt;span style="color:#ae81ff">16&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dim3 &lt;span style="color:#a6e22e">blocksPerGrid&lt;/span>((N &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock.x &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock.x,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (M &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock.y &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock.y);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> count_2d_equal_kernel&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(input, output, N, M, K);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>count array element</title><link>https://suriya.cc/tech/algos/cuda/13_count_array/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/13_count_array/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c++" data-lang="c++">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">count_equal_kernel&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">int&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">int&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> N, &lt;span style="color:#66d9ef">int&lt;/span> K) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> id&lt;span style="color:#f92672">=&lt;/span>blockDim.x &lt;span style="color:#f92672">*&lt;/span> blockIdx.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span>(id&lt;span style="color:#f92672">&amp;lt;&lt;/span>N &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> input[id]&lt;span style="color:#f92672">==&lt;/span>K) atomicAdd(output, &lt;span style="color:#ae81ff">1&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// input, output are device pointers (i.e. pointers to memory on the GPU)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">int&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">int&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> N, &lt;span style="color:#66d9ef">int&lt;/span> K) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> threadsPerBlock &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">256&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> blocksPerGrid &lt;span style="color:#f92672">=&lt;/span> (N &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> count_equal_kernel&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(input, output, N, K);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>leaky relu</title><link>https://suriya.cc/tech/algos/cuda/09_leaky_relu/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/09_leaky_relu/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c++" data-lang="c++">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">leaky_relu_kernel&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> id &lt;span style="color:#f92672">=&lt;/span> blockDim.x&lt;span style="color:#f92672">*&lt;/span> blockIdx.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (id&lt;span style="color:#f92672">&amp;lt;&lt;/span>N) output[id] &lt;span style="color:#f92672">=&lt;/span> input[id]&lt;span style="color:#f92672">&amp;gt;&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>&lt;span style="color:#f92672">?&lt;/span> input[id] &lt;span style="color:#f92672">:&lt;/span> &lt;span style="color:#ae81ff">0.01&lt;/span>&lt;span style="color:#f92672">*&lt;/span>input[id];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// input, output are device pointers (i.e. pointers to memory on the GPU)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> threadsPerBlock &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">256&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> blocksPerGrid &lt;span style="color:#f92672">=&lt;/span> (N &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> leaky_relu_kernel&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(input, output, N);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>matrix addition</title><link>https://suriya.cc/tech/algos/cuda/05_matrix_addition/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/05_matrix_addition/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c++" data-lang="c++">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">matrix_add&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> A, &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> B, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> C, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> id &lt;span style="color:#f92672">=&lt;/span> blockDim.x &lt;span style="color:#f92672">*&lt;/span> blockIdx.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (id&lt;span style="color:#f92672">&amp;lt;&lt;/span>N) C[id] &lt;span style="color:#f92672">=&lt;/span> A[id]&lt;span style="color:#f92672">+&lt;/span>B[id];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// A, B, C are device pointers (i.e. pointers to memory on the GPU)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> A, &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> B, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> C, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> threadsPerBlock &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">256&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> blocksPerGrid &lt;span style="color:#f92672">=&lt;/span> (N &lt;span style="color:#f92672">*&lt;/span> N &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> matrix_add&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(A, B, C, N);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>matrix copy</title><link>https://suriya.cc/tech/algos/cuda/11_matrix_copy/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/11_matrix_copy/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c++" data-lang="c++">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">copy_matrix_kernel&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> A, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> B, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> idx &lt;span style="color:#f92672">=&lt;/span> blockDim.x&lt;span style="color:#f92672">*&lt;/span> blockIdx.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (idx&lt;span style="color:#f92672">&amp;lt;&lt;/span>N){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> B[idx] &lt;span style="color:#f92672">=&lt;/span> A[idx];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// A, B are device pointers (i.e. pointers to memory on the GPU)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> A, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> B, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> total &lt;span style="color:#f92672">=&lt;/span> N &lt;span style="color:#f92672">*&lt;/span> N;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> threadsPerBlock &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">256&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> blocksPerGrid &lt;span style="color:#f92672">=&lt;/span> (total &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> copy_matrix_kernel&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(A, B, total);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} 
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>matrix multiply</title><link>https://suriya.cc/tech/algos/cuda/02_matrix_multipy/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/02_matrix_multipy/</guid><description>&lt;p>The tricky part in this was that, I took some time to intuit that each thread should associate to each value in the output matrix.&lt;/p></description></item><item><title>matrix transpose</title><link>https://suriya.cc/tech/algos/cuda/03_matrix_transpose/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/03_matrix_transpose/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">matrix_transpose_kernel&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> rows, &lt;span style="color:#66d9ef">int&lt;/span> cols) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> blockIdx.x &lt;span style="color:#f92672">*&lt;/span> blockDim.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> j &lt;span style="color:#f92672">=&lt;/span> blockIdx.y &lt;span style="color:#f92672">*&lt;/span> blockDim.y &lt;span style="color:#f92672">+&lt;/span> threadIdx.y;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> printf(&lt;span style="color:#e6db74">&amp;#34;%d&amp;#34;&lt;/span>,i);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (i&lt;span style="color:#f92672">&amp;lt;&lt;/span>rows &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> j&lt;span style="color:#f92672">&amp;lt;&lt;/span>cols){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> output[j&lt;span style="color:#f92672">*&lt;/span>rows&lt;span style="color:#f92672">+&lt;/span>i] &lt;span style="color:#f92672">=&lt;/span> input[i&lt;span style="color:#f92672">*&lt;/span>cols&lt;span style="color:#f92672">+&lt;/span>j];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// input, output are device pointers (i.e. pointers to memory on the GPU)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> rows, &lt;span style="color:#66d9ef">int&lt;/span> cols) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dim3 &lt;span style="color:#a6e22e">threadsPerBlock&lt;/span>(&lt;span style="color:#ae81ff">16&lt;/span>, &lt;span style="color:#ae81ff">16&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dim3 &lt;span style="color:#a6e22e">blocksPerGrid&lt;/span>((cols &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock.x &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock.x,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> (rows &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock.y &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock.y);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> matrix_transpose_kernel&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(input, output, rows, cols);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>relu</title><link>https://suriya.cc/tech/algos/cuda/08_ReLu/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/08_ReLu/</guid><description>&lt;p>&lt;code>ReLU(x) = max(0,x)&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c++" data-lang="c++">&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">relu_kernel&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> id &lt;span style="color:#f92672">=&lt;/span> blockDim.x&lt;span style="color:#f92672">*&lt;/span> blockIdx.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (id&lt;span style="color:#f92672">&amp;lt;&lt;/span>N) output[id] &lt;span style="color:#f92672">=&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>max(&lt;span style="color:#ae81ff">0.0f&lt;/span>,input[id]);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// input, output are device pointers (i.e. pointers to memory on the GPU)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> threadsPerBlock &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">256&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> blocksPerGrid &lt;span style="color:#f92672">=&lt;/span> (N &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> relu_kernel&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(input, output, N);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>reverse array</title><link>https://suriya.cc/tech/algos/cuda/07_reverse_array/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/07_reverse_array/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c++" data-lang="c++">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">reverse_array&lt;/span>(&lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> blockDim.x &lt;span style="color:#f92672">*&lt;/span> blockIdx.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (i&lt;span style="color:#f92672">&amp;lt;&lt;/span>N&lt;span style="color:#f92672">/&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>) { 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>swap(input[i],input[N&lt;span style="color:#f92672">-&lt;/span>i&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>]);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// input is device pointer
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> threadsPerBlock &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">256&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> blocksPerGrid &lt;span style="color:#f92672">=&lt;/span> (N &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> reverse_array&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(input, N);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>silu</title><link>https://suriya.cc/tech/algos/cuda/15_sigmoid_linear_unit/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/15_sigmoid_linear_unit/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">silu_kernel&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> id &lt;span style="color:#f92672">=&lt;/span> blockDim.x &lt;span style="color:#f92672">*&lt;/span> blockIdx.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (id&lt;span style="color:#f92672">&amp;lt;&lt;/span>N) output[id] &lt;span style="color:#f92672">=&lt;/span> input[id]&lt;span style="color:#f92672">*&lt;/span>(&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">/&lt;/span>(&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">+&lt;/span>std&lt;span style="color:#f92672">::&lt;/span>exp(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">*&lt;/span>(input[id]))));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// input, output are device pointers
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> threadsPerBlock &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">256&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> blocksPerGrid &lt;span style="color:#f92672">=&lt;/span> (N &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> silu_kernel&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(input, output, N);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>simple inference</title><link>https://suriya.cc/tech/algos/cuda/12_simple_inference/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/12_simple_inference/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> torch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> torch.nn &lt;span style="color:#66d9ef">as&lt;/span> nn
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># input, model, and output are on the GPU&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">solve&lt;/span>(input: torch&lt;span style="color:#f92672">.&lt;/span>Tensor, model: nn&lt;span style="color:#f92672">.&lt;/span>Module, output: torch&lt;span style="color:#f92672">.&lt;/span>Tensor):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> model&lt;span style="color:#f92672">.&lt;/span>eval()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">with&lt;/span> torch&lt;span style="color:#f92672">.&lt;/span>no_grad():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> output&lt;span style="color:#f92672">.&lt;/span>copy_(model(input))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>swilu</title><link>https://suriya.cc/tech/algos/cuda/16_swish_gated_linear_unit/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/16_swish_gated_linear_unit/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c++" data-lang="c++">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cuda_runtime.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">float&lt;/span> &lt;span style="color:#a6e22e">silu&lt;/span>(&lt;span style="color:#66d9ef">float&lt;/span> x){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> x&lt;span style="color:#f92672">*&lt;/span>(&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">/&lt;/span>(&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">+&lt;/span>std&lt;span style="color:#f92672">::&lt;/span>exp(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">*&lt;/span>(x))));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>__global__ &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">swiglu_kernel&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> halfN) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> id &lt;span style="color:#f92672">=&lt;/span> blockDim.x &lt;span style="color:#f92672">*&lt;/span> blockIdx.x &lt;span style="color:#f92672">+&lt;/span> threadIdx.x;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span>(id&lt;span style="color:#f92672">&amp;lt;&lt;/span>halfN) output[id] &lt;span style="color:#f92672">=&lt;/span> input[id&lt;span style="color:#f92672">%&lt;/span>halfN]&lt;span style="color:#f92672">*&lt;/span>(&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">/&lt;/span>(&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">+&lt;/span>std&lt;span style="color:#f92672">::&lt;/span>exp(&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>&lt;span style="color:#f92672">*&lt;/span>(input[id&lt;span style="color:#f92672">%&lt;/span>halfN])))) &lt;span style="color:#f92672">*&lt;/span> input[id&lt;span style="color:#f92672">%&lt;/span>halfN &lt;span style="color:#f92672">+&lt;/span> halfN];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// input, output are device pointers
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">extern&lt;/span> &lt;span style="color:#e6db74">&amp;#34;C&amp;#34;&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> solve(&lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> input, &lt;span style="color:#66d9ef">float&lt;/span>&lt;span style="color:#f92672">*&lt;/span> output, &lt;span style="color:#66d9ef">int&lt;/span> N) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> halfN &lt;span style="color:#f92672">=&lt;/span> N &lt;span style="color:#f92672">/&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> threadsPerBlock &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">256&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> blocksPerGrid &lt;span style="color:#f92672">=&lt;/span> (halfN &lt;span style="color:#f92672">+&lt;/span> threadsPerBlock &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> threadsPerBlock;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> swiglu_kernel&lt;span style="color:#f92672">&amp;lt;&amp;lt;&amp;lt;&lt;/span>blocksPerGrid, threadsPerBlock&lt;span style="color:#f92672">&amp;gt;&amp;gt;&amp;gt;&lt;/span>(input, output, halfN);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cudaDeviceSynchronize();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>vector addition</title><link>https://suriya.cc/tech/algos/cuda/01_vector_addition/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/algos/cuda/01_vector_addition/</guid><description>&lt;p>The question was&lt;/p>
&lt;pre tabindex="0">&lt;code>Implement a program that performs element-wise addition of two vectors containing 32-bit floating point numbers on a GPU. The program should take two input vectors of equal length and produce a single output vector containing their sum.

Implementation Requirements
External libraries are not permitted
The solve function signature must remain unchanged
The final result must be stored in vector C
&lt;/code>&lt;/pre>&lt;p>Identifying the thread uniquely is always done like using
&lt;code>blockIdx.x * blockDim.x + threadIdx.x&lt;/code>&lt;/p></description></item><item><title>software engineering agents work. but only if you do</title><link>https://suriya.cc/general/gpt-code/</link><pubDate>Sat, 13 Sep 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/general/gpt-code/</guid><description>&lt;p>Every week there is a new agent that the twitter micro-cosmos gets fired up about. This week it was agent 3.
Which is apparently miles ahead of the competition and is able to plan and execute for up to 200 minutes.&lt;/p></description></item><item><title>ai media editor</title><link>https://suriya.cc/general/ai-media-editor/</link><pubDate>Sat, 29 Mar 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/general/ai-media-editor/</guid><description>&lt;p>The first animation movie, toy story was made in 1995. At that time this was a break through. It involved a lot of proprietary software (Ray tracing, shaders, motion blur) and decades of research and development.
In 2025, for the first time a movie made in open source software (blender) received the oscar.&lt;/p></description></item><item><title>practical deep learning</title><link>https://suriya.cc/tech/ML/practical_deep_learning/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/practical_deep_learning/</guid><description>&lt;p>notes from &lt;a href="https://www.fast.ai/">fast.ai&lt;/a>
 Practical Deep Learning course.&lt;/p></description></item><item><title>photogrammetry/videogrammetry or the dark art of capturing 2d and generating 3d models</title><link>https://suriya.cc/tech/ML/photogrammetry/</link><pubDate>Fri, 11 Oct 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/photogrammetry/</guid><description>&lt;h1 id="capturing">capturing&lt;/h1>
&lt;h2 id="questions">questions:&lt;/h2>
&lt;p>Is it possible to go from, photo/video to high fidelity 3d model, with strong support for texture, without losing a lot of details on noise?&lt;/p></description></item><item><title>ml journal</title><link>https://suriya.cc/tech/ML/ML_diary/</link><pubDate>Thu, 08 Aug 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/ML_diary/</guid><description>&lt;h1 id="092723">09.27.23&lt;/h1>
&lt;ul>
&lt;li>Tried ML model for face classification with,&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>backbone &lt;span style="color:#f92672">=&lt;/span> torch&lt;span style="color:#f92672">.&lt;/span>nn&lt;span style="color:#f92672">.&lt;/span>Sequential(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> torch&lt;span style="color:#f92672">.&lt;/span>nn&lt;span style="color:#f92672">.&lt;/span>Conv2d(&lt;span style="color:#ae81ff">3&lt;/span>,&lt;span style="color:#ae81ff">64&lt;/span>,kernel_size&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">7&lt;/span>,stride&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">4&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> torch&lt;span style="color:#f92672">.&lt;/span>nn&lt;span style="color:#f92672">.&lt;/span>Conv2d(&lt;span style="color:#ae81ff">64&lt;/span>,&lt;span style="color:#ae81ff">128&lt;/span>, kernel_size&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">3&lt;/span>, stride&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> torch&lt;span style="color:#f92672">.&lt;/span>nn&lt;span style="color:#f92672">.&lt;/span>Conv2d(&lt;span style="color:#ae81ff">128&lt;/span>,&lt;span style="color:#ae81ff">256&lt;/span>,kernel_size&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">3&lt;/span>, stride&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> torch&lt;span style="color:#f92672">.&lt;/span>nn&lt;span style="color:#f92672">.&lt;/span>Conv2d(&lt;span style="color:#ae81ff">256&lt;/span>, &lt;span style="color:#ae81ff">512&lt;/span>,kernel_size&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">3&lt;/span>, stride&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> torch&lt;span style="color:#f92672">.&lt;/span>nn&lt;span style="color:#f92672">.&lt;/span>Conv2d(&lt;span style="color:#ae81ff">512&lt;/span>, &lt;span style="color:#ae81ff">1024&lt;/span>,kernel_size&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">3&lt;/span>, stride&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> self&lt;span style="color:#f92672">.&lt;/span>cls_layer &lt;span style="color:#f92672">=&lt;/span> torch&lt;span style="color:#f92672">.&lt;/span>nn&lt;span style="color:#f92672">.&lt;/span>Sequential(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> torch&lt;span style="color:#f92672">.&lt;/span>nn&lt;span style="color:#f92672">.&lt;/span>Flatten(),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> torch&lt;span style="color:#f92672">.&lt;/span>nn&lt;span style="color:#f92672">.&lt;/span>Linear( &lt;span style="color:#ae81ff">4096&lt;/span>,num_classes),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This model overfit spectacularly, training accuracy after 20 epochs was 95% validation accuracy was 15%. 🤯&lt;/p></description></item><item><title>word embedding models</title><link>https://suriya.cc/tech/ML/word2vec/</link><pubDate>Sun, 04 Aug 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/word2vec/</guid><description>&lt;p>&lt;strong>My aim for this blog was to keep it as not too technical as possible.&lt;/strong>&lt;/p>
&lt;p>Word embeddings is a way to represent words as a vector.
Which lets us do all kinds of trickery like how far a word like &amp;ldquo;King&amp;rdquo; is away from &amp;ldquo;Queen&amp;rdquo; and how they are related to each other with.
Very useful when building applications with semantic understanding.&lt;/p></description></item><item><title>streaming diarizer</title><link>https://suriya.cc/tech/ML/streaming_diarizer/</link><pubDate>Sat, 20 Apr 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/streaming_diarizer/</guid><description>&lt;p>&lt;a href="https://github.com/subygan/SpeechStream">repo&lt;/a>
&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/NVIDIA/NeMo/blob/main/tutorials/speaker_tasks/Speaker_Diarization_Training.ipynb">Nemo Speaker diarization training&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://github.com/NVIDIA/NeMo/blob/main/tutorials/tools/Multispeaker_Simulator.ipynb">MultiSpeaker Simulation&lt;/a>
&lt;/li>
&lt;/ul>
&lt;h3 id="data-sets">data sets&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://www.openslr.org/12">LibriSpeech&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://github.com/joonson/voxconverse">VoxConverse&lt;/a>
&lt;/li>
&lt;/ul>
&lt;h2 id="resources">resources&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://github.com/ufal/whisper_streaming">Whisper Streaming&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://ieeexplore.ieee.org/abstract/document/10446050">Diarist&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>llm code generation notes</title><link>https://suriya.cc/tech/ML/code_llm/</link><pubDate>Tue, 19 Mar 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/code_llm/</guid><description>&lt;p>This is going to be binary analysis with LLM type thing
The idea is to see, if LLMs are able to understand the &amp;ldquo;language&amp;rdquo; of binaries and are able to retrieve the underlying vulnerability.&lt;/p></description></item><item><title>federated learning</title><link>https://suriya.cc/tech/ML/federated_learning/</link><pubDate>Sun, 03 Mar 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/federated_learning/</guid><description/></item><item><title>different types of graphs i come across</title><link>https://suriya.cc/tech/ML/plots/</link><pubDate>Sun, 25 Feb 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/plots/</guid><description>&lt;h3 id="pandas">pandas&lt;/h3></description></item><item><title>pandas fight</title><link>https://suriya.cc/tech/ML/pandas/</link><pubDate>Sat, 24 Feb 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/pandas/</guid><description>&lt;p>When a column has NaN it is shown as float value in a column.
need to use &lt;code>.fillna(&amp;quot;&amp;quot;)&lt;/code> to replace the &lt;code>Nan&lt;/code> with empty string.&lt;/p></description></item><item><title>graphs and llms</title><link>https://suriya.cc/tech/ML/graph_llm/</link><pubDate>Sun, 11 Feb 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/graph_llm/</guid><description>&lt;p>I&amp;rsquo;ll add the ones with the most fun:utilization first&lt;/p>
&lt;h3 id="building-graphs-using-llms">building graphs using llms:&lt;/h3>
&lt;p>This strategy comes clearly under the &lt;strong>by LLMs&lt;/strong> category and the most obvious one as well. Because of their semantic understanding, LLMs can be prompted into providing the triplets of relationship between the entities in a piece of text. Throw a piece of text, and it draws a graph of the relationship between subjects and objects
This is a relatively straightforward utilization of an LLM&amp;rsquo;s ability to find pattern in text.
eg. &lt;a href="https://news.ycombinator.com/item?id=34605772">GraphGPT&lt;/a>
w&lt;/p></description></item><item><title>research papers</title><link>https://suriya.cc/tech/ML/papers/</link><pubDate>Fri, 09 Feb 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/papers/</guid><description>&lt;ul>
&lt;li>
&lt;p>aiaac, AI incidents database.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://arxiv.org/pdf/2311.17035.pdf">Scalable Extraction of Traning Data from (Production) Language Models&lt;/a>
&lt;/p>
&lt;ul>
&lt;li>Making LLMs repeat the same word over and over again makes them emit the training data 3.5X better&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="//">The pain of Building copilots&lt;/a>
&lt;/p></description></item><item><title>ml guardrails</title><link>https://suriya.cc/tech/ML/llm_guardrails/</link><pubDate>Tue, 06 Feb 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/llm_guardrails/</guid><description>&lt;p>The base premise is that, aligning the model for the goal that it was created for is a long tail problem and requires multiple guardrails to control it&amp;rsquo;s output. Without this, the model could possibly go off the rails and create a lot of confusion.&lt;/p></description></item><item><title>research ideas</title><link>https://suriya.cc/ideas/research/</link><pubDate>Sun, 04 Feb 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/ideas/research/</guid><description>&lt;h3 id="continual-learning">Continual learning&lt;/h3>
&lt;h4 id="ai-guardrail-comparison">ai guardrail comparison&lt;/h4>
&lt;ul>
&lt;li>There are multipel LLM guardrails, evaluating them would be something&lt;/li>
&lt;/ul>
&lt;h4 id="privacy-detector-dataset-and-custom-model">privacy detector dataset and custom model&lt;/h4>
&lt;ul>
&lt;li>There is no dataset to test a model for it&amp;rsquo;s privacy Capabilities&lt;/li>
&lt;li>A custom model implementation that tests this information against an LLM would also be helpful&lt;/li>
&lt;/ul></description></item><item><title>prompt engineering</title><link>https://suriya.cc/tech/ML/prompt_engineering/</link><pubDate>Tue, 23 Jan 2024 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/prompt_engineering/</guid><description>&lt;h2 id="in-context-learning">in context learning&lt;/h2>
&lt;h2 id="chain-of-thought">chain-of-thought&lt;/h2>
&lt;p>Broadly three classes of reasoning tasks
&amp;ldquo;let&amp;rsquo;s think step by step&amp;rdquo; seems to be the key phrase&lt;/p></description></item><item><title>purple llama</title><link>https://suriya.cc/tech/ML/purple_llama/</link><pubDate>Mon, 11 Dec 2023 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/purple_llama/</guid><description>&lt;p>PurpleLlama is a new framework proposed by Meta to evaluate LLMs for their secure coding ability.&lt;/p>
&lt;h2 id="cyberseceval">cyberseceval&lt;/h2>
&lt;p>This is the core part of the research paper which has created a &lt;a href="https://github.com/facebookresearch/PurpleLlama/tree/main/CybersecurityBenchmarks">benchmark for LLMs&lt;/a>
 to test generated code.&lt;/p></description></item><item><title>membership inference attack</title><link>https://suriya.cc/tech/ML/MIA/</link><pubDate>Sat, 09 Dec 2023 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/MIA/</guid><description>&lt;p>Membership inference Attack is a way to retrieve back the probability of the original training inputs.&lt;/p>
&lt;h3 id="notes">notes&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://arxiv.org/pdf/1610.05820.pdf">https://arxiv.org/pdf/1610.05820.pdf&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>intro to llm</title><link>https://suriya.cc/tech/ML/Intro_to_llm/</link><pubDate>Thu, 23 Nov 2023 00:00:00 +0000</pubDate><guid>https://suriya.cc/tech/ML/Intro_to_llm/</guid><description>&lt;p>My notes on Karpathy&amp;rsquo;s &lt;a href="https://youtu.be/zjkBMFhNj_g">Intro to LLM talk&lt;/a>
&lt;/p>
&lt;h3 id="llama-2-70b">llama-2-70b&lt;/h3>
&lt;ul>
&lt;li>comes with &lt;code>run.c&lt;/code> ~500 lines of c for it to be a self-contained runnable model.&lt;/li>
&lt;li>LLM are a lossy compression of the internet.&lt;/li>
&lt;li>In the process of trying to predict the next word, The model would have to understand the World that led to the creation of that next word.&lt;/li>
&lt;li>What the model does is closer to a dream, than determinism. The model only knows that something of a certain structure has to come there. It is not going to exactly replicate the world. It is dreaming about it and just like every dream the finer details could be hazy.&lt;/li>
&lt;li>Reversal curse, knowledge that can be accessed from one angle, cannot be accessed when from another angle. And it is hard to understand why, because even though the equations behind the models are well understood. It is hard to reason within the billions of parameters and figure out why the model came to a certain conclusion.&lt;/li>
&lt;/ul>
&lt;h3 id="assistant-training">assistant training&lt;/h3>
&lt;p>After training the Language model on a number of Epochs over the whole corpus of internet text.&lt;/p></description></item></channel></rss>