天天看點

GPU程式設計—cuda并行機制

寒假在家,不知道是因為寒冷還是因為沒有女朋友,總是沒有多少的幹勁,總是一天打魚,兩天曬網。

今天我有開始學習,GPU程式設計的一些知識,我們 都知道GPU是我們日常生活中必不可少的東西,但是我們對他的了解可謂是少之又少,但是,當我知道GPU的強大功能的時候我真是驚呆了。

他強大的并行運作能力簡易的程式設計理論,以及成熟的硬體支援,讓其在并行計算的世界裡胡作非為。下面直接貼上我今天學習的内容,

<pre name="code" class="cpp">#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#define N 10
           
__global__ void add (int *a,int *b ,int *c  ){
	int tid=blockIdx.x;
	if (tid<N)
		c[tid]=a[tid]+b[tid];
}

int main (void){
int a[N],b[N],c[N];
	int *dev_a,*dev_b,*dev_c;
	cudaMalloc((void**)&dev_a,N*sizeof(int));
	cudaMalloc((void**)&dev_b,N*sizeof(int));
	cudaMalloc((void**)&dev_c,N*sizeof(int));
	for (int i=0;i<N;i++){
		a[i]=-i;
		b[i]=i*i;
	}
	cudaMemcpy(dev_a,a,N*sizeof(int),cudaMemcpyHostToDevice);
	cudaMemcpy(dev_b,b,N*sizeof(int),cudaMemcpyHostToDevice);
	add <<<N,1>>>(dev_a,dev_b,dev_c);
	cudaMemcpy(c,dev_c,N*sizeof(int ),cudaMemcpyDeviceToHost);
	for(int i=0;i<N;i++){
		printf ("%d+%d=%d\n",a[i],b[i],c[i]);
	}
	getchar();
	return 0;
}
           

我們可以看到這裡的尖括号裡面的數不是1,1而是N,1,這是為什麼呢,N其實就是代表在GPU中所開辟的線程塊的數量