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中的零拷贝用法--针对一维 ...
随机推荐
- C语言学生管理系统(原版本)(自编)
/*系统特色:(大牛勿笑) *颜色提示 *文字提示 *功能 */ #include <stdio.h> #include <stdlib.h> #include <mat ...
- python实现散列表的直接寻址法
散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数, 将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速 ...
- CentOS下LAMP环境安装配置
本来几下yum都能装好的,yum却出问题了,报错:AttributeError: 'YumBaseCli' object has no attribute '_not_found_i',可能是某个文件 ...
- MVC WebAPI自动生成帮助文档(转)
注意点: 1.mvc的控制器必须继承于ApiController,否则看不到的 2. 简单查看xml,根据第二步即可生成xml,可视感比较低,但是内容全部有,不限定于Api 以下为转载正文 ===== ...
- opencv提供的带参数例程
body { font-family: @微软雅黑; font-size: 8pt; line-height: 1.5 } html,body { color: inherit; background ...
- ionic滑动框 ---轮播图(ion-slide-box) 的使用
1. html : <ion-slide-box auto-play="true" slide-interval=3000 show-pager="false&qu ...
- css-翻页
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- npm package.json文件解读
每个Nodejs项目的根目录下面,一般都会有一个package.json文件.该文件可以由npm init生成,定义了项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据). pa ...
- 解决html文件的DropFileName = "svchost.exe"木马
首先表示强烈谴责,没事写出这种木马来.导致开发者把时间花在解决这种问题上. 这种木马会在你全盘的html文件的最底部生成一堆vbscript代码,导致html文件变得很大.大概213kb.可以看出他就 ...
- es6 模板字变量和字符串占位符
开发者一直在寻找一种创建多行字符串的形式,但要使用单引号双引号字符串一定要在同一行才行. 老办法: 还有其他办法,虽然能实现,但是太啰嗦 es6模板自变量 使用反撇好(`)替换了单双引号 反撇好中的所 ...