OpenCV CUDA模块设备层-----原子操作函数atomicAdd()

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

算法描述

对指定地址的整型变量进行原子加法操作。在多个 CUDA 线程同时访问同一内存位置时,保证操作的原子性。

这个函数本质上是对 CUDA 内建函数 atomicAdd() 的简单封装,用于在 GPU 上实现线程安全的累加操作。

CUDA 提供了多种类型的 atomicAdd(),支持 int, unsigned int, float, double(某些设备还支持 int64_t 和 unsigned long long)等类型。

该函数实现了一个 原子加法操作:将一个整型值 val 添加到 address 所指向的内存位置,并返回这个地址处的原始值。

  • "原子" 表示该操作是不可中断的,在多个线程同时访问同一内存位置时,保证数据一致性。
  • 适用于图像统计、直方图计算、计数器等需要并发写入的场景。

函数原型

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

参数

参数名 类型 含义
address int* 一个指向设备内存(global memory)中的整型变量的指针。这是你要进行原子加法的目标地址。
val int 要加到目标地址上的整数值。

返回值

返回执行加法前该地址处的原始值。

代码示例

cpp 复制代码
#include <opencv2/cudev/functional/functional.hpp>
#include <opencv2/cudev/util/atomic.hpp>
#include <cstdio>

__global__ void atomic_add_kernel(int* data) {
    // 每个线程都尝试对同一个地址加 1
    int old = cv::cudev::atomicAdd(data, 1);
    printf("Thread %d: old value = %d, new value = %d\n", threadIdx.x + blockIdx.x * blockDim.x, old, old + 1);
}

int main() {
    int h_data = 0;
    int* d_data;
    cudaMalloc(&d_data, sizeof(int));
    cudaMemcpy(d_data, &h_data, sizeof(int), cudaMemcpyHostToDevice);

    // 启动 256 个线程
    atomic_add_kernel<<<1, 256>>>(d_data);

    // 同步并拷贝回主机
    cudaMemcpy(&h_data, d_data, sizeof(int), cudaMemcpyDeviceToHost);
    cudaDeviceReset();

    printf("Final value: %d\n", h_data); // 应为 256
    return 0;
}

运行结果

bash 复制代码
Thread 128: old value = 0, new value = 1
Thread 129: old value = 1, new value = 2
Thread 130: old value = 2, new value = 3
Thread 131: old value = 3, new value = 4
Thread 132: old value = 4, new value = 5
Thread 133: old value = 5, new value = 6
Thread 134: old value = 6, new value = 7
Thread 135: old value = 7, new value = 8
Thread 136: old value = 8, new value = 9
Thread 137: old value = 9, new value = 10
Thread 138: old value = 10, new value = 11
Thread 139: old value = 11, new value = 12
Thread 140: old value = 12, new value = 13
Thread 141: old value = 13, new value = 14
Thread 142: old value = 14, new value = 15
Thread 143: old value = 15, new value = 16
Thread 144: old value = 16, new value = 17
Thread 145: old value = 17, new value = 18
Thread 146: old value = 18, new value = 19
Thread 147: old value = 19, new value = 20
Thread 148: old value = 20, new value = 21
Thread 149: old value = 21, new value = 22
Thread 150: old value = 22, new value = 23
Thread 151: old value = 23, new value = 24
Thread 152: old value = 24, new value = 25
Thread 153: old value = 25, new value = 26
Thread 154: old value = 26, new value = 27
Thread 155: old value = 27, new value = 28
Thread 156: old value = 28, new value = 29
Thread 157: old value = 29, new value = 30
Thread 158: old value = 30, new value = 31
Thread 159: old value = 31, new value = 32
Thread 0: old value = 128, new value = 129
Thread 1: old value = 129, new value = 130
Thread 2: old value = 130, new value = 131
Thread 3: old value = 131, new value = 132
Thread 4: old value = 132, new value = 133
Thread 5: old value = 133, new value = 134
Thread 6: old value = 134, new value = 135
Thread 7: old value = 135, new value = 136
Thread 8: old value = 136, new value = 137
Thread 9: old value = 137, new value = 138
Thread 10: old value = 138, new value = 139
Thread 11: old value = 139, new value = 140
Thread 12: old value = 140, new value = 141
Thread 13: old value = 141, new value = 142
Thread 14: old value = 142, new value = 143
Thread 15: old value = 143, new value = 144
Thread 16: old value = 144, new value = 145
Thread 17: old value = 145, new value = 146
Thread 18: old value = 146, new value = 147
Thread 19: old value = 147, new value = 148
Thread 20: old value = 148, new value = 149
Thread 21: old value = 149, new value = 150
Thread 22: old value = 150, new value = 151
Thread 23: old value = 151, new value = 152
Thread 24: old value = 152, new value = 153
Thread 25: old value = 153, new value = 154
Thread 26: old value = 154, new value = 155
Thread 27: old value = 155, new value = 156
Thread 28: old value = 156, new value = 157
Thread 29: old value = 157, new value = 158
Thread 30: old value = 158, new value = 159
Thread 31: old value = 159, new value = 160
Thread 32: old value = 160, new value = 161
Thread 33: old value = 161, new value = 162
Thread 34: old value = 162, new value = 163
Thread 35: old value = 163, new value = 164
Thread 36: old value = 164, new value = 165
Thread 37: old value = 165, new value = 166
Thread 38: old value = 166, new value = 167
Thread 39: old value = 167, new value = 168
Thread 40: old value = 168, new value = 169
Thread 41: old value = 169, new value = 170
Thread 42: old value = 170, new value = 171
Thread 43: old value = 171, new value = 172
Thread 44: old value = 172, new value = 173
Thread 45: old value = 173, new value = 174
Thread 46: old value = 174, new value = 175
Thread 47: old value = 175, new value = 176
Thread 48: old value = 176, new value = 177
Thread 49: old value = 177, new value = 178
Thread 50: old value = 178, new value = 179
Thread 51: old value = 179, new value = 180
Thread 52: old value = 180, new value = 181
Thread 53: old value = 181, new value = 182
Thread 54: old value = 182, new value = 183
Thread 55: old value = 183, new value = 184
Thread 56: old value = 184, new value = 185
Thread 57: old value = 185, new value = 186
Thread 58: old value = 186, new value = 187
Thread 59: old value = 187, new value = 188
Thread 60: old value = 188, new value = 189
Thread 61: old value = 189, new value = 190
Thread 62: old value = 190, new value = 191
Thread 63: old value = 191, new value = 192
Thread 160: old value = 32, new value = 33
Thread 161: old value = 33, new value = 34
Thread 162: old value = 34, new value = 35
Thread 163: old value = 35, new value = 36
Thread 164: old value = 36, new value = 37
Thread 165: old value = 37, new value = 38
Thread 166: old value = 38, new value = 39
Thread 167: old value = 39, new value = 40
Thread 168: old value = 40, new value = 41
Thread 169: old value = 41, new value = 42
Thread 170: old value = 42, new value = 43
Thread 171: old value = 43, new value = 44
Thread 172: old value = 44, new value = 45
Thread 173: old value = 45, new value = 46
Thread 174: old value = 46, new value = 47
Thread 175: old value = 47, new value = 48
Thread 176: old value = 48, new value = 49
Thread 177: old value = 49, new value = 50
Thread 178: old value = 50, new value = 51
Thread 179: old value = 51, new value = 52
Thread 180: old value = 52, new value = 53
Thread 181: old value = 53, new value = 54
Thread 182: old value = 54, new value = 55
Thread 183: old value = 55, new value = 56
Thread 184: old value = 56, new value = 57
Thread 185: old value = 57, new value = 58
Thread 186: old value = 58, new value = 59
Thread 187: old value = 59, new value = 60
Thread 188: old value = 60, new value = 61
Thread 189: old value = 61, new value = 62
Thread 190: old value = 62, new value = 63
Thread 191: old value = 63, new value = 64
Thread 64: old value = 192, new value = 193
Thread 65: old value = 193, new value = 194
Thread 66: old value = 194, new value = 195
Thread 67: old value = 195, new value = 196
Thread 68: old value = 196, new value = 197
Thread 69: old value = 197, new value = 198
Thread 70: old value = 198, new value = 199
Thread 71: old value = 199, new value = 200
Thread 72: old value = 200, new value = 201
Thread 73: old value = 201, new value = 202
Thread 74: old value = 202, new value = 203
Thread 75: old value = 203, new value = 204
Thread 76: old value = 204, new value = 205
Thread 77: old value = 205, new value = 206
Thread 78: old value = 206, new value = 207
Thread 79: old value = 207, new value = 208
Thread 80: old value = 208, new value = 209
Thread 81: old value = 209, new value = 210
Thread 82: old value = 210, new value = 211
Thread 83: old value = 211, new value = 212
Thread 84: old value = 212, new value = 213
Thread 85: old value = 213, new value = 214
Thread 86: old value = 214, new value = 215
Thread 87: old value = 215, new value = 216
Thread 88: old value = 216, new value = 217
Thread 89: old value = 217, new value = 218
Thread 90: old value = 218, new value = 219
Thread 91: old value = 219, new value = 220
Thread 92: old value = 220, new value = 221
Thread 93: old value = 221, new value = 222
Thread 94: old value = 222, new value = 223
Thread 95: old value = 223, new value = 224
Thread 224: old value = 96, new value = 97
Thread 225: old value = 97, new value = 98
Thread 226: old value = 98, new value = 99
Thread 227: old value = 99, new value = 100
Thread 228: old value = 100, new value = 101
Thread 229: old value = 101, new value = 102
Thread 230: old value = 102, new value = 103
Thread 231: old value = 103, new value = 104
Thread 232: old value = 104, new value = 105
Thread 233: old value = 105, new value = 106
Thread 234: old value = 106, new value = 107
Thread 235: old value = 107, new value = 108
Thread 236: old value = 108, new value = 109
Thread 237: old value = 109, new value = 110
Thread 238: old value = 110, new value = 111
Thread 239: old value = 111, new value = 112
Thread 240: old value = 112, new value = 113
Thread 241: old value = 113, new value = 114
Thread 242: old value = 114, new value = 115
Thread 243: old value = 115, new value = 116
Thread 244: old value = 116, new value = 117
Thread 245: old value = 117, new value = 118
Thread 246: old value = 118, new value = 119
Thread 247: old value = 119, new value = 120
Thread 248: old value = 120, new value = 121
Thread 249: old value = 121, new value = 122
Thread 250: old value = 122, new value = 123
Thread 251: old value = 123, new value = 124
Thread 252: old value = 124, new value = 125
Thread 253: old value = 125, new value = 126
Thread 254: old value = 126, new value = 127
Thread 255: old value = 127, new value = 128
Thread 96: old value = 224, new value = 225
Thread 97: old value = 225, new value = 226
Thread 98: old value = 226, new value = 227
Thread 99: old value = 227, new value = 228
Thread 100: old value = 228, new value = 229
Thread 101: old value = 229, new value = 230
Thread 102: old value = 230, new value = 231
Thread 103: old value = 231, new value = 232
Thread 104: old value = 232, new value = 233
Thread 105: old value = 233, new value = 234
Thread 106: old value = 234, new value = 235
Thread 107: old value = 235, new value = 236
Thread 108: old value = 236, new value = 237
Thread 109: old value = 237, new value = 238
Thread 110: old value = 238, new value = 239
Thread 111: old value = 239, new value = 240
Thread 112: old value = 240, new value = 241
Thread 113: old value = 241, new value = 242
Thread 114: old value = 242, new value = 243
Thread 115: old value = 243, new value = 244
Thread 116: old value = 244, new value = 245
Thread 117: old value = 245, new value = 246
Thread 118: old value = 246, new value = 247
Thread 119: old value = 247, new value = 248
Thread 120: old value = 248, new value = 249
Thread 121: old value = 249, new value = 250
Thread 122: old value = 250, new value = 251
Thread 123: old value = 251, new value = 252
Thread 124: old value = 252, new value = 253
Thread 125: old value = 253, new value = 254
Thread 126: old value = 254, new value = 255
Thread 127: old value = 255, new value = 256
Thread 192: old value = 64, new value = 65
Thread 193: old value = 65, new value = 66
Thread 194: old value = 66, new value = 67
Thread 195: old value = 67, new value = 68
Thread 196: old value = 68, new value = 69
Thread 197: old value = 69, new value = 70
Thread 198: old value = 70, new value = 71
Thread 199: old value = 71, new value = 72
Thread 200: old value = 72, new value = 73
Thread 201: old value = 73, new value = 74
Thread 202: old value = 74, new value = 75
Thread 203: old value = 75, new value = 76
Thread 204: old value = 76, new value = 77
Thread 205: old value = 77, new value = 78
Thread 206: old value = 78, new value = 79
Thread 207: old value = 79, new value = 80
Thread 208: old value = 80, new value = 81
Thread 209: old value = 81, new value = 82
Thread 210: old value = 82, new value = 83
Thread 211: old value = 83, new value = 84
Thread 212: old value = 84, new value = 85
Thread 213: old value = 85, new value = 86
Thread 214: old value = 86, new value = 87
Thread 215: old value = 87, new value = 88
Thread 216: old value = 88, new value = 89
Thread 217: old value = 89, new value = 90
Thread 218: old value = 90, new value = 91
Thread 219: old value = 91, new value = 92
Thread 220: old value = 92, new value = 93
Thread 221: old value = 93, new value = 94
Thread 222: old value = 94, new value = 95
Thread 223: old value = 95, new value = 96
Final value: 256
相关推荐
陈广亮11 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬11 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia12 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区12 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两15 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
前端付豪15 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
strayCat2325515 小时前
Clawdbot 源码解读 7: 扩展机制
人工智能·开源
王鑫星15 小时前
SWE-bench 首次突破 80%:Claude Opus 4.5 发布,Anthropic 的野心不止于写代码
人工智能
lnix15 小时前
当“大龙虾”养在本地:我们离“反SaaS”的AI未来还有多远?
人工智能·aigc