CUDA Texture纹理存储器 示例程序

原文链接

  1 /*
  2 * Copyright 徐洪志(西北农林科技大学.信息工程学院).  All rights reserved.
  3 * Data: 2012-4-20
  4 */
  5 //
  6 // 此程序是演示了1D和2D纹理存储器的使用
  7 #include <stdio.h>
  8 #include <cutil_inline.h>
  9 #include <iostream>
 10 using namespace std;
 11
 12 texture<float> texRef1D;     // 1D texture
 13 texture<float, 2> texRef2D;  // 2D texture
 14
 15 // 1D 纹理操作函数
 16 __global__ void Texture1D(float *dst, int w, int h)
 17 {
 18     int x = threadIdx.x + blockIdx.x * blockDim.x;
 19     int y = threadIdx.y + blockIdx.y * blockDim.y;
 20     int offset = x + y * blockDim.x * gridDim.x;
 21
 22     if(x<w && y<h)
 23         dst[offset] = tex1Dfetch(texRef1D, offset);
 24 }
 25 // 2D 纹理操作函数
 26 __global__ void Texture2D(float *dst, int w, int h)
 27 {
 28     int x = threadIdx.x + blockIdx.x * blockDim.x;
 29     int y = threadIdx.y + blockIdx.y * blockDim.y;
 30     int offset = x + y * blockDim.x * gridDim.x;
 31
 32     dst[offset] = tex2D(texRef2D, x, y);
 33 }
 34 int main(int argc, char **argv)
 35 {
 36     CUT_DEVICE_INIT(argc, argv);  // 启动 CUDA
 37     /// 1D 纹理内存
 38     cout << "1D texture" << endl;
 39     float *host1D = (float*)calloc(10, sizeof(float)); // 内存原数据
 40     float *hostRet1D = (float*)calloc(10, sizeof(float));// 内存保存返回数据
 41
 42     float *dev1D, *devRet1D; // 显存数据
 43     int i;
 44     cout << " host1D:" << endl;
 45     for(i = 0; i < 10; ++i)  // 初始化内存原数据
 46     {
 47         host1D[i] = i * 2;
 48         cout << "  " << host1D[i] << " ";
 49     }
 50     cutilSafeCall( cudaMalloc((void**)&dev1D, sizeof(float)*10));  // 申请显存空间
 51     cutilSafeCall( cudaMalloc((void**)&devRet1D, sizeof(float)*10));
 52     cutilSafeCall( cudaMemcpy(dev1D, host1D, sizeof(float)*10, cudaMemcpyHostToDevice)); // 将内存数据拷贝入显存
 53     cutilSafeCall( cudaBindTexture(NULL, texRef1D, dev1D, sizeof(float)*10));  // 将显存数据和纹理绑定
 54
 55     Texture1D<<<10, 1>>>(devRet1D, 10, 1);  // 运行1D纹理操作函数
 56
 57     cutilSafeCall( cudaMemcpy(hostRet1D, devRet1D, sizeof(float)*10, cudaMemcpyDeviceToHost)); // 将显存数据拷贝入内存
 58     // 打印内存数据
 59     cout << endl << " hostRet1D:" << endl;
 60     for(i = 0; i < 10; ++i)
 61         cout << "  " << hostRet1D[i] << " ";
 62
 63     cutilSafeCall( cudaUnbindTexture(texRef1D));  // 解绑定
 64     cutilSafeCall( cudaFree(dev1D));  // 释放显存空间
 65     cutilSafeCall( cudaFree(devRet1D));
 66     free(host1D);  // 释放内存空间
 67     free(hostRet1D);
 68
 69     /// 2D 纹理内存
 70     cout << endl << "2D texture" << endl;
 71     int width = 5, height = 3;
 72     float *host2D = (float*)calloc(width*height, sizeof(float));    // 内存原数据
 73     float *hostRet2D = (float*)calloc(width*height, sizeof(float)); // 内存返回数据
 74
 75     cudaArray *cuArray;  // CUDA数组
 76     float *devRet2D;     // 显存数据
 77     int row, col;
 78     cout << " host2D:" << endl;
 79     for(row = 0; row < height; ++row)  // 初始化内存原数据
 80     {
 81         for(col = 0; col < width; ++col)
 82         {
 83             host2D[row*width + col] = row + col;
 84             cout << "  " << host2D[row*width + col] << " ";
 85         }
 86         cout << endl;
 87     }
 88     cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float>();
 89     cutilSafeCall( cudaMallocArray(&cuArray, &channelDesc, width, height));  // 申请显存空间
 90     cutilSafeCall( cudaMalloc((void**) &devRet2D, sizeof(float)*width*height));
 91     cutilSafeCall( cudaBindTextureToArray(texRef2D, cuArray)); // 将显存数据和纹理绑定
 92     cutilSafeCall( cudaMemcpyToArray(cuArray, 0, 0, host2D, sizeof(float)*width*height, cudaMemcpyHostToDevice)); // 将内存数据拷贝入CUDA数组
 93
 94     dim3 threads(width, height);
 95     Texture2D<<<1, threads>>>(devRet2D, width, height);  // 运行2D纹理操作函数
 96
 97     cutilSafeCall( cudaMemcpy(hostRet2D, devRet2D, sizeof(float)*width*height, cudaMemcpyDeviceToHost)); // 将显存数据拷贝入内存
 98     // 打印内存数据
 99     cout << " hostRet2D:" << endl;
100     for(row = 0; row < height; ++row)
101     {
102         for(col = 0; col < width; ++col)
103             cout << "  " << hostRet2D[row*width + col] << " ";
104         cout << endl;
105     }
106
107     cutilSafeCall( cudaUnbindTexture(texRef2D)); // 解绑定
108     cutilSafeCall( cudaFreeArray(cuArray));  // 释放显存空间
109     cutilSafeCall( cudaFree(devRet2D));
110     free(host2D);  // 释放内存空间
111     free(hostRet2D);
112
113     CUT_EXIT(argc, argv);  // 退出CUDA
114 }
时间: 2024-07-28 13:39:12

CUDA Texture纹理存储器 示例程序的相关文章

OSG中的示例程序简介

OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示了路径动画的使用(AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera.CameraView.MatrixTransform.PositionAttitudeTransform等四种类型的节点上.二)演示了osgSim::OverlayNode

Android cocos2dx游戏开发——示例程序HelloCpp源码分析

本文通过分析cocos2dx提供的示例程序HelloCpp来分析cocos2dx的启动过程. 我们从HelloCpp.java开始: [java] view plaincopyprint? package org.cocos2dx.hellocpp; import org.cocos2dx.lib.Cocos2dxActivity; import android.os.Bundle; public class HelloCpp extends Cocos2dxActivity{ protecte

winpcap示例程序采用VC6编译时出错error C2054: expected &#39;(&#39; to follow &#39;_W64&#39;

e:\vehiclesecurity\wpdpack_4_1_2\include\pcap-stdinc.h(80) : error C2054: expected '(' to follow '_W64' e:\vehiclesecurity\wpdpack_4_1_2\include\pcap-stdinc.h(80) : error C2085: 'uintptr_t' : not in formal parameter list e:\vehiclesecurity\wpdpack_4_

Windows Socket编程示例-TCP示例程序

前面一部分是介绍,后面有示例 1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问题,网络层的"ip地址"可以唯一标识网络中的主机,而传输层的"协议+端口"可以唯一标识主机中的应用程序(进程).这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互. 使用TCP

D3D三层Texture纹理经像素着色器实现渲染YUV420P

简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Texture纹理似乎不支持直接渲染YUV420P.表面(surface)用法似乎比较单一,通常用来显示数据,用Texture的话就可以用上D3D的许多其他功能,做出一些效果.当然,这看个人需求,通常而言显示视频数据用表面就够了. 1.利用像素着色器把YUV420P数据转为RGB32 视频播放过程中帧与

创建ArcGIS API for JavaScript的第一个示例程序

原文:创建ArcGIS API for JavaScript的第一个示例程序 在上一篇博客中已经介绍了如何搭建ArcGIS API for JavaScript开发环境,如果您还没有搭建好开发环境的话,参考博客:http://blog.csdn.net/zdw_wym/article/details/48678913. 如果开发环境搭建好了的话,那么今天我们继续来搭建我们的第一个ArcGIS API for JavaScript应用程序. 下面首先将代码贴出来,复制到VS2012中新建的html

.NET跨平台:在CentOS上编译dnx并运行ASP.NET 5示例程序

在之前的博文中我们在 Ubuntu 上成功编译出了 dnx ,并且用它成功运行了 ASP.NET 5 示例程序.在这篇博文中我们将 Ubuntu 换成 CentOS. 目前 dnx 的编译需要用到 mono,所以先要安装 mono,而且最好是用最新的 mono 源代码进行编译并安装. 我们实际成功编译的操作步骤如下(假设将 mono 安装到 /data/mono_build 目录): mkdir /data/mono_build PATH=/data/mono_build/bin:$PATH g

ABP示例程序-使用AngularJs,ASP.NET MVC,Web API和EntityFramework创建N层的单页面Web应用

本片文章翻译自ABP在CodeProject上的一个简单示例程序,网站上的程序是用ABP之前的版本创建的,模板创建界面及工程文档有所改变,本文基于最新的模板创建.通过这个简单的示例可以对ABP有个更深入的了解,每个工程里应该写什么样的代码,代码如何组织以及ABP是如何在工程中发挥作用的. 源文档地址:https://www.codeproject.com/Articles/791740/Using-AngularJs-ASP-NET-MVC-Web-API-and-EntityFram 源码可以

Hadoop示例程序wordcount分析

wordcount作为Hadoop的示例程序,其思想很简洁,但也值得去理解 尤其是作为Hadoop菜鸟的我 wordcount程序如下: package com.lcy.hadoop.examples; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import