cuda纹理内存的使用
CUDA纹理内存的访问速度比全局内存要快,因此处理图像数据时,使用纹理内存是一个提升性能的好方法。
贴一段自己写的简单的实现两幅图像加权和的代码,使用纹理内存实现。
输入:两幅图 lena, moon

输出:两幅图像加权和

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h> using namespace std;
using namespace cv; //声明CUDA纹理
texture <uchar4, cudaTextureType2D, cudaReadModeNormalizedFloat> refTex1;
texture <uchar4, cudaTextureType2D, cudaReadModeNormalizedFloat> refTex2;
//声明CUDA数组
cudaArray* cuArray1;
cudaArray* cuArray2;
//通道数
cudaChannelFormatDesc cuDesc = cudaCreateChannelDesc<uchar4>(); __global__ void weightAddKerkel(uchar *pDstImgData, int imgHeight, int imgWidth,int channels)
{
const int tidx=blockDim.x*blockIdx.x+threadIdx.x;
const int tidy=blockDim.y*blockIdx.y+threadIdx.y; if (tidx<imgWidth && tidy<imgHeight)
{
float4 lenaBGR,moonBGR;
//使用tex2D函数采样纹理
lenaBGR=tex2D(refTex1, tidx, tidy);
moonBGR=tex2D(refTex2, tidx, tidy); int idx=(tidy*imgWidth+tidx)*channels;
float alpha=0.5;
pDstImgData[idx+]=(alpha*lenaBGR.x+(-alpha)*moonBGR.x)*;
pDstImgData[idx+]=(alpha*lenaBGR.y+(-alpha)*moonBGR.y)*;
pDstImgData[idx+]=(alpha*lenaBGR.z+(-alpha)*moonBGR.z)*;
pDstImgData[idx+]=;
}
} void main()
{
Mat Lena=imread("data/lena.jpg");
Mat moon=imread("data/moon.jpg");
cvtColor(Lena, Lena, CV_BGR2BGRA);
cvtColor(moon, moon, CV_BGR2BGRA);
int imgWidth=Lena.cols;
int imgHeight=Lena.rows;
int channels=Lena.channels(); //设置纹理属性
cudaError_t t;
refTex1.addressMode[] = cudaAddressModeClamp;
refTex1.addressMode[] = cudaAddressModeClamp;
refTex1.normalized = false;
refTex1.filterMode = cudaFilterModeLinear;
//绑定cuArray到纹理
cudaMallocArray(&cuArray1, &cuDesc, imgWidth, imgHeight);
t = cudaBindTextureToArray(refTex1, cuArray1); refTex2.addressMode[] = cudaAddressModeClamp;
refTex2.addressMode[] = cudaAddressModeClamp;
refTex2.normalized = false;
refTex2.filterMode = cudaFilterModeLinear;
cudaMallocArray(&cuArray2, &cuDesc, imgWidth, imgHeight);
t = cudaBindTextureToArray(refTex2, cuArray2); //拷贝数据到cudaArray
t=cudaMemcpyToArray(cuArray1, ,, Lena.data, imgWidth*imgHeight*sizeof(uchar)*channels, cudaMemcpyHostToDevice);
t=cudaMemcpyToArray(cuArray2, ,, moon.data, imgWidth*imgHeight*sizeof(uchar)*channels, cudaMemcpyHostToDevice); //输出图像
Mat dstImg=Mat::zeros(imgHeight, imgWidth, CV_8UC4);
uchar *pDstImgData=NULL;
t=cudaMalloc(&pDstImgData, imgHeight*imgWidth*sizeof(uchar)*channels); //核函数,实现两幅图像加权和
dim3 block(,);
dim3 grid( (imgWidth+block.x-)/block.x, (imgHeight+block.y-)/block.y );
weightAddKerkel<<<grid, block, >>>(pDstImgData, imgHeight, imgWidth, channels);
cudaThreadSynchronize(); //从GPU拷贝输出数据到CPU
t=cudaMemcpy(dstImg.data, pDstImgData, imgWidth*imgHeight*sizeof(uchar)*channels, cudaMemcpyDeviceToHost); //显示
namedWindow("show");
imshow("show", dstImg);
waitKey();
}
cuda纹理内存的使用的更多相关文章
- CUDA 纹理内存
原文链接 1.概述 纹理存储器中的数据以一维.二维或者三维数组的形式存储在显存中,可以通过缓存加速访问,并且可以声明大小比常数存储器要大的多. 在kernel中访问纹理存储器的操作称为纹理拾取(tex ...
- CUDA一维纹理内存
纹理一词来源于GPU图形世界,GPU通用并行计算"盗用"了纹理一词,定义了一个纹理内存的概念.纹理内存缓存在 设备上,在某些情况下能减少对内存的请求并降低内存带宽的使用,是专门为那 ...
- 《GPU高性能编程CUDA实战》第七章 纹理内存
▶ 本章介绍了纹理内存的使用,并给出了热传导的两个个例子.分别使用了一维和二维纹理单元. ● 热传导(使用一维纹理) #include <stdio.h> #include "c ...
- CUDA中多维数组以及多维纹理内存的使用
纹理存储器(texture memory)是一种只读存储器,由GPU用于纹理渲染的图形专用单元发展而来,因此也提供了一些特殊功能.纹理存储器中的数据位于显存,但可以通过纹理缓存加速读取.在纹理存储器中 ...
- CUDA:纹理内存
纹理内存: 与常量内存类似,纹理内存是另一种形式的只读内存,并且同样缓存在芯片上.因此某些情况下能够减少对内存的请求并提供高效的内存带宽.纹理内存是专门为那些在内存访问模式中存在大量空间局部性的图形应 ...
- CUDA二维纹理内存+OpenCV图像滤波
CUDA和OpenCV混合编程,使用CUDA的纹理内存,实现图像的二值化以及滤波功能. #include <cuda_runtime.h> #include <highgui/hig ...
- 基于纹理内存的CUDA热传导模拟
原文链接 项目中有三个,第一个是全局内存,其余两个分别是基于1d和2d纹理内存.项目打包下载. 纹理内存是只读内存,与常量内存相同的是,纹理内存也缓存在芯片中,因此某些情况下,它能减少对内存的请求并提 ...
- CUDA纹理绑定
纹理绑定的一般步骤: size_t fea_pitch; texture<unsigned char, 2> features2D; cudaMallocPitch((void**)(&a ...
- CUDA零内存拷贝 疑问考证
今天思考了一下CUDA零内存拷贝的问题,感觉在即将设计的程序中会派上用场,于是就查了一下相关信息. 以下是一些有帮助的链接: cuda中的零拷贝用法--针对二维指针 cuda中的零拷贝用法--针对一维 ...
随机推荐
- 数组a[n]中存放1-n中的n-1个数,给出算法找出重复的那一个数
问题描述: 数组a[n]中存放1-n中的n-1个数,给出算法找出重复的那一个数. 算法一: 对数组a[n]进行冒泡排序,如果冒泡所得的最值和前一个最值相等,则该最值为重复的数. 分析: 该算法时间复杂 ...
- Vue 爬坑之路(五)—— 组件进阶
组件(Component)是 Vue.js 最强大的功能之一,之前的文章都只是用到了基本的封装功能,这次将介绍一些更强大的扩展. 一.基本用法 在使用 vue-cli 创建的项目中,组件的创建非常方便 ...
- SQL2005 到 SQL2008R2 发布订阅----发布'xxxxx'的初始快照尚不可用。
步骤略! SQL2005 到 SQL2008R2 发布订阅----发布'xxxxx'的初始快照尚不可用. 发布库快照已经创建完成为什么到订阅就快照不可用呢! 订阅通过日志读取代理解析! 查了下代理安全 ...
- js小知识-replace的回调函数
replace() 方法返回一个由替换值替换一些或所有匹配的模式后的新字符串.模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数. 注意:原字符串不会改变. ...
- python的defaultdict
defaultdict是dict的一个子类,接受一个工厂函数作为参数,当访问defaultdict中不存在的key时,会将工厂函数的返回值作为默认的value. class defaultdict(d ...
- 强化学习之Q-learning ^_^
许久没有更新重新拾起,献于小白 这次介绍的是强化学习 Q-learning,Q-learning也是离线学习的一种 关于Q-learning的算法详情看 传送门 下文中我们会用openai gym来做 ...
- 分享一个大神自己的blog
std::sort() 详解 http://feihu.me/blog/ C++11 新特性 http://blog.guoyb.com/2016/09/19/cpp11-all/ unity3d 相 ...
- 【LCT】BZOJ2049 [SDOI2008]Cave 洞穴勘测
2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 10059 Solved: 4863[Submit ...
- 【转载】mysql binlog日志自动清理及手动删除
说明:当开启mysql数据库主从时,会产生大量如mysql-bin.00000* log的文件,这会大量耗费您的硬盘空间.mysql-bin.000001mysql-bin.000002mysql-b ...
- VS如何设置类或函数前不显示引用的数量
问题如下: 取消显示这个引用的步骤: 找到菜单栏: 工具 ---> 选项 ---> 文本编辑器 ---> 所有语言 ---> CodeLens 设置取消启用CodeLens, ...