入门

作者: 富有的心 | 来源:发表于2020-05-25 19:26 被阅读0次

    blockIdx是一个uint3类型,表示一个线程块的索引,一个线程块中通常有多个线程
    blockIdx.x是块在X方向上的索引,
    blockIdx.y是块在Y方向上的索引,

    threadIdx.x是线程在X方向上的索引(在自己的线程块内),
    threadIdx.y是线程在Y方向上的索引,

    blockDim是一个dim3类型,表示线程块的大小。
    blockDim.x是块在X方向上的线程数,(在X方向上每一块有多少个线程)
    blockDim.y是块在Y方向上的线程数,(在Y方向上每一块有多少个线程)

    gridDim.x表示x方向有几个block

    使用N个线程块,每一个线程块只有一个线程,即
    dim3 dimGrid(N);
    dim3 dimBlock(1);
    此时的线程号的计算方式就是
    threadId = blockIdx.x;

    使用一个线程块,该线程具有N个线程,即
    dim3 dimGrid(1);
    dim3 dimBlock(N);
    此时线程号的计算方式为
    threadId = threadIdx.x;

    使用M×N个线程块,每个线程块1个线程
    由于线程块是2维的,故可以看做是一个M*N的2维矩阵,其线程号有两个维度,即
    dim3 dimGrid(M,N);
    dim3 dimBlock(1);
    其中
    blockIdx.x 取值0到M-1
    blcokIdx.y 取值0到N-1
    pos = blockIdx.y * blcokDim.x + blockIdx.x;---线程序列号是从上到下后从左到右

    使用M个线程块,每个线程块内含有N个线程,即
    dim3 dimGrid(M);
    dim3 dimBlock(N);
    这种情况,可以把它想象成二维矩阵,矩阵的行与线程块对应,矩阵的列与线程编号对应,那线程号的计算方式为
    threadId = threadIdx.x + blcokIdx*blockDim.x;------------简单地,只需要在x方向上做计算

    使用M×N的二维线程块,每一个线程块具有P×Q个线程,即
    dim3 dimGrid(M, N);
    dim3 dimBlock(P, Q);
    其索引有两个维度
    threadId.x = blockIdx.xblockDim.x+threadIdx.x;
    threadId.y = blockIdx.y
    blockDim.y+threadIdx.y;

    变量类型限定符:用来确定某个变量在设备上的内存位置
    device表示位于全局内存空间,默认类型
    share表示位于共享内存空间
    constant表示位于常量内存空间
    texture表示其绑定的变量可以被纹理缓存加速访问

    相关文章

      网友评论

          本文标题:入门

          本文链接:https://www.haomeiwen.com/subject/jiduahtx.html