CUDA Basic程式設計

2021-08-20 23:57:46 字數 3288 閱讀 8623

1.向量點積 cuda dot product

question 1: dot product

dot product is a reduction from vectors to a scalar.

please implement the kernel of dot product in cuda. the host code is provided. your work will be evaluated by accuracy and efficiency.

計算兩個向量的點積 經典的官方教程

#include 

#define imin(a,b) (aconst

int n = 4096 * 4096;

const

int threadsperblock = 512;

const

int blockspergrid = imin(32, (n+threadsperblock-1) / threadsperblock); 取整

__global__ void dot( float *a, float *b, float *c )

temp[threadidx.x] = move;

//wait all threads calculate over

__syncthreads();

// thread 0 sums the pairwise products

// calculate current block. 而不是將thread_sum放在thread_0計算

int i = blockdim.x/2;

while (i != 0)

if (threadidx.x == 0)

c[blockidx.x] = temp[0];

}int main( void )

// copy the arrays 'a' and 'b' to the gpu

cudamemcpy( dev_a, a, n*sizeof(float),

cudamemcpyhosttodevice ) ;

cudamemcpy( dev_b, b, n*sizeof(float),

cudamemcpyhosttodevice ) ;

//注意thread的wait

dot<<>>( dev_a, dev_b,

dev_partial_c );

// copy the array 'c' back from the gpu to the cpu

cudamemcpy( partial_c, dev_partial_c,

blockspergrid*sizeof(float),

cudamemcpydevicetohost ) ;

// finish up on the cpu side

// 統計block_sum in grid

c = 0;

for (int i=0; i//#define sum_squares(x) (x*(x+1)*(2*x+1)/6) //此程式相當於計算0,1,...n-1的平方和

//printf("does gpu value %.10g = %.10g?\n", c, 2*sum_squares((float)(n-1)));

//printf("does gpu value %f = %f?\n", c, 2*sum_squares((float)(n-1)));

// free memory on the gpu side

cudafree( dev_a ) ;

cudafree( dev_b ) ;

cudafree( dev_partial_c );

// free memory on the cpu side

free( a );

free( b );

free( partial_c );}/*

blockdim.x,y,z gives the number of threads in a block, in the particular direction

griddim.x,y,z gives the number of blocks in a grid, in the particular direction

blockdim.x * griddim.x gives the number of threads in a grid (in the x direction, in this case)

1 block的官方examle

__global__ voiddot( int*a, int*b, int*c )

}*/

2.cuda實現列舉排序

列舉排序(enumeration sort)是一種最簡單的排序演算法,通常也稱為秩排序(rank sort)。該演算法的具體思想是(假設按關鍵字遞增排序),對每乙個待排序的元素統計小於它的所有元素的個數,從而得到該元素最終處於序列中的位置。假定待排序的n個數存在a[1], …, a[n]中。首先將a[1]與a[2],…, a[n]比較,記錄比其小的數的個數,假設為k,則a[1]就被存入有序的陣列b[1], b[2],…, b[n]的b[k+1]位置上;然後將a[2]與a[1], a[3],…, a[n]比較,記錄比其小的數的個數,以此類推。這樣的比較操作共n(n-1)次,所以序列秩排序的時間複雜度為o(n2). 請用cuda並行列舉排序法

//感覺block沒用好  是不是再遍歷全部array之前有個combine操作?

//目前計算是9s 有點慢呢

#include

#include

#include

#include

#define block_size 512

__global__ void ranksortkernel(const

unsigned

int *ori, unsigned

int *sorted, unsigned

int len)

for(int i=0;iint main ( int argc, char *argv )

printf("sort ok\n");

cudafree(d_ori);

cudafree(d_sorted);

delete ori;

delete gpusorted;

return0;}

/*1.cuda中kernel函式<<>>和<<>>區別?

*/

程式設計,還是程式設計

喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...

少兒程式設計程式設計

機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...

LINUX程式設計 socket程式設計

什麼是套接字 套接字是一種通訊過程,它使客戶 伺服器系統的開發工作既可以在本地單機上進行,也可以跨網路進行。套接字建立過程 1,建立乙個套接字,這是分配給該伺服器程序的乙個作業系統資源,套接字由伺服器通過系統呼叫socket建立出來的,所以其它程序將不能對它進行訪問。2,給套接字起個名字,用系統呼叫...