CUDA Texture纹理存储器 示例程序
/*
* Copyright 徐洪志(西北农林科技大学.信息工程学院). All rights reserved.
* Data: 2012-4-20
*/
//
// 此程序是演示了1D和2D纹理存储器的使用
#include <stdio.h>
#include <cutil_inline.h>
#include <iostream>
using namespace std; texture<float> texRef1D; // 1D texture
texture<float, > texRef2D; // 2D texture // 1D 纹理操作函数
__global__ void Texture1D(float *dst, int w, int h)
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x; if(x<w && y<h)
dst[offset] = tex1Dfetch(texRef1D, offset);
}
// 2D 纹理操作函数
__global__ void Texture2D(float *dst, int w, int h)
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x; dst[offset] = tex2D(texRef2D, x, y);
}
int main(int argc, char **argv)
{
CUT_DEVICE_INIT(argc, argv); // 启动 CUDA
/// 1D 纹理内存
cout << "1D texture" << endl;
float *host1D = (float*)calloc(, sizeof(float)); // 内存原数据
float *hostRet1D = (float*)calloc(, sizeof(float));// 内存保存返回数据 float *dev1D, *devRet1D; // 显存数据
int i;
cout << " host1D:" << endl;
for(i = ; i < ; ++i) // 初始化内存原数据
{
host1D[i] = i * ;
cout << " " << host1D[i] << " ";
}
cutilSafeCall( cudaMalloc((void**)&dev1D, sizeof(float)*)); // 申请显存空间
cutilSafeCall( cudaMalloc((void**)&devRet1D, sizeof(float)*));
cutilSafeCall( cudaMemcpy(dev1D, host1D, sizeof(float)*, cudaMemcpyHostToDevice)); // 将内存数据拷贝入显存
cutilSafeCall( cudaBindTexture(NULL, texRef1D, dev1D, sizeof(float)*)); // 将显存数据和纹理绑定 Texture1D<<<, >>>(devRet1D, , ); // 运行1D纹理操作函数 cutilSafeCall( cudaMemcpy(hostRet1D, devRet1D, sizeof(float)*, cudaMemcpyDeviceToHost)); // 将显存数据拷贝入内存
// 打印内存数据
cout << endl << " hostRet1D:" << endl;
for(i = ; i < ; ++i)
cout << " " << hostRet1D[i] << " "; cutilSafeCall( cudaUnbindTexture(texRef1D)); // 解绑定
cutilSafeCall( cudaFree(dev1D)); // 释放显存空间
cutilSafeCall( cudaFree(devRet1D));
free(host1D); // 释放内存空间
free(hostRet1D); /// 2D 纹理内存
cout << endl << "2D texture" << endl;
int width = , height = ;
float *host2D = (float*)calloc(width*height, sizeof(float)); // 内存原数据
float *hostRet2D = (float*)calloc(width*height, sizeof(float)); // 内存返回数据 cudaArray *cuArray; // CUDA数组
float *devRet2D; // 显存数据
int row, col;
cout << " host2D:" << endl;
for(row = ; row < height; ++row) // 初始化内存原数据
{
for(col = ; col < width; ++col)
{
host2D[row*width + col] = row + col;
cout << " " << host2D[row*width + col] << " ";
}
cout << endl;
}
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float>();
cutilSafeCall( cudaMallocArray(&cuArray, &channelDesc, width, height)); // 申请显存空间
cutilSafeCall( cudaMalloc((void**) &devRet2D, sizeof(float)*width*height));
cutilSafeCall( cudaBindTextureToArray(texRef2D, cuArray)); // 将显存数据和纹理绑定
cutilSafeCall( cudaMemcpyToArray(cuArray, , , host2D, sizeof(float)*width*height, cudaMemcpyHostToDevice)); // 将内存数据拷贝入CUDA数组 dim3 threads(width, height);
Texture2D<<<, threads>>>(devRet2D, width, height); // 运行2D纹理操作函数 cutilSafeCall( cudaMemcpy(hostRet2D, devRet2D, sizeof(float)*width*height, cudaMemcpyDeviceToHost)); // 将显存数据拷贝入内存
// 打印内存数据
cout << " hostRet2D:" << endl;
for(row = ; row < height; ++row)
{
for(col = ; col < width; ++col)
cout << " " << hostRet2D[row*width + col] << " ";
cout << endl;
} cutilSafeCall( cudaUnbindTexture(texRef2D)); // 解绑定
cutilSafeCall( cudaFreeArray(cuArray)); // 释放显存空间
cutilSafeCall( cudaFree(devRet2D));
free(host2D); // 释放内存空间
free(hostRet2D); CUT_EXIT(argc, argv); // 退出CUDA
}
CUDA Texture纹理存储器 示例程序的更多相关文章
- CUDA C 纹理提取Texture Fetching
CUDA C 纹理提取Texture Fetching 一.参数曲面的纹理 使用纹理指定参数曲面属性. 二.CUDA C 纹理获取开发 用于计算纹理函数,根据纹理引用的各种属性返回的值的公式(请参见 ...
- OSG中的示例程序简介
OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...
- OSG中的示例程序简介(转)
OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...
- VS2012下基于Glut 矩阵变换示例程序2:
在VS2012下基于Glut 矩阵变换示例程序:中我们在绘制甜圈或者圆柱时使用矩阵对相应的坐标进行变换后自己绘制甜圈或者圆柱.我们也可以使用glLoadMatrixf.glLoadMatrixd载入变 ...
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...
- .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序
在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...
- .NET跨平台:在CentOS上编译dnx并运行ASP.NET 5示例程序
在之前的博文中我们在 Ubuntu 上成功编译出了 dnx ,并且用它成功运行了 ASP.NET 5 示例程序.在这篇博文中我们将 Ubuntu 换成 CentOS. 目前 dnx 的编译需要用到 m ...
- Salesforce Apex 使用JSON数据的示例程序
本文介绍了一个在Salesforce Apex中使用JSON数据的示例程序, 该示例程序由以下几部分组成: 1) Album.cls, 定了了封装相关字段的数据Model类 2) RestClient ...
- D3D三层Texture纹理经像素着色器实现渲染YUV420P
简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Te ...
随机推荐
- mysql 模拟一个自增序列
文章出处:https://sdu0rj.axshare.com/%E4%BA%8C%E7%BA%A7%E5%AE%A2%E6%88%B7%E7%AE%A1%E7%90%86.html mysql没有像 ...
- 2019.03.20 读书笔记 as is 以及重写隐式/显示
强转.as is 的用法 强制转换类型有两种:子类转基类,重写隐式(implicit )\显示(explicit) 转换操作符 class myclass { private int value; p ...
- GRE新东方推荐学习方法(2010年左右)
单词:新东方新版红宝书(<NEW GRE 词汇精选>),不用<再要你命三个> 填空:新东方绿皮书(扎实的词汇量) 阅读:1 新东方绿皮书:2 <GRE阅读 39+3全攻略 ...
- maya2017无法安装卸载激活失败
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- Unity 去除场景中的雾效果
Windows——Lighting——Setting,然后出现下面窗口,把Other Setting下,Fog的对勾去掉就可以了.
- 工作空间造成的javaweb项目无法新建
出现问题: 当我打开myeclipse开发工具将原有的已经存在的一个名为jeecms的项目删除的时候,出现了删除不了,因此我采取了强制的删除的方法,最终项目删除了.接下来新建同名的javaweb就出现 ...
- 自定义Qt组件-通讯模块(P3)
1. 半双工模式实时检测串口 ComHalfDuplex类是为了解决上位机发送控制指令和下位机发送数据会在半双工RS485总线中产生冲突引起乱码而引入的(v0.010版本引入). 解决冲突的原理主 ...
- Javascript学习一Object
构造函数 new Object() new Object(value) 参数 value 可选的参数,声明了要转换成Number对象.Boolean对象或String对象的原始值(即数字.布尔 ...
- 第一个flask程序
flask简介: flask是一款非常流行的Python Web框架,出生于2010年,作者是Armin Ronacher,本来这个项目只是作者在愚人节的一个玩笑,后来由于非常受欢迎,进而成为一个正 ...
- FTPUtil 多文件上传参考代码
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java ...