本博文主要講解下基於cuda的矩陣相乘,cuda特別擅長的就是矩陣乘法,而且也比較容易實現。通過矩陣乘法的實現,可以比較容易理解cuda的核心思想。網上也有很多基於cuda實現的矩陣乘法,但是感覺都不完成,要不就是有錯,本文給出的**都是經過驗證可行的,希望能夠幫助到大家。
矩陣乘法實現方式一:矩陣乘法的逐點實現方式,具體如下圖所示
對應實現**:
#include #include #include __global__ void matmul(int *m,int *n,int *p,int width)
p[y * width + x] = value;
}int main() }
int size = nd * nd;
//資料拷貝,主機到裝置
cudamemcpy(m,a,size * sizeof(int),cudamemcpyhosttodevice);
cudamemcpy(n,b,size * sizeof(int),cudamemcpyhosttodevice);
cudaeventrecord(start,0);
matmul<<<1,blocksize>>>(m,n,p,width);//呼叫核函式
cudathreadsynchronize();
cudaeventrecord(stop,0);
cudaeventsynchronize(stop);
cudaeventelapsedtime(&elapsedtime,start,stop);
cudamemcpy(c,p,size * sizeof(int),cudamemcpydevicetohost);
printf("c0 = %d \n",c[0][0]);
//釋放裝置記憶體
cudafree(m);
cudafree(n);
cudafree(p);
return 0;
}
執行結果:
矩陣相乘實現方式二:矩陣乘法分塊實現,具體如下圖所示
具體**實現:
#include #include #include #define tile_width 10
//核函式的具體實現
__global__ void matmul(int *m,int *n,int *p,int width)
p[row * width + col] = pervalue;
}int main() }
//資料拷貝,主機到裝置
cudamemcpy(m,a,size * sizeof(int),cudamemcpyhosttodevice);
cudamemcpy(n,b,size * sizeof(int),cudamemcpyhosttodevice);
cudaeventrecord(start,0);
matmul<<>>(m,n,p,nd); //呼叫核函式
cudathreadsynchronize();
cudaeventrecord(stop,0);
cudaeventsynchronize(stop);
cudaeventelapsedtime(&elapsedtime,start,stop);
cudamemcpy(c,p,size * sizeof(int),cudamemcpydevicetohost);
printf("c0 = %d\n",c[0][0]);
cudafree(m);
cudafree(n);
cudafree(p);
return 0;
}
執行結果: CUDA矩陣相乘
include include include include 並行矩陣乘法kernel函式 global void matrixmultiply int m d,int n d,int p d,int width p d row width col p 每個執行緒計算p d矩陣的乙個元素 生成隨機...
cuda矩陣相乘 CUDA的矩陣乘法
2 那麼下面就是不使用shared memory的並行化演算法的思路。簡單地來說,就是將上述可並行化的部分傳遞給gpu,使用cuda來計算。如下 void matrixmulondevice float m,float n,float p,intwidth int size width width ...
CUDA 共享儲存器實現矩陣相乘
共享儲存器使用 shared 限定詞分配。cuda程式設計介面 執行初始化與裝置儲存器 cuda程式設計介面 使用nvcc編譯器的相容性 cuda程式設計介面 如何用nvcc編譯cuda程式 cuda程式設計模型 儲存器層次和異構程式設計 cuda程式設計模型 核心與執行緒層次概述 正如在前面的文章...