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

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

cuda《學習筆記三》——共享內存和同步

2019-11-14 08:47:14
字體:
來源:轉載
供稿:網友

一、前言

       本文介紹CUDA編程的共享內存和同步。共享內存中的變量(核函數中用__shared__聲明),在GPU上啟動的每個線程塊,編譯器都創建該變量的副本,若啟動N個線程塊,則有N個該變量副本,為每個線程塊私有;同步則是使線程塊中所有的線程能夠在執行完某些語句后,才執行后續語句。

二、線程塊、線程索引

以下為線程塊與線程的層次結構圖

      

       每個線程均獨自執行核函數,若在核函數中聲明共享變量,則每個線程塊均擁有該變量的一個副本,且該副本為該程序塊內的所有線程所共享。

三、共享變量和同步例子

(1)以下程序實現了點積運算,計算公式為 f(n) = 1+2*2+ 3*3+ … (n-1)*(n-1),使用共享變量計算各個程序塊內所有線程的求和運算結果。

#include <cuda_runtime.h>  #include <iostream>  //main1.cu#include "book.h"using namespace std;#define N 33*1024          //數組長度const int threadsPerBlock = 64;   //每個線程塊的線程數量const int blocksPerGrid = 64;     //第一維線程格內線程數量__global__ void add(float *a, float *b, float *c){	__shared__ float cache[threadsPerBlock];         //__shared__聲明共享變量,每個線程塊均有自己的副本,被其所有	                                                 //線程共享,這里用于存放每個線程塊內各個線程所計算得的點積和	int index =threadIdx.x + blockIdx.x *blockDim.x;    //將線程塊、線程索引轉換為數組的索引	int cacheIdx = threadIdx.x;	float temp = 0;	while (index < N){		temp += a[index] * b[index];		index += gridDim.x * blockDim.x;	}	cache[cacheIdx] = temp;      //存放每個線程塊內各個線程所計算得的點積和	__syncthreads();               //cuda內置函數,使所有線程均執行完該命令前代碼,才執行后面語句,也即保持同步	                               //目的為獲得各個cache副本,此時共有64個cache副本		//規約運算,將每個cache副本求和,結果保存于cache[0]	int i = blockDim.x / 2;	while (i != 0){		if (cacheIdx < i){			cache[cacheIdx] += cache[i + cacheIdx];		}		__syncthreads();    //所有線程完成一次規約運算,方可進行下一次		i /= 2;	}	if (cacheIdx == 2)     //一個操作只需一個線程完成即可		c[blockIdx.x] = cache[0]; //所有副本的cache[0] 存放于數組c}int main(){	float a[N], b[N];	float *c = new float[blocksPerGrid];	float *dev_a, *dev_b, *dev_c;	//gpu上分配內存	HANDLE_ERROR(cudaMalloc((void**)&dev_a, N*sizeof(float)));	HANDLE_ERROR(cudaMalloc((void**)&dev_b, N*sizeof(float)));	HANDLE_ERROR(cudaMalloc((void**)&dev_c, N*sizeof(float)));	//為數組a,b初始化	for (int i = 0; i < N; ++i){		a[i] = i;		b[i] = i;	}	//講數組a,b數據復制至gpu	(cudaMemcpy(dev_a, a, N*sizeof(float), cudaMemcpyHostToDevice));	(cudaMemcpy(dev_b, b, N*sizeof(float), cudaMemcpyHostToDevice));		add <<< blocksPerGrid, threadsPerBlock >> >(dev_a, dev_b, dev_c);	//將數組dev_c復制至cpu	HANDLE_ERROR(cudaMemcpy(c, dev_c, blocksPerGrid*sizeof(float), cudaMemcpyDeviceToHost));		//進一步求和	double sums = 0.0;	for (int i = 0; i < blocksPerGrid; ++i){		sums += c[i];	}	//顯示結果	cout << "gpu dot compute result:" << sums << "/n";	sums = 0.0;	for (int i = 0; i < N; ++i){		sums += i*i;	}	cout << "cpu dot compute result:" << sums << "/n";	//釋放在gpu分配的內存	cudaFree( dev_a);	cudaFree(dev_b);	cudaFree(dev_c);	delete c;	return 0;}

運行結果

(2)以下程序使用二維程序塊共享變量計算圖像數據,生成圖像

//main2.cu#include <cuda_runtime.h>  #include <iostream>  #include "book.h"#include <opencv2/opencv.hpp>using namespace cv;using namespace std;#define PI 3.1415926#define DIM 1024       //灰度圖像的長與寬__global__ void kernel(uchar * _ptr ){	int x = threadIdx.x + blockIdx.x * blockDim.x;	int y = threadIdx.y + blockIdx.y * blockDim.y;	int idx = x + y *gridDim.x *blockDim.x;	__shared__ float shared [16][16] ;   //每個線程塊中每個線程的共享內存緩沖區	const float period = 128.0f;	shared[threadIdx.x][threadIdx.y] = 255 * (sinf(x*2.0f*PI / period) + 1.0f)*(sinf(y*2.0f*PI / period) + 1.0f) / 4.0f;	__syncthreads();   //使所有shared副本均被計算完成	_ptr[idx] = shared[15 - threadIdx.x][15 - threadIdx.y];}int main(){	Mat src(DIM,DIM , CV_8UC1 , Scalar::all(0));	uchar *ptr_dev;	HANDLE_ERROR(cudaMalloc((void**)&ptr_dev, DIM * DIM*sizeof(uchar)));	dim3 blocks(DIM / 16, DIM / 16);	dim3 threads(16 ,16);	kernel << < blocks, threads >> >( ptr_dev );	HANDLE_ERROR(cudaMemcpy(src.data, ptr_dev, DIM * DIM*sizeof(uchar), cudaMemcpyDeviceToHost));	cudaFree(ptr_dev);	namedWindow("Demo",  0);	imshow("Demo" , src);	waitKey(0);	return 0;}運行結果:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美理论在线观看| 一区二区三区在线播放欧美| 成人午夜一级二级三级| 91美女片黄在线观看游戏| 亚洲第一综合天堂另类专| 91精品免费久久久久久久久| 亚洲天堂av在线免费| 91成人在线播放| 91中文字幕在线观看| 日韩欧美成人精品| 最新的欧美黄色| 美女视频黄免费的亚洲男人天堂| 国产精品成人av性教育| 欧美激情视频免费观看| 国产丝袜一区视频在线观看| 精品国产户外野外| 日韩中文有码在线视频| 国产主播在线一区| 亚洲香蕉成人av网站在线观看| 国产视频亚洲精品| 国产欧美精品xxxx另类| 欧美最猛性xxxxx(亚洲精品)| 色999日韩欧美国产| 欧美亚洲激情视频| 91干在线观看| 欧美xxxx综合视频| 欧美亚洲免费电影| 91久久精品在线| 欧美日韩激情视频8区| 一区三区二区视频| 国产香蕉97碰碰久久人人| 国内精品久久久久久影视8| 91色p视频在线| 久久夜色精品亚洲噜噜国产mv| 亚洲精品美女网站| 亚洲人a成www在线影院| 日韩欧美在线视频免费观看| 亚洲高清色综合| 国产午夜精品理论片a级探花| 欧美精品videofree1080p| 国产精品嫩草视频| 国产中文字幕亚洲| 亚洲精品国产精品自产a区红杏吧| 亚洲大尺度美女在线| 国产一区二区三区在线观看网站| 91精品视频在线| 国产精品高潮呻吟久久av黑人| 日韩av手机在线观看| 久久这里有精品视频| 91精品国产高清久久久久久| 亚洲人成五月天| 欧美人在线视频| 欧美日韩国产一区二区三区| 欧美在线视频观看| 精品香蕉一区二区三区| 91丝袜美腿美女视频网站| 日韩av一区在线| 日本国产一区二区三区| 亚洲黄色有码视频| 深夜福利91大全| 日韩在线视频免费观看高清中文| 精品一区二区三区三区| 亚洲区免费影片| 色悠悠久久久久| 国产成人欧美在线观看| 精品国产欧美一区二区五十路| 亚洲第一网中文字幕| 91在线观看免费网站| 亚洲无线码在线一区观看| 久久久久久久久久久免费精品| 亚洲午夜未删减在线观看| 国产精品福利无圣光在线一区| 国产欧美日韩高清| 色偷偷噜噜噜亚洲男人的天堂| 色黄久久久久久| 午夜精品美女自拍福到在线| 亚洲国产成人精品久久久国产成人一区| 欧美激情18p| 久久乐国产精品| 在线观看久久av| 最近2019中文免费高清视频观看www99| 亚洲欧美日韩国产中文| 久久亚洲欧美日韩精品专区| 国产精品久久久亚洲| xvideos亚洲人网站| 国产一区二区三区在线| 日韩av成人在线观看| 蜜月aⅴ免费一区二区三区| 精品magnet| 精品国产欧美一区二区三区成人| 国产亚洲欧美日韩美女| 亚洲欧美日韩区| 日韩亚洲第一页| 亚洲自拍另类欧美丝袜| 国产精品视频自拍| 热久久视久久精品18亚洲精品| 欧美专区中文字幕| 精品久久久久久久久久久| 日韩高清不卡av| 国产成人午夜视频网址| 亚洲美女动态图120秒| 国产午夜精品一区理论片飘花| 国产精品欧美风情| 亚洲精品久久久久中文字幕欢迎你| 夜夜嗨av色一区二区不卡| 亚洲三级 欧美三级| 韩国三级日本三级少妇99| 久久久国产精品x99av| 懂色aⅴ精品一区二区三区蜜月| 91在线视频成人| 欧美一级成年大片在线观看| 亚洲偷熟乱区亚洲香蕉av| 亚洲在线观看视频网站| 国产精品欧美日韩久久| 国产精品视频最多的网站| 26uuu另类亚洲欧美日本老年| 91久久久久久久久久久| 一区二区三区亚洲| 视频在线观看一区二区| 青青草精品毛片| 欧美精品福利在线| 国产精品久久久久久av下载红粉| 成人美女av在线直播| 91久久中文字幕| 免费97视频在线精品国自产拍| 91精品久久久久久综合乱菊| 日韩免费在线免费观看| 欧美激情久久久久久| 亚洲成人亚洲激情| 国产99久久久欧美黑人| 欧美老女人bb| 在线免费看av不卡| 国产精品成人av性教育| 日韩中文字幕网| 久久中国妇女中文字幕| 成人亚洲欧美一区二区三区| 日本高清不卡在线| 欧美高清视频在线播放| 国产一区二区三区久久精品| 亚洲男人av在线| 精品久久久久国产| 国产又爽又黄的激情精品视频| 国产伦精品一区二区三区精品视频| 最近2019中文字幕mv免费看| 欧美日韩一区二区在线| 欧美精品免费在线观看| 亚洲精品网址在线观看| 91久热免费在线视频| 国产欧美在线看| 日韩视频免费在线观看| 日韩激情av在线免费观看| 精品久久香蕉国产线看观看亚洲| 欧美日韩国产精品一区二区三区四区| 亚洲综合最新在线| 日韩精品日韩在线观看| 精品久久久久久中文字幕一区奶水| 国内精品小视频在线观看| 亚洲色图综合久久| 国产精品久久久久久久美男| 日韩少妇与小伙激情| 国产精品在线看| 68精品国产免费久久久久久婷婷| 北条麻妃在线一区二区| 欧美黑人狂野猛交老妇|