Day 95

GPU Kernels Learning Journey

Description

### Files: `2D_Max_Pooling.cu` I implemented a code that performs the 2D max pooling on an input tensor.

Code Files

2D_Max_Pooling.cu

#include <cuda_runtime.h>
#include <float.h>    // for FLT_MAX
#include <stddef.h>   // for size_t


__global__
void maxpool2d_kernel(const float* __restrict__ input,
                      int H, int W,
                      int kernel_size, int stride, int padding, int dilation,
                      int H_out, int W_out,
                      float* __restrict__ output)
{

    int out_y = blockIdx.y * blockDim.y + threadIdx.y;
    int out_x = blockIdx.x * blockDim.x + threadIdx.x;
    if (out_y >= H_out || out_x >= W_out) return;


    float max_val = -FLT_MAX;
    for (int m = 0; m < kernel_size; ++m) {
        int in_y = out_y * stride + m * dilation - padding;
        for (int n = 0; n < kernel_size; ++n) {
            int in_x = out_x * stride + n * dilation - padding;
            
            if (in_y >= 0 && in_y < H && in_x >= 0 && in_x < W) {
                float v = input[in_y * W + in_x];
                if (v > max_val) max_val = v;
            }
        }
    }
    output[out_y * W_out + out_x] = max_val;
}


extern "C"
void solution(const float* input,
              int kernel_size,
              int stride,
              int padding,
              int dilation,
              float* output,
              size_t H,
              size_t W)
{

    int H_out = (int)(( (int)H + 2*padding
                       - dilation*(kernel_size-1)
                       - 1 ) / stride) + 1;
    int W_out = (int)(( (int)W + 2*padding
                       - dilation*(kernel_size-1)
                       - 1 ) / stride) + 1;


    const int Bx = 16, By = 16;
    dim3 block(Bx, By);
    dim3 grid( (W_out + Bx - 1) / Bx,
               (H_out + By - 1) / By );

    maxpool2d_kernel<<<grid, block>>>(
        input,
        (int)H, (int)W,
        kernel_size, stride, padding, dilation,
        H_out, W_out,
        output
    );


}