OpenCV CUDA模块设备层-----GPU上执行线程安全的 “原子取最大值” 操作函数

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

这是一个 OpenCV 的 CUDA 模块(cv::cudev) 中封装的原子操作函数,用于在 GPU 上执行线程安全的 "原子取最大值" 操作。

将 *address 和 val 进行比较,如果 val > *address,就将 *address = val。

函数原型

cpp 复制代码
__device__ __forceinline__ int cv::cudev::atomicMax(int* address, int val)

参数

参数名 类型 含义
address int* 一个指向设备内存中整型变量的指针。这是你要进行原子最大值比较的目标地址。
val int 要和目标地址值比较的整数值。如果 val > *address,则更新为 val。

返回值

返回修改前 *address 的原始值。

代码示例

cpp 复制代码
#include <cuda_runtime.h>
#include <cstdio>

__global__ void kernel(int* max_value) {
    int tid = threadIdx.x + blockIdx.x * blockDim.x;

    // 使用 CUDA 内建的 atomicMax
    int old = atomicMax(max_value, tid);

    printf("Thread %d: old = %d, new = %s\n",
           tid, old, (tid > old ? "updated" : "not updated"));
}

int main() {
    int h_max = 0;
    int* d_max;

    // 分配设备内存
    cudaMalloc(&d_max, sizeof(int));
    if (!d_max) {
        printf("Failed to allocate device memory!\n");
        return -1;
    }

    // 初始化设备内存
    cudaMemcpy(d_max, &h_max, sizeof(int), cudaMemcpyHostToDevice);

    // 启动核函数
    kernel<<<1, 10>>>(d_max);

    // 显式同步设备
    cudaDeviceSynchronize();  // 等待核函数执行完成

    // 拷贝结果回主机
    cudaMemcpy(&h_max, d_max, sizeof(int), cudaMemcpyDeviceToHost);

    printf("Final max value: %d\n", h_max);  // 应该输出 9

    // 清理资源
    cudaFree(d_max);
    return 0;
}

运行结果

bash 复制代码
Thread 0: old = 0, new = not updated
Thread 1: old = 0, new = updated
Thread 2: old = 1, new = updated
Thread 3: old = 2, new = updated
Thread 4: old = 3, new = updated
Thread 5: old = 4, new = updated
Thread 6: old = 5, new = updated
Thread 7: old = 6, new = updated
Thread 8: old = 7, new = updated
Thread 9: old = 8, new = updated
Final max value: 9
相关推荐
快乐非自愿1 小时前
RAG夺命10连问,你能抗住第几问?
人工智能·面试·程序员
千匠网络3 小时前
破局出海壁垒,千匠网络新能源汽车跨境出海解决方案
人工智能
马丁聊GEO5 小时前
解码AI用户心智,筑牢可信GEO根基——悠易科技深度参与《中国AI用户态度与行为研究报告(2026)》发布会
人工智能·科技
nap-joker5 小时前
Fusion - Mamba用于跨模态目标检测
人工智能·目标检测·计算机视觉·fusion-mamba·可见光-红外成像融合·远距离/伪目标问题
一只幸运猫.5 小时前
2026Java 后端面试完整版|八股简答 + AI 大模型集成技术(最新趋势)
人工智能·面试·职场和发展
Promise微笑6 小时前
2026年国产替代油介损测试仪:油介损全场景解决方案与技术演进
大数据·网络·人工智能
深海鱼在掘金6 小时前
深入浅出 LangChain —— 第三章:模型抽象层
人工智能·langchain·agent
生信碱移6 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
workflower6 小时前
具身智能行业应用-生活服务业
大数据·人工智能·机器人·动态规划·生活
GitCode官方6 小时前
基于昇腾 MindSpeed LLM 玩转 DeepSeekV4-Flash 模型的预训练复现部署
人工智能·开源·atomgit