线程、同步和存储器

1、线程

       之前的向量加法和乘法例子中,都是采用N个块,每个块1个线程,或者1个块,N个线程来进行GPU的并行计算。但现实中一般都是一次并行启动多个块,每个块里面多个线程(最多为maxThreadPerBlock)。如果maxThreadPerBlock=512,需要并行的任务为N,可以这样调用内核:

gpuAdd << <((N + 511) / 512), 512> >> (d_a, d_b, d_c);

       当N很大时,而GPU每次启动的线程数有限,只能通过while循环批量启动线程 

//定义向量长度
#define N    50000
//定义向量加法内核函数
__global__ void gpuAdd(int *d_a, int *d_b, int *d_c) {
    //Getting block index of current kernel

    int tid = threadIdx.x + blockIdx.x * blockDim.x;    
    while (tid < N)
    {
        d_c[tid] = d_a[tid] + d_b[tid];
        tid += blockDim.x * gridDim.x;
    }
        
}

2、线程同步

       之前的例子线程都是独立计算的,但实际上,很多任务需要线程之间相互交换数据才能完成,必须存在某种能让线程彼此交流的机制,这就涉及到共享内存

posted @ 2021-09-11 09:09  ChangYuanD  阅读(37)  评论(0编辑  收藏  举报