CUDA编程学习(三)

我们知道一个grid包含多个block,而一个block又包含多个thread,下面将是如何进行下thread中的并行。

/**** Splot a block into parallel threads****/ _global_ void add(int *a, int *b, int *c) { c[threadIdx.x] = a[threadIdx.x] + b[threadIdx.x]; } #define N 512



int main() { int *a, *b, *c;            //host copies of a, b, c

    int *d_a, *d_b, *d_c;    //device copies of a, b, c

    int size = N * sizeof(int); //Alloc space for device copies of a, b, c

    cudaMalloc((void **)&d_a, size); cudaMalloc((void **)&d_b, size); cudaMalloc((void **)&d_c, size); //Alloc space for host copies of a, b, c and setup input values

    a = (int *)malloc(size); random_ints(a, N); b = (int *)malloc(size); random_ints(b, N); c = (int *)malloc(size); //Copy the data into device

 cudeMemcpy(d_a, a, size, cudaMemcpyHostToDevice); cudaMemcpy(d_b, b, size, cudaMemcpyHostToDevice); //Launch add() kernel on GPU with N blocks

    add<<<1,N>>>(d_a, d_b, d_c); //Copy result back to host

 cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost); //Cleanup

 free(a); free(b); free(c); cudeFree(d_a); cudaFree(d_b); cudaFree(d_c); return 0; } /**** What's the function of random_ints****/

void random_ints(int* a, int N) { int i; for (i = 0; i < N; ++i) a[i] = rand(); }

 

重点语句变化: grid下的 add<<<1,1>>>(d_a, d_b, d_c)  到block下的 add<<<N,1>>>(d_a, d_b, d_c); 最后到 thread下   add<<<1,N>>>(d_a, d_b, d_c);

你可能感兴趣的:(编程)