01年開始,研究人員把GPU當做數據並行協處理器(GPGPU)
07年,英偉達發佈CUDA (Compute Uniform Device Architecture)統一計算設備架構
08年,OpenCL規範,使得並行計算可以擴展到更多設備平臺上去
CUDA的一些信息(線程嘛)
層次化線程集合A hierarchy of thread groups,共享儲存Shared memories,同步Barrier Synchronization
CUDA術語 Host和device通常就是指cpu和gpu,採用ANSI標準C的擴展語言編程,編程時候,有主機端和設備端兩部分的代碼
Kernel,數據並行處理函數,在設備端有硬件負責創建調度線程,在主機端調這個函數
想吃飯了,先不寫了~哈哈哈
隔了四天接着學,接着寫
float *Md
int size=width*width*sizeof(float);
cudaMalloc((void**)&Md,size);
...
cudaFree(Md);
這個(void**)&Md指針是指向設備的指針,cpu不能調用
cudaMemcpy()內存傳輸 :主機端向主機端,設備端向設備端,主機端向設備端,設備端向主機端
cudaMemcpy(目的地址,原地址,大小,cudaMemcpyHostToDevice);
Matrix Multiply矩陣相乘算法提示:向量,點乘,行優先還是列優先?每次點乘結果輸出一個元素
1000*1000矩陣
1,000,000點乘,每一個點需要1000個乘法和1000個加法
void MatrixMulOnHost(float* M,float *N,float* p,int width)
{
for(int i=0;i<width;++i)
for(int j+0;j<width;++j)
{
float sum=0;
for(int k=0;K<width;++k)
{float a =M[i*width+k];
float b=N[k*width+j];
sum+=a*b;
}
P[i*width+j]=sum;
}
}
這是在cpu上的算法,現在看CUDA算法框架
第一步,是要管理整個內存,要爲輸入的原始數據已經輸出的結構,這些要分配內存 M N P
第二步,並行運算
第三部,把結果拷貝回來,釋放內存
void MatrixMulOnDevice(float* M,float *N,float* p,int width)
{
int size=width*width*sizeof(float);
//第一步,給M和N裝填設備內存
cudaMalloc(Md,size);
cudaMemcpy(Md,M,size,cudaMemcpyHostToDevice);
cudaMalloc(Nd,size);
cudaMemcpy(Nd,N,size,cudaMemcpyHostToDevice);
cudaMalloc(Pd,size);
//都是GPU上的空間
//2.kernel invocation code
}
__global__ void MatrixMulKernel(loat* Md,float *Nd,float* pd,int width)
{
int tx=threadIdx.x;
int ty=threadIdx.y;
float Pvalue=0;
for(int k=0;k<width;++k)
{
float Mdelement =Md[ty*Md.width+k];
float Ndelement =Nd[k*Md.width+tx];
Pvalue+=Mdelement*Ndelement;
}
Pd[ty*width+tx]=Pvalue;
}
//第三步,cuda C調用Kernel
//Setup the execution configuration
dim3 dimBlock(WIDTH,WIDTH);
dim3 dimGrid(1,1);
MatrixMulKernel<<<dimGrid,dimBlock>>>(Md,Nd,Pd);
//是不是少了一個參數啊;
之前看的沒有這樣調用的啊,
dim3 dimBlock(WIDTH,WIDTH);
這的是每個block立面的線程數對嗎,這就是1,000,000 啊,不是說的好這裏的約束是65536個嘛
下面的意思是調用了1個block,然後立面有一百萬個線程同時運算,這個參數也有問題,這個課結束了,容我再看看