`

CUDA中texture的使用

    博客分类:
  • CUDA
阅读更多
任务一:第一个texture程序
我有一点始终搞不明白,编程大牛们为什么总喜欢把简单的事情都说的那么含蓄,让读者看了总是心虚。我也一样,看了很多大牛们对CUDA中texture的讲解,我稀里糊涂的,心里没底,今天我终于发现了一个能让我马上能接受的讲解,所以很有必要做个笔录。
什么是texture,其实就是GPU内存,它只可读,但是在性能上具有很多优势(我现在也没搞明白在哪,一会再去查查),怎么用呢?首先你的在cpu上定义一个texture的参考,也就是绑定到texture的代号(就像我们给陈水扁取名为“阿扁”一样);然后就是绑定texture参考到纹理(gpu内存),利用一些纹理获取函数取得纹理中的数据;最后记得调用unbind函数删除texture。。就这么简单,看个例子:
main.cu
#include <stdio.h>
extern "C" void Blend_GPU( unsigned char* aImg1, unsigned char* aImg2, unsigned char* aImg3, int width, int height, int channel );//声明要调用的Blend_GPU函数

//这个Blend_CPU函数是在CPU上执行,完成和GPU上运行一样的功能,以作对比,功能很简单吧,就不介绍了
void Blend_CPU( unsigned char* aImg1, unsigned char* aImg2,
   unsigned char* aRS,int width, int height, int channel )
{
    for( int i = 0; i < width * height * channel; ++ i )
   aRS[i] = (unsigned char)( 0.5 * aImg1[i] + 0.5 * aImg2[i] );
}
//main函数,入口,初始化数据
void main( int argc, char** argv )
{
   int width   = 1920,height  = 1200, channel = 3;

// 分配4个空间,类型都是unsinged char型,都写在一行了
unsigned char *aImg1 = new unsigned char[ width*height*channel ],
*aImg2 = new unsigned char[ width*height*channel ],
*aRS1  = new unsigned char[ width*height*channel ],
*aRS2  = new unsigned char[ width*height*channel ];
  //初始化数据,aImg1数组里都放0,aImg2里都放200
for( int i = 0; i < width * height * channel; ++ i )
{
aImg1[i] = 0;
aImg2[i] = 200;
}

// 调用CPU端程序
Blend_CPU( aImg1, aImg2, aRS1, width, height, channel );
// 调用Blend_GPU函数,Blend_GPU中会调用gpu端的kernel函数
Blend_GPU( aImg1, aImg2, aRS2, width, height, channel );
// 测试CPU端和GPU端执行的结果是不是一样,不是一样给出错误提示
for( int i = 0; i < width * height * channel; ++ i )
    if( aRS1[i] != aRS2[i] )
      {
         printf( "Error!!!!\n" );
         break;
      }
        printf("success!!");
}

blend_gpu.cu

#define BLOCK_DIM 512
//声明纹理参考,用来绑定纹理,其实也就是个纹理标识
texture<unsigned char, 1, cudaReadModeElementType> rT1;
texture<unsigned char, 1, cudaReadModeElementType> rT2;
//声明函数
extern "C" void Blend_GPU( unsigned char* aImg1, unsigned char* aImg2,unsigned char* aRS,int width, int height, int channel );

//核心代码,在gpu端执行的kernel,
__global__ void Blending_Texture( unsigned char* aRS, int size )
{
    //通过线程ID得到数组下标
int index = blockIdx.x * blockDim.x + threadIdx.x;
   //通过纹理获取函数得到数据再运算,把结果放到aRS数组中去
if( index < size )
aRS[index]  = 0.5 * tex1Dfetch( rT1, index )+ 0.5 * tex1Dfetch( rT2, index );
}

void Blend_GPU( unsigned char* aImg1, unsigned char* aImg2,unsigned char* aRS,int width, int height, int channel )
{
int size = height * width * channel;
int data_size = size * sizeof( unsigned char );

//开辟3个空间
cudaMalloc( (void**)&dev_A, data_size );
cudaMalloc( (void**)&dev_B, data_size );
cudaMalloc( (void**)&dev_C, data_size );

//将host端的数据拷贝到device端
cudaMemcpy( dev_A, aImg1, data_size, cudaMemcpyHostToDevice );
cudaMemcpy( dev_B, aImg2, data_size, cudaMemcpyHostToDevice );

//将纹理参考绑定到device端的两数组 ☆device就是pgu
cudaBindTexture(0, rT1, dev_A );
cudaBindTexture(0, rT2, dev_B );

//调用kernel
Blending_Texture<<< ceil( (float)size / BLOCK_DIM ), BLOCK_DIM >>>( dev_C, size );

//将结果拷贝到host端  ☆host就是CPU
cudaMemcpy( aRS, dev_C, data_size, cudaMemcpyDeviceToHost );

//取消绑定
cudaUnbindTexture(rT1);
cudaUnbindTexture(rT2);

    //释放内存空间
cudaFree(dev_A);
cudaFree(dev_B);
cudaFree(dev_C);
}

任务二:关于运行程序时显示无法打开“包括文件cutil_inline.h”的问题解答
广州一CUDA爱好者朋友问我这个问题,我刚好前两天也遇到过类似问题,还是记录下吧,其实这个问题就是因为环境变量没配置好的原因,cutil_inline.h头文件是在sdk中common下的inc目录,有两种方法解决:
方法一:首先在环境变量中配置CUDA_COMMON_INC_PATH变量,值为sdk下的common下的inc目录,然后右键项目,选择CUDAGeneralAdditional Include Directories中添加;$(CUDA_COMMON_INC_PATH),再执行程序就ok了,
测试程序如下:
方法二:在环境变量CUDA_INC_PATH中添加sdk中common下的inc目录,其原理都一样,都是让程序能够找到那个头文件
测试程序:
main.cu
/********************************************************************
*  main.cu
*  This is a example of the CUDA test program.
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
//为么不能包含这个头文件?
#include <cutil_inline.h>
bool InitCUDA(void)
{
int count = 0;
int i = 0;
cudaGetDeviceCount(&count);
printf("devivce count : %d\n",count);
if ( count == 0 ) {
fprintf( stderr , "There is no device.\n");
return false;
}
for ( i = 0 ; i < count ; i++) {
cudaDeviceProp prop;
if ( cudaGetDeviceProperties(&prop,i) == cudaSuccess ) {
printf("Name : %s\n", prop.name);
printf("totalGlobalMem : %u MB \n" , prop.totalGlobalMem / (1024 * 1024));
printf("sharedMemPerBlock : %u KB \n" , prop.sharedMemPerBlock / 1024 );
printf("regsPerBlock:%d \n", prop.regsPerBlock);
printf("warpSize : %d \n" , prop.warpSize);
printf("memPitch : %u \n", prop.memPitch);
printf("maxThreadPerBlock %d \n" , prop.maxThreadsPerBlock ) ;
printf("maxThreadsDim:x %d, y %d, z %d\n",prop.maxThreadsDim[0],prop.maxThreadsDim[1] , prop.maxThreadsDim[2]);
printf("maxGridSize:x %d, y %d, z%d\n", prop.maxGridSize[0],prop.maxGridSize[0] , prop.maxGridSize[1], prop.maxGridSize[2]);
printf("totalConstMem:%u\n" , prop.totalConstMem);
printf("major:%d\n",prop.major);
printf("minor:%d\n",prop.minor);
printf("clockRate:%d\n",prop.clockRate);
printf("textureAlignment:%u\n",prop.textureAlignment);
if ( prop.major >= 1 ) {
break;
}
}
}
if ( i == count) {
fprintf(stderr, "There is no device supporting CUDA 1.x.\n");
return false;
}
cudaSetDevice(i);
printf("CUDA initialized. \n");
return true;
}
int main(int argc , char ** argv)
{
InitCUDA();
//cutilDeviceInit(argc, argv);
return 0;
}
分享到:
评论
1 楼 往事也加 2015-12-27  
//声明纹理参考,用来绑定纹理,其实也就是个纹理标识
texture<unsigned char, 1, cudaReadModeElementType> rT1;
texture<unsigned char, 1, cudaReadModeElementType> rT2; //无法识别texture
请问需要加入哪个头文件,才能够使用texture
十分感谢

相关推荐

    CUDA图像处理 不带texture

    用CUDA处理图像的一个demo,这个demo中用到了opencv,但是未使用texture

    CUDA cpp class texture demo

    CUDA cpp class texture demo MD5:a740adf3cbdbd2dcf823a120a0eec9d7 cuda_cpp_class_texture_demo.rar

    cuda检测工具 devicequery.zip(不含源代码,源代码在cuda sdk 8.0里)

    cuda检测工具 devicequery.zip(不含源代码,源代码在cuda sdk 8.0里) deviceQuery.exe Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) ...

    cuda检测工具 devicequery.exe

    deviceQuery.exe Starting... CUDA Device Query (Runtime ...deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 9.1, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GeForce GTX 650 Result = PASS

    《GPU高性能计算之CUDA》实例

    对应书中章节 备注 ACsearch_DPPcompact_with_driver 5.2.2 AC多模式匹配算法 asyncAPI 2.5 异步API调用示例 bandwidthTest 2.3.6 带宽测试 Bitonic 5.1.1 双调排序网络 ...

    CUDA和OpenGL互操作的实现及分析

    CUDA和OpenGL互操作的基本方式是使用CUDA生成数据,再利用OpenGL在屏幕上绘制出数据所表示的图形。两者的结合可以通过使用OpenGL的PBO(像素缓冲区对象)或VBO(顶点缓冲区对象)两种方式来实现。描述了CUDA和OpenGL互...

    GPU高性能计算之CUDA》实例

    对应书中章节 备注 ACsearch_DPPcompact_with_driver 5.2.2 AC多模式匹配算法 asyncAPI 2.5 异步API调用示例 bandwidthTest 2.3.6 带宽测试 Bitonic 5.1.1 双调排序网络 ...

    矩阵序列matlab代码-kNN-CUDA:使用GPU快速进行k最近邻搜索

    矩阵序列matlab代码介绍 k最近邻算法(k-NN)是广泛用于分类和回归的机器学习算法。 k-NN算法被用于许多研究和工业领域,...knn_cuda_texture使用用于存储参考点的GPU纹理内存和用于存储其他阵列的GPU全局内存来计算

    抛雪球法splatting

    学习ct的同学,以及三维可视化重建的同学可以看下,很有帮助的

    一种基于自适应CUDA加速邻域匹配框架的改进的图像类比方法

    在本文中,我们提出了一种基于CUDA的图像相似度匹配算法。 我们的算法根据图像的不同纹理特征在合成过程中自适应地应用了精确的L(2)最近邻和k相干搜索策略的全局搜索,这对于非均匀纹理特别有用。 为了在GPU上...

    TextureMixer:CVPR'19论文“纹理混合器:纹理的可控制合成和插值网络”的正式Tensorflow实现

    NVIDIA GPU + CUDA 10.0 + CuDNN 7.5 Python 3.6 张量流gpu 1.12 要安装其他Python依赖项,请运行pip3 install -r requirements.txt 。 将库克隆到当前目录中。 数据集:动物纹理,地球纹理,植物纹理 可从以...

    gl:OpenGL 4.6核心配置文件的C ++ 11包装器

    切换CUDA_INTEROP_SUPPORT以获得Cuda互操作支持。 请注意,启用此选项后,版本会询问Cuda的位置。 入门 创建数据并将其上传到缓冲区: # include void buffer_example () { gl::buffer buffer; std::vector...

    NYU CUDA Advanced Techniques 4 - Slides-计算机科学

    Advanced Techniques 4This Lectures• Texture memory• A glimpse on libraries• Power-aware programming• Putting it all togetherTexture MemoryTexture Memory• read-only memory• Can improve ...

    MultiTextureSynthesis:CVPR17“具有前馈网络的多样化纹理合成”的源代码

    texture_diverse_synthesis_train.lua -texture YourTextureExample.jpg -image_size 256 -diversity_weight -1.0测验 th single_texture_diverse_synthesis_test.lua获得所有不同的结果后,在Matlab中运行gif.m...

    GPU-Zv2.19.0

    GPU-Z可以列出目前全线NVIDIA、AMD/ATI、英特尔等厂牌的显卡详细数据,包括GPU名称、代码、核心名称、制程、...Computing:支持的技术AMD/ATI OpenCL,NVIDIA CUDA,NVIDIA PhysX,支持的着色器版本DirectCompture 5.0

    一种优化的数字纹理合成方法及其视觉应用

    我们的算法通过将纹理优化结合到TBN框架中并进行了两项改进,从而产生了高质量的合成结果。 采用初始化过程生成全局优化算法的初始输出,从而加快了算法的收敛速度,提高了合成质量。 除了用于度量图像相似性的距离...

    GPU适用的并行纹理合成算法

    基于样图的纹理合成是一个大计算量过程,为了利用GPU的并行计算能力进行大规模纹理合成,我们提出一种并行纹理合成算法.该算法综合块查找和全局纹理优化算法分多遍进行纹理的合成和优化,其中每一遍分为串行纹理块定位...

Global site tag (gtag.js) - Google Analytics