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 ...
随机推荐
- Sequelize Docs 中文文档 v4
Sequelize Docs 中文文档 v4 写在前面 Sequelize 是一个基于 promise 的 Node.js ORM, 目前支持 Postgres, MySQL, SQLite 和 Mi ...
- 关于django2.0的外键关系新特性之on_delete!
Django2.0里model外键和一对一的on_delete参数 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错: ...
- linux信号的处理--部分源码分析
基于linux master v4.9版本 信号是异步的, 一.信号何时来 信号是异步的,对于一个进程随时都会接收到信号. 二.选择线程(task)来处理 那么一个进程接收到信号时,需要选择一个tas ...
- 性能测试工具LoadRunner13-LR之Virtual User Generator 创建java脚本以及小结
Java vuser是自定义的java虚拟脚本,脚本中可以使用标准的java语言. 环境配置 1.安装jdk(注意:lr11最高支持1.6) 2.配置环境变量 3.在lr选择java Vuser协议 ...
- (转)Shell脚本之break,continue,和exit区别
Linux脚本中的break continue exit return break结束并退出循环 continue在循环中不执行continue下面的代码,转而进入下一轮循环 exit退出脚本,常带一 ...
- matlab 摘要
matlab中的向量与矩阵 如果定义一个A = [1, 2, 3]; 则A为一个行向量 但是A(:)返回的是一个列向量 关于函数的返回值 在function [a, b, c] = fit_quadr ...
- JetBrains IDE激活
License server(服务器地址为http://idea.iteblog.com/key.php) Active Code:生成网址:http://idea.iteblog.com/
- Java编译及装载
Java类加载机制 JVM将类加载过程划分为三个步骤:装载.链接和初始化. 装载(Load):装载过程负责找到二进制字节码并加载至JVM中,JVM通过类的全限定名(com.bluedavy. Hell ...
- C++中的虚函数表
(感谢http://blog.csdn.net/haoel/article/details/1948051/) C++中的虚函数的作用主要是实现了多态的机制. 多态,简而言之就是用父类型别的指针指向其 ...
- .Net Core 应用框架。
1.分布式系统框架 https://github.com/MassTransit/MassTransit 2.搜索引擎 https://github.com/XiLife-OSPC/Masuit. ...