- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
是OpenCV的cv::cudev模块中一个用于线程块内初始化连续内存区域的设备端工具函数。
该函数的作用是:
在一个线程块内对一段输出内存区域进行递增赋值(iota)操作,即:
bash
*dest++ = value++;
常用于以下场景:
- 初始化数组;
- 构建索引数组;
- 图像 ROI 编号;
- 线程块内部生成局部索引;
- 构造单调递增的 ID 数组等。
函数原型
cpp
__device__ static __forceinline__ void cv::cudev::blockYota
(
OutIt beg,
OutIt end,
T value
)
参数
参数名 | 类型 | 含义 |
---|---|---|
beg | OutIt | 输出序列起始迭代器(或指针) |
end | OutIt | 输出序列结束迭代器(或指针) |
value | T | 起始值,每个元素依次递增 1 |
注意:这里的 OutIt 可以是原始指针、CUDA 设备内存指针、或者 OpenCV cudev 的包装迭代器类型。
代码示例
cpp
#include <opencv2/cudev/block/block.hpp> // for blockYota
#include <opencv2/core/cuda.hpp>
#include <iostream>
using namespace cv::cudev;
#define BLOCK_SIZE 16
__global__ void yotaKernel(int* output) {
__shared__ int smem[BLOCK_SIZE];
// 使用 blockYota 初始化共享内存为 [100, 101, ..., 115]
blockYota(smem, smem + BLOCK_SIZE, 100);
// 将结果写入全局内存
int tid = threadIdx.x;
output[tid] = smem[tid];
}
int main() {
int h_output[BLOCK_SIZE];
int* d_output;
cudaMalloc(&d_output, sizeof(int) * BLOCK_SIZE);
yotaKernel<<<1, BLOCK_SIZE>>>(d_output);
cudaMemcpy(h_output, d_output, sizeof(int) * BLOCK_SIZE, cudaMemcpyDeviceToHost);
std::cout << "blockYota result:\n";
for (int i = 0; i < BLOCK_SIZE; ++i)
std::cout << h_output[i] << " ";
std::cout << std::endl;
cudaFree(d_output);
return 0;
}
运行结果
bash
blockYota result:
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115