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,給套接字起個名字,用系統呼叫...