Skip to content

性能基准测试

Mini-OpenCV (GPU) 与 OpenCV (CPU) 的性能对比。

测试环境

组件规格
GPUNVIDIA RTX 4090 (24GB)
CPUIntel i9-13900K
CUDA12.4
OpenCV4.8 (CPU)
图像尺寸3840×2160 (4K)

性能对比

处理时间

加速比

详细结果

卷积操作

操作图像尺寸CPU (ms)GPU (ms)加速比
高斯模糊 (5×5)4K45.21.237.7×
高斯模糊 (15×15)4K120.53.831.7×
Sobel 边缘检测4K38.10.942.3×
自定义卷积核 (7×7)4K65.32.131.1×

滤波操作

操作图像尺寸CPU (ms)GPU (ms)加速比
中值滤波 (3×3)4K28.42.511.4×
双边滤波4K180.54.837.6×
盒式滤波 (5×5)4K25.20.831.5×
锐化4K42.11.138.3×

几何操作

操作图像尺寸CPU (ms)GPU (ms)加速比
缩放 (2× 放大)4K18.30.630.5×
缩放 (0.5× 缩小)4K8.20.327.3×
旋转 90°4K5.40.227.0×
水平翻转4K2.10.121.0×

直方图操作

操作图像尺寸CPU (ms)GPU (ms)加速比
直方图计算4K3.20.1521.3×
直方图均衡化4K12.30.341.0×
Otsu 阈值4K5.80.2523.2×

CUDA 优化技术

1. 共享内存分块

卷积操作使用共享内存分块减少全局内存访问:

cpp
// 内核使用共享内存缓存图像数据 + 边缘区域
extern __shared__ float sharedMem[];
// 每个线程加载数据到共享内存
// 从快速共享内存计算卷积

收益: 相比朴素全局内存访问提升约 10 倍

2. 原子操作

直方图计算使用原子操作实现并行归约:

cpp
__global__ void histogramKernel(...) {
    atomicAdd(&histogram[value], 1);
}

收益: 无竞争条件的并行直方图计算

3. 纹理内存

图像缩放操作利用纹理内存实现硬件插值:

cpp
cudaBindTextureToArray(texRef, imageArray);
tex2D(texRef, x, y); // 硬件双线性插值

收益: 免费的硬件插值,降低内核复杂度

4. 多流执行

流水线操作使用多个 CUDA 流实现重叠:

cpp
cudaStream_t streams[N];
for (int i = 0; i < N; i++) {
    cudaMemcpyAsync(..., streams[i]);
    kernel<<<..., streams[i]>>>(...);
}

收益: 重叠计算和传输,提高吞吐量

复现基准测试

bash
# 构建基准测试
cmake -S . -B build -DBUILD_BENCHMARKS=ON
cmake --build build -j$(nproc)

# 运行基准测试
./build/bin/benchmark_convolution
./build/bin/benchmark_filters
./build/bin/benchmark_geometric

测试方法

详见 测试方法 了解详细的测试流程和硬件规格。

Released under the MIT License.