name: Unit, Static and other Tests

on:
  create:
  workflow_dispatch:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:
  dataloader_test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: test the dataloader without / with sanitize address
        run: |
          cd dev/test
          make PRECISION=BF16 test_dataloader
          ./test_dataloader   
          make clean       
          make PRECISION=BF16 TEST_CFLAGS="-fsanitize=address -fno-omit-frame-pointer" test_dataloader 
          ./test_dataloader          

  ptx_and_sass_files:
    runs-on: ubuntu-latest
    container:
      image: nvidia/cuda:12.4.1-devel-ubuntu22.04

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install OpenMP and OpenMPI
        run: apt-get update && apt-get install -y libomp-dev libopenmpi-dev
    
      - name: Generate ptx/sass files and upload them to persistent storage
        run: |
          mkdir -p dev/cuda/ptx_sass_logs
          make train_gpt2cu
          cuobjdump --dump-ptx train_gpt2cu > dev/cuda/train_gpt2cu.ptx
          cuobjdump --dump-sass train_gpt2cu > dev/cuda/train_gpt2cu.sass          
          cd dev/cuda
          make -j all_ptx
          make -j all_sass
          cp *.ptx ptx_sass_logs/
          cp *.sass ptx_sass_logs/
          ls ptx_sass_logs/

      - name: Generate ptx/sass files for A100 and upload them to persistent storage
        run: |
            mkdir -p dev/cuda/ptx_sass_logs_A100
            make train_gpt2cu GPU_COMPUTE_CAPABILITY=80
            cuobjdump --dump-ptx train_gpt2cu > dev/cuda/train_gpt2cu.ptx
            cuobjdump --dump-sass train_gpt2cu > dev/cuda/train_gpt2cu.sass          
            cd dev/cuda
            make -j GPU_COMPUTE_CAPABILITY=80 all_ptx
            make -j GPU_COMPUTE_CAPABILITY=80 all_sass
            cp *.ptx ptx_sass_logs_A100/
            cp *.sass ptx_sass_logs_A100/
            ls ptx_sass_logs_A100/

      - name: Generate ptx/sass files for H100 and upload them to persistent storage
        run: |
            mkdir -p dev/cuda/ptx_sass_logs_H100
            make train_gpt2cu GPU_COMPUTE_CAPABILITY=90
            cuobjdump --dump-ptx train_gpt2cu > dev/cuda/train_gpt2cu.ptx
            cuobjdump --dump-sass train_gpt2cu > dev/cuda/train_gpt2cu.sass          
            cd dev/cuda
            make -j GPU_COMPUTE_CAPABILITY=90 all_ptx
            make -j GPU_COMPUTE_CAPABILITY=90 all_sass
            cp *.ptx ptx_sass_logs_H100/
            cp *.sass ptx_sass_logs_H100/
            ls ptx_sass_logs_H100/

      - name: Upload ptx/sass files
        uses: actions/upload-artifact@v4
        with:
          name: ptx_sass_files
          path: dev/cuda/ptx_sass_logs/
          retention-days: 30 # days to retain

      - name: Upload ptx/sass files for A100
        uses: actions/upload-artifact@v4
        with:
          name: ptx_sass_files_A100
          path: dev/cuda/ptx_sass_logs_A100/
          retention-days: 30 # days to retain          

      - name: Upload ptx/sass files for H100
        uses: actions/upload-artifact@v4
        with:
          name: ptx_sass_files_H100
          path: dev/cuda/ptx_sass_logs_H100/
          retention-days: 30 # days to retain                    