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
相关推荐
北极的树4 分钟前
深度解读斯坦福AI就业报告:未来哪些工作是“绿灯”,哪些是“红灯”?
人工智能
点云侠31 分钟前
PCL 点云旋转的轴角表示法
人工智能·线性代数·算法·计算机视觉·矩阵
quickeryi31 分钟前
深入浅出AI Agent(What & When)
人工智能
love530love1 小时前
【新手向】GitHub Desktop 的使用说明(含 GitHub Desktop 和 Git 的功能对比)
人工智能·windows·git·python·github
struggle20251 小时前
nn4dms开源程序是用于深度突变扫描数据的神经网络
人工智能·深度学习·神经网络
吹风看太阳1 小时前
机器学习15-XGBoost
人工智能·机器学习·机器人
Code_流苏1 小时前
吴恩达:从斯坦福到 Coursera,他的深度学习布道之路
人工智能·深度学习·机器学习·ai·coursera·吴恩达
一个热爱生活的普通人1 小时前
如何开发一个可以在命令行执行的Coding Agent
人工智能·go·aigc
yzx9910132 小时前
最具有实际意义价值的比赛项目
人工智能·深度学习·机器学习
cylat2 小时前
Day38 Dataset和Dataloader类
人工智能·python·深度学习·神经网络·机器学习