Skip to content

AICL-Lab/mini-image-pipe

Repository files navigation

Mini-ImagePipe

CI Docs License: MIT

English | 简体中文

Mini-ImagePipe is a lean CUDA image-processing runtime built around four core pieces: Pipeline, TaskGraph, DAGScheduler, and MemoryManager. It keeps the project focused on the maintainable core: DAG execution, multi-stream scheduling, pooled memory reuse, and a small set of built-in GPU operators.

Highlights

  • CUDA-first runtime for GPU-native image processing
  • DAG scheduling with cycle rejection and dependency-aware execution
  • Multi-stream execution using CUDA streams and events
  • Reusable memory pools for pinned and device allocations
  • Small built-in operator set: Resize, ColorConvert, GaussianBlur, Sobel, MergeAverage
  • Single documentation surface: VitePress on GitHub Pages
  • Single changelog: CHANGELOG.md

Requirements

  • Linux
  • CMake 3.18+
  • CUDA Toolkit 11.0+ with nvcc on PATH
  • C++17 compiler
  • NVIDIA GPU with compute capability 7.0+

Quick Start

git clone https://github.com/AICL-Lab/mini-image-pipe.git
cd mini-image-pipe

cmake --preset release
cmake --build --preset release

./build/demo_pipeline
ctest --preset release

Build

# Debug
cmake --preset default
cmake --build --preset default

# Release
cmake --preset release
cmake --build --preset release

# Native GPU arch only
cmake --preset minimal
cmake --build --preset minimal

If CMake cannot find CUDA:

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

Usage

#include "pipeline.h"
#include "operators/color_convert.h"
#include "operators/gaussian_blur.h"
#include "operators/resize.h"
#include "operators/sobel.h"

using namespace mini_image_pipe;

int main() {
    Pipeline pipeline;

    auto resize = std::make_shared<ResizeOperator>(320, 240, InterpolationMode::BILINEAR);
    auto gray = std::make_shared<ColorConvertOperator>(ColorConversionType::RGB_TO_GRAY);
    auto blur = std::make_shared<GaussianBlurOperator>(GaussianKernelSize::KERNEL_5x5);
    auto sobel = std::make_shared<SobelOperator>();

    int n1 = pipeline.addOperator("Resize", resize);
    int n2 = pipeline.addOperator("Gray", gray);
    int n3 = pipeline.addOperator("Blur", blur);
    int n4 = pipeline.addOperator("Sobel", sobel);

    pipeline.connect(n1, n2);
    pipeline.connect(n2, n3);
    pipeline.connect(n3, n4);

    // Allocate CUDA input, call setInput(...), then execute().
    return 0;
}

See examples/demo_pipeline.cpp for the complete example.

Operators

Operator Role Notes
ResizeOperator Image scaling Bilinear and nearest-neighbor
ColorConvertOperator Color conversion RGB/Gray/BGR/RGBA paths
GaussianBlurOperator Blur Separable filtering
SobelOperator Edge detection 3x3 Sobel kernels
MergeAverageOperator Fan-in merge Averages multiple upstream images

Project Structure

mini-image-pipe/
├── include/
│   ├── operator.h
│   ├── pipeline.h
│   ├── scheduler.h
│   ├── task_graph.h
│   ├── memory_manager.h
│   ├── types.h
│   └── operators/
├── src/
│   ├── memory_manager.cu
│   ├── pipeline.cpp
│   ├── scheduler.cu
│   ├── task_graph.cpp
│   └── operators/
├── tests/
├── docs/
├── examples/demo_pipeline.cpp
└── CHANGELOG.md

Documentation

GitHub Pages no longer publishes a separate changelog section. Release history lives only in the repository root at CHANGELOG.md.

Contributing

Contributions via issues and pull requests are welcome. See CONTRIBUTING.md for build instructions and coding conventions.

License

Released under the MIT License.