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 ...
随机推荐
- spring MVC设置不拦截静态资源
问题产生: 因为我们在web.xml中写了 拦截所有请求,当然包括了静态资源,所以页面需要引用css或js的话,该请求也会被拦截,例如: 在style.css中写一个简单样式,加个背景颜色 body ...
- Hibernate通过自编写sql查询
public List<InterProductMsg> selectIsHaveProductid(String productId) { String sql="SELECT ...
- 输入一个正整数n (1<n<=10),生成 1个 n*n 方阵 求出对角线之和
#define _CRT_SECURE_NO_WARNINGS #include <Windows.h> #include <stdio.h> #include <std ...
- redis 读写锁实现
一 先搞清楚读写锁要做什么. 基本就是 读读不互斥,读写互斥,写写互斥.可重入. 关于redis读写锁,我写了一次之后,总觉得很怪,然后就上网看到大神的redisson了,果断借鉴一番. 二 读行为 ...
- CentOS7安装MongoDB3.6企业版
参考资源 https://docs.mongodb.com/manual/tutorial/install-mongodb-enterprise-on-red-hat/ 下载安装 配置yum仓库 ...
- UITableView分隔线
问题1: 在ios中使用UITableView时,当行数较少是,可能一屏幕能显示完全所有行,这时候会出现下面的问题,显示多余的分隔线 图如下: 解决方案: //解决方案1 //添加如下代码 -(CGF ...
- XHML教会我的一些东西-3
在寒假期间,隔几天就同学聚会,每天都是起床困难户.每天都想着要完成任务,要学习新的东西.但是总是被自己惰性占为上风.感觉自己很没用,但是又继续堕落.真的不能理解自己.呵呵.... 在放假一段时间之后, ...
- Python函数(3)
一.装饰器 什么是装饰器,装饰器就是用于拓展原来函数功能的一种函数 装饰器就是用来为被装饰对象添加新功能的工具,装饰器本身可以是任意可调用对象,被装饰的对象也可以是任意可调用对象 装饰器遵循一个关键原 ...
- jquery的全选和多选操作
//全选产品 $('#checkAll').click(function() { $(this).prop('checked',!$(this).prop('checked')); if($(this ...
- (九)JavaScript之【JS函数(定义、参数、调用、【闭包】、call(),apply())】[较深,胆小勿进]
一].定义: /** * 函数表达式 * * Function() 构造函数 * * 函数提升(Hoisting) * JavaScript默认将当前作用域提升到前面去 * Hoisting应用在变量 ...