亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? convolutionseparable.cu

?? 可分離據卷積,在GPU上實現并行運算
?? CU
字號:

/*
 這個例子利用高斯內核執行一個二維信號的可分離卷積濾波
*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <cutil.h>

////////////////////////////////////////////////////////////////////////////////
// 共同的主機和設備函數
////////////////////////////////////////////////////////////////////////////////
//Round a / b to nearest higher integer value     ??a/b是一個高度接近整型的值??????
int iDivUp(int a, int b){
    return (a % b != 0) ? (a / b + 1) : (a / b);
}

//Round a / b to nearest lower integer value
int iDivDown(int a, int b){
    return a / b;
}

//Align a to nearest higher multiple of b
int iAlignUp(int a, int b){
    return (a % b != 0) ?  (a - a % b + b) : a;
}

//Align a to nearest lower multiple of b
int iAlignDown(int a, int b){
    return a - a % b;
}
/////////////////////////////////////////////
//讀圖片
//////////////////////////////////////////////
extern "C" void LoadBMPFile(uchar4 **, int *, int *, const char *);


//////////////////////////////////////////////
// 涉及到的cpu卷積
/////////////////////////////////////////////
extern "C" void convolutionRowCPU(			
    float *h_Result,
    float *h_Data,
    float *h_Kernel,
    int dataW,
    int dataH,
    int kernelR
);

extern "C" void convolutionColumnCPU(
    float *h_Result,
    float *h_Data,
    float *h_Kernel,
    int dataW,
    int dataH,
    int kernelR
);

//////////////////////////////////////////////
//GPU卷積
//////////////////////////////////////////////
//全局宏,打開卷積內部控制循環
#define UNROLL_INNER		//打開內部
#include <convolutionSeparable_kernel.cu>
#define M 12
//在主函數循環計算開始時傳出一個虛擬計算目的是喚醒硬件驅動
#define WARMUP
/////////////////////////////////////////////
// 主函數
/////////////////////////////////////////////
int main(int argc, char **argv){
    float
        *h_Kernel,
        *h_DataA,
        *h_DataB,
        *h_ResultGPU;

    float
        *d_DataA,
        *d_DataB,
        *d_Temp;

    double gpuTime;	
    int i;   
    uchar4 *h_Src;
    cudaArray *a_Src;
	int imageW, imageH;
	float Gtime[M];
	float Ctime[M];
	int x[M];
	int y[M];
	char picname[M][10]={{"1.bmp"},{"2.bmp"},{"3.bmp"},{"4.bmp"},{"5.bmp"},{"6.bmp"},
						{"7.bmp"},{"8.bmp"},{"9.bmp"},{"10.bmp"},{"11.bmp"},{"12.bmp"}};
	for(int t=0;t<M;t++)
	{
		printf("導入圖片%-10s  ",picname[t]);

		unsigned int hTimer;
		CUT_DEVICE_INIT();
		CUT_SAFE_CALL(cutCreateTimer(&hTimer));

		const char *image_path = cutFindFilePath(picname[t], argv[0]);//設置讀取文件
		LoadBMPFile(&h_Src, &imageW, &imageH, image_path);
		
		int DATA_W=imageW;
		int DATA_H=imageH;
		x[t]=imageW;
		y[t]=imageH;
		const int   DATA_SIZE = DATA_W * DATA_H * sizeof(float);
		const int KERNEL_SIZE = KERNEL_W * sizeof(float);	
		//printf("圖片格式為:%i x %i\n", x[t], y[t]);    
		//printf("初始化數據\n");
		h_Kernel    = (float *)malloc(KERNEL_SIZE);
		h_DataA     = (float *)malloc(DATA_SIZE);
		h_DataB     = (float *)malloc(DATA_SIZE);
		h_ResultGPU = (float *)malloc(DATA_SIZE);
		CUDA_SAFE_CALL( cudaMalloc( (void **)&d_DataA, DATA_SIZE) );
		CUDA_SAFE_CALL( cudaMalloc( (void **)&d_DataB, DATA_SIZE) );
		CUDA_SAFE_CALL( cudaMalloc( (void **)&d_Temp , DATA_SIZE) );

			//具體是什么算法??高斯????
		float kernelSum = 0;
		for(i = 0; i < KERNEL_W; i++)
		{
			float dist = (float)(i - KERNEL_RADIUS) / (float)KERNEL_RADIUS;
			h_Kernel[i] = expf(- dist * dist / 2);
			kernelSum += h_Kernel[i];
		}
		for(i = 0; i < KERNEL_W; i++)
			h_Kernel[i] /= kernelSum;       	
		CUDA_SAFE_CALL( cudaMemcpyToSymbol(d_Kernel, h_Kernel, KERNEL_SIZE) );
		CUDA_SAFE_CALL( cudaMemcpy(d_DataA, h_Src, DATA_SIZE, cudaMemcpyHostToDevice) );//導入圖片數據


		dim3 blockGridRows(iDivUp(DATA_W, ROW_TILE_W), DATA_H);
		dim3 blockGridColumns(iDivUp(DATA_W, COLUMN_TILE_W), iDivUp(DATA_H, COLUMN_TILE_H));
		dim3 threadBlockRows(KERNEL_RADIUS_ALIGNED + ROW_TILE_W + KERNEL_RADIUS);
		dim3 threadBlockColumns(COLUMN_TILE_W, 8);


	#ifdef WARMUP
		convolutionRowGPU<<<blockGridRows, threadBlockRows>>>(
			d_Temp,
			d_DataA,
			DATA_W,
			DATA_H
		);
		CUT_CHECK_ERROR("GPU行卷積失敗!\n");
		convolutionColumnGPU<<<blockGridColumns, threadBlockColumns>>>(
			d_Temp,
			d_DataA,
			DATA_W,
			DATA_H,
			COLUMN_TILE_W * threadBlockColumns.y,
			DATA_W * threadBlockColumns.y
		);
		CUT_CHECK_ERROR("GPU列卷積失敗!\n");
		CUDA_SAFE_CALL( cudaThreadSynchronize() );
	#endif
		//printf("\n在GPU上執行可分離卷積運算:\n");
		CUDA_SAFE_CALL( cudaThreadSynchronize() );
		CUT_SAFE_CALL( cutResetTimer(hTimer) );
		CUT_SAFE_CALL( cutStartTimer(hTimer) );
		convolutionRowGPU<<<blockGridRows, threadBlockRows>>>(
			d_DataB,
			d_DataA,
			DATA_W,
			DATA_H
		);
		CUT_CHECK_ERROR("GPU行卷積失敗!\n");

		convolutionColumnGPU<<<blockGridColumns, threadBlockColumns>>>(
			d_DataA,
			d_DataB,
			DATA_W,
			DATA_H,
			COLUMN_TILE_W * threadBlockColumns.y,
			DATA_W * threadBlockColumns.y
		);
		CUT_CHECK_ERROR("GPU列卷積失敗!\n");
		CUDA_SAFE_CALL( cudaThreadSynchronize() );
		CUT_SAFE_CALL(cutStopTimer(hTimer));
		gpuTime = cutGetTimerValue(hTimer);
		//printf("GPU卷積時間: %f 毫秒	||	%f像素/每秒\n", gpuTime, 1e-6 * DATA_W * DATA_H / (gpuTime * 0.001));
		//float q=gpuTime;
		Gtime[t]=gpuTime;
		//printf("讀回GPU結果\n");
		CUDA_SAFE_CALL( cudaMemcpy(h_ResultGPU, d_DataA, DATA_SIZE, cudaMemcpyDeviceToHost) );


		//printf("\n在CPU上執行普通卷積運算:\n");
	    

		CUT_SAFE_CALL( cutResetTimer(hTimer) );
		CUT_SAFE_CALL( cutStartTimer(hTimer) );
		convolutionRowCPU(
			h_DataB,
			h_DataA,
			h_Kernel,
			DATA_W,
			DATA_H,
			KERNEL_RADIUS
		);
		convolutionColumnCPU(
			h_DataA,
			h_DataB,
			h_Kernel,
			DATA_W,
			DATA_H,
			KERNEL_RADIUS
		);


		CUT_SAFE_CALL(cutStopTimer(hTimer));
		gpuTime = cutGetTimerValue(hTimer);
		//printf("CPU卷積時間: %f 毫秒	||	%f像素/每秒\n", gpuTime, 1e-6 * DATA_W * DATA_H / (gpuTime * 0.001));
		//float w=gpuTime;
		Ctime[t]=gpuTime;
		//printf("\n比較結果:\n");
		//printf("q=%f\nw=%f",q,w);
		//printf("在GPU上執行可分離卷積運算速度是在CPU上執行卷積速度的%f倍!",w/q);
	   	
		//printf("\n\n結束\n");
		CUDA_SAFE_CALL( cudaFree(d_Temp ) );
		CUDA_SAFE_CALL( cudaFree(d_DataB) );
		CUDA_SAFE_CALL( cudaFree(d_DataA) );
		free(h_ResultGPU);
		free(h_DataB);
		free(h_DataA);
		free(h_Kernel);

		CUT_SAFE_CALL(cutDeleteTimer(hTimer));

	   // CUT_EXIT(argc, argv);
    }
    printf("\n圖片名稱    大小     GPU上卷積速率    CPU上卷積速率  GPU時間是CPU上時間的多少倍\n\n");
    for(int t=0;t<M;t++)
    {
		//printf("圖片 %s 大小為 %d × %d 作卷積運算數據如下:\n",picname[t],x[t],y[t]);
		//printf("GPU卷積時間: %f 毫秒 || %f像素/每秒\n", Gtime[t], 1e-6 * x[t] * y[t] / (Gtime[t] * 0.001));
		//printf("CPU卷積時間: %f 毫秒 || %f像素/每秒\n", Ctime[t], 1e-6 * x[t] * y[t] / (Ctime[t] * 0.001));
		//printf("在GPU上執行可分離卷積運算速度是在CPU上執行卷積速度的%f倍!\n\n", Ctime[t]/Gtime[t]);
		
		//printf("%-8s %-4d× %-4d %-10f毫秒   %-10f毫秒\t  %-10f\n",picname[t],x[t],y[t],Gtime[t],Ctime[t],Ctime[t]/Gtime[t]);
		printf("%-8s %-4d× %-4d %-10f像素/每秒   %-10f像素/每秒\t  %-10f\n",picname[t],x[t],y[t],1e-6 * x[t] * y[t] / (Gtime[t] * 0.001), 1e-6 * x[t] * y[t] / (Ctime[t] * 0.001),Ctime[t]/Gtime[t]);
		if(t%4==3)
			printf("\n");
    }
    
    CUT_EXIT(argc, argv);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
激情五月播播久久久精品| 一级女性全黄久久生活片免费| 91免费在线视频观看| 国产一区二区视频在线播放| 国产精品一区二区三区四区 | 日韩欧美一二三四区| 欧美日韩亚洲国产综合| 在线免费不卡电影| 欧美午夜在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 成人av中文字幕| 不卡欧美aaaaa| 91丝袜国产在线播放| 一本久久精品一区二区| 在线观看亚洲一区| 欧美日韩三级一区二区| 欧美一区二区三区思思人| 精品国产乱子伦一区| 久久精品视频网| 国产精品久久久久9999吃药| 亚洲猫色日本管| 视频在线观看国产精品| 经典一区二区三区| 成人黄色小视频| 欧美美女一区二区在线观看| 日韩午夜在线影院| 久久久久成人黄色影片| 亚洲免费看黄网站| 日韩国产精品久久久| 国产麻豆视频精品| 欧美性猛片aaaaaaa做受| 日韩视频免费观看高清完整版| 国产日韩欧美综合在线| 亚洲一区二区成人在线观看| 九九**精品视频免费播放| 99久久国产综合精品女不卡| 在线播放中文一区| 国产精品初高中害羞小美女文| 午夜精品国产更新| 成人性生交大片免费看中文| 欧美精品123区| 国产精品美女久久久久aⅴ国产馆| 亚洲精品国久久99热| 国产综合久久久久久鬼色| 日本伦理一区二区| 欧美国产日韩在线观看| 亚洲chinese男男1069| 成人精品国产免费网站| 91精品国产综合久久婷婷香蕉| 日本一二三四高清不卡| 伦理电影国产精品| 欧美写真视频网站| 国产精品欧美久久久久无广告| 九九久久精品视频| 日韩亚洲欧美成人一区| 亚洲一区影音先锋| 99精品国产一区二区三区不卡| 26uuu亚洲综合色| 三级欧美在线一区| 欧美三级中文字| 亚洲精品成人悠悠色影视| 不卡视频一二三| 亚洲国产成人自拍| 国产成人aaa| 久久这里只精品最新地址| 石原莉奈在线亚洲三区| 欧美日本国产视频| 亚洲成a人v欧美综合天堂| 91首页免费视频| 亚洲精品午夜久久久| 99久久久国产精品免费蜜臀| 综合久久综合久久| 91啪亚洲精品| 亚洲人成电影网站色mp4| 不卡免费追剧大全电视剧网站| 国产三级一区二区三区| 国产精品综合二区| 国产视频亚洲色图| 成人免费毛片app| 1区2区3区欧美| 一本大道综合伊人精品热热| 樱桃视频在线观看一区| 欧美日韩日日夜夜| 免费在线观看一区二区三区| 日韩精品中文字幕一区二区三区| 久久精品久久99精品久久| 2023国产精品自拍| 国产宾馆实践打屁股91| 亚洲欧美日韩国产中文在线| 欧美午夜宅男影院| 精品夜夜嗨av一区二区三区| 国产日韩一级二级三级| 日本道色综合久久| 日韩精品一卡二卡三卡四卡无卡| 日韩一区二区精品葵司在线| 国产成a人亚洲| 亚洲在线观看免费视频| 精品日韩一区二区| 99综合电影在线视频| 日韩制服丝袜av| 亚洲国产精品av| 在线播放中文一区| 丰满白嫩尤物一区二区| 亚洲观看高清完整版在线观看| 精品日本一线二线三线不卡| www.日韩在线| 热久久免费视频| 亚洲欧洲国产日本综合| 91精品国产综合久久小美女| 高清av一区二区| 天天综合网天天综合色| 日本一区二区三区四区| 91麻豆精品91久久久久久清纯| 国产福利一区在线| 性感美女久久精品| 国产精品国产三级国产a| 日韩一区二区电影在线| 色综合久久久久久久| 激情久久五月天| 天堂av在线一区| 亚洲欧洲综合另类在线| 国产偷国产偷精品高清尤物 | 韩国成人在线视频| 亚洲第一主播视频| 国产精品伦一区| 久久婷婷色综合| 欧美福利视频导航| 91极品美女在线| 成人99免费视频| 国产aⅴ综合色| 韩国av一区二区三区在线观看| 亚洲国产精品久久久久秋霞影院| 中文字幕电影一区| 久久精品人人做人人综合| 日韩精品自拍偷拍| 欧美一激情一区二区三区| 在线观看免费亚洲| 99re亚洲国产精品| 成人99免费视频| 99在线精品视频| av在线不卡观看免费观看| 国产精品一区2区| 国产精品一区专区| 国产麻豆午夜三级精品| 国产一区二区免费在线| 久久超碰97中文字幕| 蜜桃视频一区二区三区 | 国产日韩欧美综合在线| wwww国产精品欧美| 精品国产乱子伦一区| 久久综合久久综合亚洲| 精品国产乱码久久| 欧美精品一区视频| 久久免费的精品国产v∧| 欧美大黄免费观看| www国产精品av| 欧美激情一区二区三区蜜桃视频| 国产欧美一区视频| 中文字幕制服丝袜一区二区三区 | 麻豆专区一区二区三区四区五区| 亚洲成av人在线观看| 天堂午夜影视日韩欧美一区二区| 午夜精品久久久久久久99水蜜桃| 亚洲成人av免费| 毛片av一区二区三区| 国产成人8x视频一区二区| av资源网一区| 欧美高清精品3d| 欧美精品一区二区三区蜜臀| 久久久久久久久蜜桃| 亚洲欧美日韩电影| 三级影片在线观看欧美日韩一区二区| 人妖欧美一区二区| 成人av综合一区| 欧美综合一区二区| 久久综合五月天婷婷伊人| 国产精品久久久久久久久快鸭| 亚洲最大成人综合| 精品一区二区三区欧美| 高清不卡在线观看| 欧美乱熟臀69xxxxxx| 国产天堂亚洲国产碰碰| 亚洲午夜精品在线| 国模冰冰炮一区二区| 色狠狠一区二区| 日韩视频免费直播| 亚洲乱码国产乱码精品精可以看| 男男成人高潮片免费网站| 不卡一区中文字幕| 日韩视频免费观看高清完整版| 国产精品美女www爽爽爽| 日韩精品一级二级| 手机精品视频在线观看| 成人av在线网| 91麻豆精品国产91久久久资源速度| 欧美韩国日本综合| 久久精品国产亚洲a| 欧美无乱码久久久免费午夜一区| 久久伊人中文字幕| 亚洲成av人片在线|