矩陣按行 列 求和CUDA並行演算法設計

2021-08-21 13:30:16 字數 2126 閱讀 5873

通過矩陣按行求和與按列求和兩個示例介紹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;

t sh_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)

volatile float *smem = sh_b;

if (blocksize >=  64)

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並行演算法設計的思路,希望對大家有所幫助。很多公司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個結果。這個二元操作符可以是求和 取最大 取最小 平方 邏輯與或等等。我們以...