Skip to content

Operators API

Complete reference for built-in operators.

IOperator Interface

cpp
class IOperator {
public:
    virtual ~IOperator() = default;

    virtual cudaError_t initialize() { return cudaSuccess; }
    virtual void shutdown() {}

    // Execute the operator on GPU
    virtual cudaError_t execute(const void* input, void* output,
                                int width, int height, int channels,
                                cudaStream_t stream) = 0;

    // Get workspace requirements for multi-input/batch paths
    virtual WorkspaceRequirements getWorkspaceRequirements(
        const std::vector<ImageBuffer>& inputs) const {
        return {};
    }

    // Whether the operator accepts a given number of inputs
    virtual bool supportsInputCount(size_t count) const { return count == 1; }

    // Multi-input / batch execution path
    virtual cudaError_t executeBuffers(const std::vector<ImageBuffer>& inputs,
                                         ImageBuffer& output,
                                         const OperatorExecutionContext& context);

    // Get output dimensions
    virtual void getOutputDimensions(int inputWidth, int inputHeight, int inputChannels,
                                     int& outputWidth, int& outputHeight,
                                     int& outputChannels) const = 0;

    // Get operator name for debugging
    virtual const char* getName() const = 0;
};

GaussianBlurOperator

Applies Gaussian blur with separable filter optimization.

cpp
class GaussianBlurOperator : public IOperator {
public:
    explicit GaussianBlurOperator(GaussianKernelSize size, float sigma = 0.0f);
    
    void setKernelSize(GaussianKernelSize size);
    void setSigma(float sigma);
    
    GaussianKernelSize getKernelSize() const;
    float getSigma() const;
};

enum class GaussianKernelSize { 
    KERNEL_3x3 = 3, 
    KERNEL_5x5 = 5, 
    KERNEL_7x7 = 7 
};

Parameters

ParameterTypeDescription
sizeGaussianKernelSizeKernel size (3×3, 5×5, or 7×7)
sigmafloatGaussian sigma (0 = auto-calculate)

Example

cpp
auto blur = std::make_shared<GaussianBlurOperator>(GaussianKernelSize::KERNEL_5x5, 1.5f);

Implementation Details

  • Uses separable filter: decomposes 2D kernel into two 1D passes
  • Complexity: O(n2)O(2n) per pixel
  • Uses shared memory with halo regions for boundary handling

SobelOperator

Applies 3×3 Sobel edge detection.

cpp
class SobelOperator : public IOperator {
public:
    SobelOperator();
    // Output: single-channel gradient magnitude
};

Output

  • Single-channel grayscale image
  • Each pixel represents gradient magnitude: Gx2+Gy2

Sobel Kernels

Gx=[101202101]Gy=[121000121]

Example

cpp
auto sobel = std::make_shared<SobelOperator>();

ResizeOperator

Resizes images using interpolation.

cpp
class ResizeOperator : public IOperator {
public:
    ResizeOperator(int targetWidth, int targetHeight, 
                   InterpolationMode mode = InterpolationMode::BILINEAR);
    
    void setTargetSize(int width, int height);
    void setInterpolationMode(InterpolationMode mode);
    
    int getTargetWidth() const;
    int getTargetHeight() const;
};

enum class InterpolationMode { NEAREST, BILINEAR };

Parameters

ParameterTypeDescription
targetWidthintOutput width in pixels
targetHeightintOutput height in pixels
modeInterpolationModeNearest neighbor or bilinear

Coordinate Mapping

srcx=dstx×src_widthdst_widthsrcy=dsty×src_heightdst_height

Example

cpp
auto resize = std::make_shared<ResizeOperator>(320, 240, InterpolationMode::BILINEAR);

ColorConvertOperator

Converts between color spaces.

cpp
class ColorConvertOperator : public IOperator {
public:
    explicit ColorConvertOperator(ColorConversionType type);
};

enum class ColorConversionType { 
    RGB_TO_GRAY, 
    BGR_TO_RGB, 
    RGBA_TO_RGB, 
    GRAY_TO_RGB 
};

Conversion Types

TypeInputOutputDescription
RGB_TO_GRAY3-channel1-channelLuminance conversion
BGR_TO_RGB3-channel3-channelChannel reordering
RGBA_TO_RGB4-channel3-channelDrop alpha channel
GRAY_TO_RGB1-channel3-channelReplicate to 3 channels

Luminance Formula

Y=0.299R+0.587G+0.114B

(ITU-R BT.601 standard)

Example

cpp
auto gray = std::make_shared<ColorConvertOperator>(ColorConversionType::RGB_TO_GRAY);

Creating Custom Operators

Implement the IOperator interface:

cpp
class MyCustomOperator : public IOperator {
public:
    cudaError_t execute(const void* input, void* output,
                        int width, int height, int channels,
                        cudaStream_t stream) override {
        // Launch CUDA kernel
        myKernel<<<grid, block, 0, stream>>>(input, output, width, height, channels);
        return cudaGetLastError();
    }
    
    void getOutputSize(int inputWidth, int inputHeight,
                       int& outputWidth, int& outputHeight) override {
        outputWidth = inputWidth;
        outputHeight = inputHeight;
    }
    
    int getOutputChannels(int inputChannels) override {
        return inputChannels;
    }
};

Workspace Requirements

cpp
WorkspaceRequirements getWorkspaceRequirements(
    const std::vector<ImageBuffer>& inputs) const override {
    if (inputs.empty()) return {};
    return {
        .deviceBytes = static_cast<size_t>(inputs.front().width) *
                       inputs.front().height * inputs.front().channels * sizeof(float)
    };
}

MergeAverageOperator

Pixel-wise average of 2 or more inputs of identical shape.

cpp
class MergeAverageOperator : public IOperator {
public:
    MergeAverageOperator();

    bool supportsInputCount(size_t count) const override { return count >= 2; }

    void getOutputDimensions(int inputWidth, int inputHeight, int inputChannels,
                             int& outputWidth, int& outputHeight,
                             int& outputChannels) const override;
};

Behavior

  • All inputs must share the same width, height, and channels.
  • Strict mismatch returns cudaErrorInvalidValue at runtime.
  • Output shape equals the first input shape.

Example

cpp
auto merge = std::make_shared<MergeAverageOperator>();
int mergeId = pipeline.addOperator("Merge", merge);
pipeline.connect(leftId, mergeId);
pipeline.connect(rightId, mergeId);

Released under the MIT License.