亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

CUDA一維紋理內存

2019-11-11 04:25:28
字體:
來源:轉載
供稿:網友

紋理一詞來源于GPU圖形世界,GPU通用并行計算“盜用”了紋理一詞,定義了一個紋理內存的概念。紋理內存緩存在 設備上,在某些情況下能減少對內存的請求并降低內存帶寬的使用,是專門為那些在內存訪問模式中存在大量空間局部性的圖形應用而設計,意味著一個線程讀取的位置可能與鄰近線程讀取的位置“非常接近”。對于GPU內核而言,紋理內存是只讀內存,并且只有通過特殊的紋理API才能對其訪問。

紋理內存分為一維紋理內存和二維紋理內存,理解紋理內存最好的方式是丟掉“紋理”兩個字,紋理內存本質上是一塊內存,是GPU在特定應用中對一維、二維變量的特殊聲明定義以及特殊使用,這種特殊使用能夠減少內存流量,提升運算性能。

紋理變量(引用)必須聲明為文件作用域內的全局變量,這里先探討一下一維紋理內存的使用方法。一維紋理內存的關鍵操作如下:

1、用texture<類型>類型聲明。

如聲明一個unsigned char 型的一維紋理tex1,格式為:

texture<unsigned char,1,cudaReadmodeElementType> tex1;

2、通過cudaBindTexture()綁定到紋理內存中,并關聯到對應的數據上。

如將unsigned char類型的dev_A綁定到一維紋理tex1上,格式為:

cudaBindTexture(0,tex1,dev_A);

注意一旦將數據綁定到一個紋理內存上,該數據就已經傳輸到了設備緩存上,在核函數中就可以直接訪問,不再需要額外傳入。

3、 通過tex1Dfetch()來讀取紋理內存中的數據。

紋理內存是一種特殊的內存,需要使用特定的紋理API來訪問其中的數據。如訪問tex1數組的第3個元素,格式為:

tex1Dfetch(tex1,2);

4、 通過cudaUnbindTexture()取消綁定紋理內存。

紋理內存使用完之后需要取消綁定,釋放空間,如解除紋理tex1的綁定,格式為:

cudaUnbindTexture(tex1);

考慮一個簡單的應用,把一個長度是100的向量A中的數據拷貝到一個向量B中,使用普通CPU編程實現如下:

#include <iostream>using namespace std;#define _length 100//CPU函數實現復制一個數組void Copy_CPU(unsigned int * listSource, unsigned int * listTarget, int length){	for (int i = 0; i < length; i++)	{		listTarget[i] = listSource[i];	}}int main(){	unsigned int * listSource = new unsigned int[_length];	unsigned int * listTarget = new unsigned int[_length];	//賦值	for (int i = 0; i < _length; i++)	{		listSource[i] = i;	}	//調用CPU復制函數	Copy_CPU(listSource, listTarget, _length);	cout << "原始數據: ";	for (int i = 0; i < _length; i++)	{		cout << listSource[i] << " ";	}	cout << endl << endl << "通過CPU拷貝的數據: ";	for (int i = 0; i < _length; i++)	{		cout << listTarget[i] << " ";	}	getchar();}運行結果:

使用GPU編程,普通變量編程實現

#include"cuda_runtime.h"#include"device_launch_parameters.h"#include<iostream>#define _length 100using namespace std;//聲明要調用的Copy_GPU函數extern "C" void Copy_GPU(unsigned int* listSource, unsigned int* listTarget, int length);void main(int argc, char** argv){	unsigned int *listSource = new unsigned int[_length];	unsigned int *listTarget = new unsigned int[_length];	//賦值	for (int i = 0; i < _length; i++)	{		listSource[i] = i;	}	// 調用Copy_GPU函數,Copy_GPU中會調用gpu端的kernel函數	Copy_GPU(listSource, listTarget, _length);	cout << "原始數據: ";	for (int i = 0; i < _length; i++)	{		cout << listSource[i] << " ";	}	cout << endl << endl << "通過GPU普通內存拷貝的數據: ";	for (int i = 0; i < _length; i++)	{		cout << listTarget[i] << " ";	}	getchar();}//核心代碼,在gpu端執行的kernel,__global__ void Blending_Texture(unsigned int* listSource, unsigned int* listTarget, int size){	//通過線程ID得到數組下標	int index = blockIdx.x * blockDim.x + threadIdx.x;	if (index < size)		listTarget[index] = listSource[index];}void Copy_GPU(unsigned int* listSource, unsigned int* listTarget, int length){	int data_size = length * sizeof(unsigned int);	unsigned int *dev_Source;	unsigned int *dev_Target;	//在設備上申請顯存空間	cudaMalloc((void**)&dev_Source, data_size);	cudaMalloc((void**)&dev_Target, data_size);	//將host端的數據拷貝到device端	cudaMemcpy(dev_Source, listSource, data_size, cudaMemcpyHostToDevice);	//調用kernel	Blending_Texture << < ceil(_length / 10), 10 >> > (dev_Source, dev_Target, _length);	//將結果拷貝到host端 ☆host就是CPU	cudaMemcpy(listTarget, dev_Target, data_size, cudaMemcpyDeviceToHost);	//釋放內存空間	cudaFree(dev_Source);	cudaFree(dev_Target);}

運行結果:

使用GPU編程,一維紋理變量編程實現

#include"cuda_runtime.h"#include"device_launch_parameters.h"#include<iostream>#define _length 100using namespace std;//聲明紋理,用來綁定紋理,其實也就是個紋理標識texture<unsigned int, 1, cudaReadModeElementType> rT1;//聲明要調用的Copy_GPU函數extern "C" void Copy_GPU(unsigned int* listSource, unsigned int* listTarget, int length);void main(int argc, char** argv){	unsigned int *listSource = new unsigned int[_length];	unsigned int *listTarget = new unsigned int[_length];	//賦值	for (int i = 0; i < _length; i++)	{		listSource[i] = i;	}	// 調用Copy_GPU函數,Copy_GPU中會調用gpu端的kernel函數	Copy_GPU(listSource, listTarget, _length);	cout << "原始數據: ";	for (int i = 0; i < _length; i++)	{		cout << listSource[i] << " ";	}	cout << endl << endl << "通過GPU紋理內存拷貝的數據: ";	for (int i = 0; i < _length; i++)	{		cout << listTarget[i] << " ";	}	getchar();}//核心代碼,在gpu端執行的kernel,__global__ void Blending_Texture(unsigned int* listTarget, int size){	//通過線程ID得到數組下標	int index = blockIdx.x * blockDim.x + threadIdx.x;	//通過紋理獲取函數得到數據再運算	if (index < size)		listTarget[index] = tex1Dfetch(rT1, index);}void Copy_GPU(unsigned int* listSource, unsigned int* listTarget, int length){	int data_size = length * sizeof(unsigned int);	unsigned int *dev_Source;	unsigned int *dev_Target;	//在設備上申請顯存空間	cudaMalloc((void**)&dev_Source, data_size);	cudaMalloc((void**)&dev_Target, data_size);	//將host端的數據拷貝到device端	cudaMemcpy(dev_Source, listSource, data_size, cudaMemcpyHostToDevice);	//綁定紋理,綁定的紋理標識對應的數據 	cudaBindTexture(0, rT1, dev_Source);	//調用kernel	Blending_Texture << < ceil(_length / 10), 10 >> > (dev_Target, _length);	//將結果拷貝到host端 ☆host就是CPU	cudaMemcpy(listTarget, dev_Target, data_size, cudaMemcpyDeviceToHost);	//取消綁定	cudaUnbindTexture(rT1);	//釋放內存空間	cudaFree(dev_Source);	cudaFree(dev_Target);}運行結果:

再舉一個使用CUDA+OpenCv編程,實現復制一幅圖像的例子:

#include"cuda_runtime.h"#include<iostream>#include<highgui/highgui.hpp>#include<imgPRoc/imgproc.hpp>#define DIM 512   //圖像尺寸using namespace std;using namespace cv;//一維紋理聲明texture<unsigned char, 1, cudaReadModeElementType> rT1;__global__ void Kernel_Copy(unsigned char* imageTarget){	int x = threadIdx.x + blockIdx.x*blockDim.x;	int y = threadIdx.y + blockIdx.y*blockDim.y;	int offset = x + y*blockDim.x*gridDim.x;	//復制圖像	imageTarget[offset * 3 + 2] = tex1Dfetch(rT1, offset * 3 + 2);	imageTarget[offset * 3 + 1] = tex1Dfetch(rT1, offset * 3 + 1);	imageTarget[offset * 3 + 0] = tex1Dfetch(rT1, offset * 3 + 0);}void main(int argc, char** argv){	Mat image = imread("D://lena.jpg");	Mat imageSource;	resize(image, imageSource, Size(DIM, DIM)); //調整圖像大小	Mat imageTarget = Mat(Size(DIM, DIM), CV_8UC3, Scalar::all(0));	//分配空間	unsigned char *dev_imageSource;	unsigned char *dev_imageTarget;	cudaMalloc((void**)&dev_imageSource, 3 * imageSource.rows*imageSource.cols);	cudaMalloc((void**)&dev_imageTarget, 3 * imageSource.rows*imageSource.cols);	cudaMemcpy(dev_imageSource, imageSource.data, 3 * imageSource.cols*imageSource.rows, cudaMemcpyHostToDevice);	cudaMemcpy(dev_imageTarget, imageTarget.data, 3 * imageSource.cols*imageSource.rows, cudaMemcpyHostToDevice);	//綁定紋理	cudaBindTexture(0, rT1, dev_imageSource);	dim3 grids(DIM / 16, DIM / 16);	dim3 threads(16, 16);	//調用kernel	Kernel_Copy << < grids, threads >> > (dev_imageTarget);	//將結果拷貝到host端 ☆host就是CPU	cudaMemcpy(imageTarget.data, dev_imageTarget, 3 * imageSource.cols*imageSource.rows, cudaMemcpyDeviceToHost);	imshow("CUDA紋理內存使用示例", imageTarget);	waitKey();	//解除紋理綁定	cudaUnbindTexture(rT1);	cudaFree(dev_imageSource);	cudaFree(dev_imageSource);}運行結果:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久好看免费视频| 成人黄色免费看| 欧美一区二区视频97| 岛国av一区二区在线在线观看| 国产成人精品在线播放| 国产精品99一区| 成人免费淫片视频软件| 欧美一级大片在线免费观看| 欧美成人精品一区二区| 欧美成人高清视频| 这里只有精品丝袜| 欧美国产日韩一区二区三区| 国产精品9999| 国产精品一区二区久久久久| 欧美电影在线免费观看网站| 亚洲一区二区少妇| 国产成人精品久久亚洲高清不卡| 午夜精品久久久久久久男人的天堂| 欧美性videos高清精品| 欧美成人在线免费视频| 国产精品日本精品| 亚洲人成网7777777国产| 欧美成人午夜免费视在线看片| 欧美日韩国产中文精品字幕自在自线| 欧美亚洲国产成人精品| 国产精品88a∨| 国产精品第七影院| 亚洲国产日韩一区| 一区二区欧美亚洲| 911国产网站尤物在线观看| 亚洲第一中文字幕| 日韩av大片在线| 欧美在线观看一区二区三区| 亚洲已满18点击进入在线看片| 日本免费久久高清视频| 超薄丝袜一区二区| 欧美国产日产韩国视频| 一本色道久久88亚洲综合88| 亚洲男人的天堂在线| 欧美视频免费在线| 久久久在线视频| 亚洲一区二区久久久久久久| 亚洲视频一区二区| 日韩精品在线观看一区二区| 欧美成人亚洲成人| 影音先锋日韩有码| 欧美一级淫片aaaaaaa视频| 国产精品情侣自拍| 久久天天躁狠狠躁老女人| 午夜精品久久久久久久久久久久久| 色偷偷偷亚洲综合网另类| 亚洲国产欧美一区二区丝袜黑人| 91久热免费在线视频| 高跟丝袜一区二区三区| 日韩高清a**址| 久久精品成人欧美大片古装| 欧美一区二区三区免费观看| 红桃av永久久久| 成人精品视频99在线观看免费| 亚洲人精选亚洲人成在线| 2019亚洲日韩新视频| 97人洗澡人人免费公开视频碰碰碰| 亚洲综合色激情五月| 欧美大学生性色视频| 26uuu亚洲国产精品| 蜜臀久久99精品久久久无需会员| 国产精品久久999| 中文亚洲视频在线| 中文字幕在线精品| 午夜精品一区二区三区av| 欧美视频裸体精品| 国产亚洲精品久久| 国产精品99蜜臀久久不卡二区| 亚洲国产日韩欧美在线99| 韩国19禁主播vip福利视频| 91系列在线观看| 日本一区二区三区四区视频| 精品国产精品三级精品av网址| 国产日韩欧美视频| 亚洲精品国产精品久久清纯直播| 国产视频亚洲精品| 91精品国产91久久| 久久综合免费视频| 91亚洲国产成人精品性色| 欧美精品做受xxx性少妇| 欧美在线一区二区三区四| 久久精品91久久久久久再现| 欧美成人免费在线观看| 久久av在线播放| 成人高h视频在线| 91热精品视频| 欧美精品成人在线| 久久精品久久久久久国产 免费| 欧美日韩在线免费| 亚洲成年人影院在线| 狠狠躁天天躁日日躁欧美| 亚洲激情第一页| 欧洲永久精品大片ww免费漫画| 乱亲女秽乱长久久久| 精品视频在线导航| 国产精品视频导航| 久久夜色精品国产亚洲aⅴ| 精品久久久在线观看| 久久婷婷国产麻豆91天堂| 国产亚洲一级高清| 国产一区二区三区日韩欧美| 精品国产91久久久久久| 中文字幕亚洲在线| 68精品国产免费久久久久久婷婷| 日韩在线观看网站| 欧美激情精品久久久久久免费印度| 欧美成人小视频| 国产成人拍精品视频午夜网站| 欧美在线www| 日本久久亚洲电影| 久久好看免费视频| 国产丝袜一区视频在线观看| 亚洲一区999| 国产精品一区av| 国产日产欧美精品| 亚洲国产精品久久91精品| 一本一本久久a久久精品牛牛影视| 国产亚洲精品va在线观看| 欧美大学生性色视频| 国产欧美日韩精品专区| 日韩在线观看网址| 97在线视频免费观看| 91香蕉亚洲精品| 国产精品第一第二| 92看片淫黄大片欧美看国产片| 亚洲精品国产精品国自产观看浪潮| 久久久久久久久网站| 久久6精品影院| 中文国产成人精品久久一| 国产69精品久久久久9| 欧美精品激情在线观看| 亚洲国产日韩欧美在线动漫| 国产欧美久久一区二区| 2021久久精品国产99国产精品| 亚洲国产精品国自产拍av秋霞| 日韩av高清不卡| 日韩精品亚洲元码| 欧美国产日韩一区二区| 欧美日韩国产一区二区三区| 亚洲天堂网站在线观看视频| 久久精品99久久香蕉国产色戒| 亚洲激情成人网| 欧美亚洲另类激情另类| 91精品国产乱码久久久久久蜜臀| 国产69精品久久久久9999| 日韩精品免费电影| 亚洲福利视频在线| 国产美女扒开尿口久久久| 成人免费网站在线看| 国产精品福利观看| 国产精品欧美日韩久久| 伊人亚洲福利一区二区三区| 琪琪第一精品导航| 视频直播国产精品| 国产精品中文字幕在线观看| 久久中国妇女中文字幕| 国产精品黄色av| 中文国产亚洲喷潮| 欧美大学生性色视频|