Day 85

GPU Kernels Learning Journey

Description

### Files: `TensorMatMul.cu` I implemented a code that performs 4D tensor-matrix multiplication of two tensors.

Code Files

TensorMatMul.cu

#include <cuda_runtime.h>


__global__ void tensorMatrixMultKernel(
    const float* A,
    const float* B,
    float* C,
    size_t B_dim,
    size_t I_dim,
    size_t J_dim,
    size_t L_dim,
    size_t K_dim
) {

    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    

    int total_elements = B_dim * I_dim * J_dim * K_dim;
    if (idx < total_elements) {
        int k = idx % K_dim;
        int j = (idx / K_dim) % J_dim;
        int i = (idx / (K_dim * J_dim)) % I_dim;
        int b = idx / (K_dim * J_dim * I_dim);
        
    
        size_t c_idx = ((b * I_dim + i) * J_dim + j) * K_dim + k;
        
   
        float sum = 0.0f;
        

        size_t a_base = ((b * I_dim + i) * J_dim + j) * L_dim;
       
        for (int l = 0; l < L_dim; l++) {
            sum += A[a_base + l] * B[l * K_dim + k];
        }

        C[c_idx] = sum;
    }
}

extern "C" void solution(const float* A, const float* B, float* C, size_t b, size_t i, size_t j, size_t l, size_t k) {

    size_t total_elements = b * i * j * k;
    

    int threadsPerBlock = 256;
    int blocksPerGrid = (total_elements + threadsPerBlock - 1) / threadsPerBlock;
    

    tensorMatrixMultKernel<<<blocksPerGrid, threadsPerBlock>>>(A, B, C, b, i, j, l, k);
}