通過矩陣按行求和與按列求和兩個示例介紹cuda並行演算法設計的思路,希望對大家有所幫助。很多公司cuda工程師面試也會考察這個題目。
1. 矩陣按行求和
矩陣a[m][n],b[m];
b[i] =a[0]+a[1]+...+
a[n-1];
序列**:
#define a(i)(j) a[(i)*n+(j)]
void sum_row(t *a,t*b,int m,int n)
int i,j;
t tmp;
for(i=0; itmp=0;
for(j=0; jtmp += a(i)(j);
b[i] = tmp;
cuda程式設計:
每個block處理一行資料的求和,m設定為block數目,即
dim3
dimblock(blocksize, 1, 1);
dim3
dimgrid(m, 1, 1);
__global__ void sum_row_kernel(t*a,t *b,int m,int n)
int i,j;
t tmp;
unsigned
inttid =threadidx.x;
i = blockidx.x;
tmp=0;
tsh_b[blocksize];
sh_b[tid] = 0;
__syncthreads();
for(j=tid; jtmp += a(i)(j);
sh_b[tid] = tmp;
__syncthreads();
if (blocksize >= 512) __syncthreads();}
if (blocksize >= 256) __syncthreads(); }
if (blocksize >= 128) __syncthreads(); }
if (tid < 32)
if (blocksize >= 32)
if (blocksize >= 16)
if (blocksize >= 8)
if (blocksize >= 4)
if (blocksize >= 2) }
if(tid==0)
b =sh_b[0];
備註:
1)當m比較大,n比較小時,可以採用乙個warp處理一行的方式; 2)
當m比較小,n比較大時,可以讓多個block處理一行的求和
以上的設計可以保證足夠多的執行緒數和block數,充分利用gpu資源。
2. 矩陣按列求和
矩陣a[m][n],b[n];
b[j] = a[0][j]+a[1][j]+...+
a[m-1][j];
序列**:
#define a(i)(j) a[(i)*n+(j)]
void sum_col(t *a,t*b,int m,int n)
int i,j;
t tmp;
for(j=0; jtmp=0;
for(i=0; itmp += a(i)(j);
b[j] = tmp;
cuda程式設計:
每個執行緒處理一列資料的求和,n/threads設定為block數目,即
dim3
dimblock(blocksize, 1, 1);
dim3
dimgrid((m+ blocksize-1)/ blocksize, 1, 1);
__global__ void sum_col_kernel(t*a,t *b,int m,int n)
int i,j;
t tmp;
j = blockidx.x*blockdim.x+ threadidx.x;
tmp=0;
for(i=0; itmp += a(i)(j); //可以滿足合併訪問
b[j] = tmp;
備註:
當m比較大,n比較小時,可以採用乙個block處理一列的方式,然後對block內的值再求和
矩陣按行 列 求和CUDA並行演算法設計
通過矩陣按行求和與按列求和兩個示例介紹cuda並行演算法設計的思路,希望對大家有所幫助。很多公司cuda工程師面試也會考察這個題目。1.矩陣按行求和 矩陣a m n b m b i a 0 a 1 a n 1 序列 define a i j a i n j void sum row t a,t b,...
CUDA程式設計實戰 並行向量求和
多個並行執行緒塊完成兩個向量的求和 如下 使用了10個並行執行緒塊 include include book.h using namespace std define n 10 global void add int a,int b,int c int main void int a n b n c...
cuda程式設計 CUDA程式設計入門(四)並行歸約演算法
這一篇我們一起學習一下如何使用cuda實現並行歸約演算法。首先我們要知道什麼是並行歸約。並行歸約 reduction 是一種很基礎的並行演算法,簡單來說,我們有n個輸入資料,使用乙個符合結合律的二元操作符作用其上,最終生成1個結果。這個二元操作符可以是求和 取最大 取最小 平方 邏輯與或等等。我們以...