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

算法描述

在同一个线程块(thread block内,将 [beg, end) 范围内的数据并行地复制到 out 开始的位置。
它使用了 CUDA 线程协作机制(warp-level 或 block-level) 来实现高效的块级拷贝,通常比简单的逐线程拷贝更快。

函数原型

_device__ static __forceinline__ void cv::cudev::blockCopy 	
(InIt  	beg,InIt  	end,OutIt  	out 
) 		

参数

参数名类型含义
begInIt输入范围的起始迭代器(或指针)
endInIt输入范围的结束迭代器(不包含该位置)
outOutIt输出范围的起始迭代器(或指针)

使用场景

  • 图像处理中的 局部块拷贝
  • 构建 GPU 并行归约(reduction)算法前的数据准备
  • 实现滑动窗口(sliding window)或卷积操作时的 tile 数据加载
  • 需要多个线程协同完成连续内存拷贝的任务

示例代码


#include <opencv2/cudev/functional/functional.hpp>
#include <cstdio>
#include <opencv2/core.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudev/block/block.hpp>
#include <iostream>using namespace cv::cudev;// 定义 tile 大小为 16x16
#define TILE_SIZE 16__global__ void processImageKernel(const uchar* input, size_t pitchIn,uchar* output, size_t pitchOut,int width, int height) {// 共享内存用于存储当前线程块处理的 tile__shared__ uchar tile[TILE_SIZE][TILE_SIZE];// 当前线程负责的图像坐标int x = blockIdx.x * TILE_SIZE + threadIdx.x;int y = blockIdx.y * TILE_SIZE + threadIdx.y;// 检查是否在图像范围内if (x >= width || y >= height)return;// 输入和输出指针const uchar* in_ptr = input + y * pitchIn + x;uchar* out_ptr = output + y * pitchOut + x;// 将当前 tile 拷贝到共享内存blockCopy(in_ptr, in_ptr + TILE_SIZE * TILE_SIZE, &tile[0][0]);__syncthreads();  // 必须同步所有线程,确保共享内存拷贝完成// 对 tile 中的数据进行简单处理(比如增加亮度)uchar value = tile[threadIdx.y][threadIdx.x];value = min(value + 50, (uchar)255);// 写回到输出位置blockCopy(&value, &value + 1, out_ptr);
}int main() {// 创建一个测试图像(8UC1)cv::Mat h_src = cv::Mat::zeros(128, 128, CV_8UC1);h_src.setTo(100);  // 填充为灰度值 100// 上传到 GPUcv::cuda::GpuMat d_src, d_dst;d_src.upload(h_src);d_dst.create(h_src.size(), h_src.type());// 设置 kernel 参数dim3 threads(TILE_SIZE, TILE_SIZE);dim3 blocks((h_src.cols + TILE_SIZE - 1) / TILE_SIZE,(h_src.rows + TILE_SIZE - 1) / TILE_SIZE);// 调用 kernelprocessImageKernel<<<blocks, threads>>>(d_src.ptr<uchar>(), d_src.step,d_dst.ptr<uchar>(), d_dst.step,d_src.cols, d_dst.rows);// 下载结果cv::Mat h_dst;d_dst.download(h_dst);// 显示部分结果std::cout << "Output image sample:\n" << h_dst(cv::Rect(0, 0, 5, 5)) << std::endl;return 0;
}

运行结果

Output image sample:
[150,   0,   0,   0,   0;0,   0,   0,   0,   0;0,   0,   0,   0,   0;0,   0,   0,   0,   0;0,   0,   0,   0,   0]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88126.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88126.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88126.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

https没有证书可以访问吗?外网怎么访问内网?

没有SSL证书的网站无法正常通过HTTPS协议访问‌。HTTPS的实现必须依赖有效的SSL证书完成加密握手&#xff0c;否则浏览器会直接阻断连接或显示严重的安全警告。‌‌ 一、技术实现层面‌ ‌HTTPS协议强制要求证书‌。 HTTPS基于SSL/TLS协议实现加密通信&#xff0c;而SSL证书是…

Python pytesseract【OCR引擎库】 简介

想全面了解DeepSeek的看过来 【包邮】DeepSeek全攻略 人人需要的AI通识课 零基础掌握DeepSeek的实用操作手册指南【限量作者亲笔签名版售完即止】 玩转DeepSeek这本就够了 【自营包邮】DeepSeek实战指南 deepseek从入门到精通实用操作指南现代科技科普读物AI普及知识读物人工智…

ubuntu安装postman教程并中文汉化详细教程

一、下载postman安装包 通过网盘分享的文件:Postman-linux-x64-8.7.0.tar.gz 链接: https://pan.baidu.com/s/10WYeguDJlK85cKJ6ptX01w?pwd=xqkh 提取码: xqkh 二、解压到/opt目录 tar -zxvf Postman-linux-x64-8.7.0.tar.gz如果子用户没有/opt权限,可以给子用户赋予/opt的…

《垒球知识科普》垒球世界纪录·垒球1号位

奥运垒球冠军记录 历届冠军榜 1996亚特兰大奥运会 冠军&#xff1a;美国队 ⚡ 首届奥运垒球赛&#xff0c;美国主场3战全胜夺冠&#xff01; 1996 Atlanta Olympics Champion: USA ⚡ Dominated all 3 games in first Olympic softball event 2000悉尼奥运会 冠军&#…

通信网络编程3.0——JAVA

主要添加了私聊功能 1服务器类定义与成员变量 public class ChatServer {int port 6666;// 定义服务器端口号为 6666ServerSocket ss;// 定义一个 ServerSocket 对象用于监听客户端连接//List<Socket> clientSockets new ArrayList<>();// 定义一个列表用于存储…

RediSearch `FT.CREATE` 完全参数指南 HASH/JSON 双写实战

1、索引与 Schema 速概 索引 (index) —— 倒排、前缀、向量、Geo … 元数据集合Schema —— 索引蓝图&#xff1a;定义字段、类型、权重、排序及存储策略FT.CREATE —— 创建索引命令&#xff0c;分「索引级参数」和「字段级参数」两层 2 、FT.CREATE 语法模板 FT.CREATE &…

QT学习教程(三十七)

系统繁忙时的响应&#xff08;Staying Responsive During Intensive Processing&#xff09; 当我们调用QApplication::exec()时&#xff0c;Qt 就开始了事件循环。启动时&#xff0c;Qt 发出显示和绘制事件&#xff0c;把控件显示出来。然后&#xff0c;事件循环就开始了&…

hot100 -- 17.技巧

1.多数元素 问题&#xff1a; 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 方法1&#xff1a; 哈希表 实时判断&#xff…

算法第39天| 打家劫舍 1、2、3

198. 打家劫舍 题目 思路与解法 class Solution { public:int rob(vector<int>& nums) {// dp数组含义&#xff1a;// 考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i]if (nums.size() 0) return 0;if (nums.size() 1)…

车载CAN总线数据采集与故障诊断装置设计与实现

车载CAN总线数据采集与故障诊断装置设计与实现 链接:1.6W字 [下载]摘要1.1 研究背景1.2 研究意义(1)技术提升:推动CAN总线诊断的智能化与实时性(2)经济价值:降低诊断成本与维修时间(3)安全与标准化:促进车联网数据安全体系建设社会效益1.3 国内外研究现状1.3.1 国外研…

布瑞琳BRANEW:高端洗护领航者,铸就品质生活新典范

近日,布瑞琳BRANEW,这一中国高端洗护行业的领军品牌,再次凭借其卓越的服务品质、创新的经营模式以及对行业标准的深度推动,成为市场瞩目的焦点。作为北京2022年冬奥会和残奥会的商业服务保障单位,布瑞琳不仅展现了其无与伦比的服务能力,更在国际舞台上彰显了品牌的非凡影响力。…

AWS服务器扩充硬盘

1、在控制台上将需要扩充的硬盘增加空间 将硬盘大小由原来的50G升级到200G 2、登录所挂载的服务器 1&#xff09;查看硬盘分区情况 adminip-172-31-121-13:~$ sudo lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 200G 0 disk ├─nv…

嵌入式自学第四十二天

PWM:脉冲宽度调制&#xff0c;调节电压为方波。关键参数&#xff1a;占空比、周期。 UART&#xff1a;通用异步收发器。 参与通信的设备&#xff1a;主机host 通信的本质&#xff1a;数据的传递。 通信方式&#xff1a; 单工&#xff1a;只能单向传递 半双工&#xff1a;双向…

人工智能如何重塑教育体系:个性化学习的新时代

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;教育的“智能革命”正在发生 教育作为人类社会发展的基石&#xff0c;始终紧随技术进步不断演化。从印刷术带来知识…

【云原生】基础篇

​一、云原生 1.1 本质与核心技术体系​ 云原生&#xff08;Cloud Native&#xff09;是以容器化、微服务、声明式API和动态编排为核心的架构范式&#xff0c;旨在最大化利用云的弹性、可观测性和自动化能力。其技术栈分层如下&#xff1a; ​1.2、云原生核心技术栈​ ​层级…

实时反欺诈:基于 Spring Boot 与 Flink 构建信用卡风控系统

在金融科技飞速发展的今天&#xff0c;信用卡欺诈手段日益高明和快速。传统的基于批处理的事后分析模式已难以应对实时性要求极高的欺诈场景。本文将详细介绍如何利用 Spring Boot 和 Apache Flink 这对强大的组合&#xff0c;构建一个高性能、可扩展的实时信用卡反欺诈系统。 …

通过apache共享文件

有时候&#xff0c;vmware虚拟机的vmware tools总是安装失败&#xff0c;这样就不能在虚拟机和主机之间共享文件。此时可以利用apache通过文件上传和下载共享文件。 通过下面的php文件&#xff0c;虚拟机作为客户端访问此php&#xff0c;可以在虚拟机和主机之间共享文件。当然…

Maven生命周期,测试

测试 Junit入门 单元测试 单元测试&#xff1a;就是针对最小的功能单元(方法)&#xff0c;编写测试代码对其正确性进行测试。 JUnit&#xff1a;最流行的Java测试框架之一&#xff0c;提供了一些功能&#xff0c;方便程序进行单元测试&#xff08;第三方公司提供&#xff09…

H5调试工具vconsole和Eruda对比

VConsole与Eruda对比分析 VConsole和Eruda是两款主流的移动端JavaScript调试工具&#xff0c;它们在功能定位、使用场景和技术实现上有诸多差异。以下从多个维度进行对比&#xff0c;帮助你选择更适合的工具&#xff1a; 一、核心功能对比 功能维度VConsoleEruda基础日志输出…

Java经典编程题

题目 1&#xff1a;斐波那契数列 题目要求&#xff1a;编写一个方法&#xff0c;输入正整数n&#xff0c;输出斐波那契数列的第n项。斐波那契数列的定义是&#xff1a;F(0)0&#xff0c;F(1)1, 当n > 1时&#xff0c;F(n)F(n - 1)F(n - 2)。 答案&#xff1a; public cla…