cuda初学-02(大部分转载,小部分总结)

来源:互联网 发布:怎样加入淘宝网全球购 编辑:程序博客网 时间:2024/06/05 14:49

       线程格(grid)、线程块(block)以及线程(thread)之间的关系    


      内核函数的调用可以简化为kernel<<<A,B>>>(parameters),在尖括号中,A代表线程格(grid)的尺寸,它可以是三维的,用类型dim3表示,也可以是一维的,用int类型表示。B代表线程块(block)的尺寸,它与A类似,也可分别用dim3或int类型表示。

在内核函数内部,CUDA为我们内建了一些变量用于访问线程格、线程块的尺寸和索引等信息,它们是:
      1. gridDim:代表线程格(grid)的尺寸,gridDim.x为x轴尺寸,gridDim.y、gridDim.z类似。拿上图来说,它的gridDim.x = 3,gridDim.y = 2,gridDim.z = 1;
      2. blockIdx:代表线程块(block)在线程格(grid)中的索引值,拿上图来说,Block(1,1)的索引值为:blockIdx.x = 1,blockIdx.y = 1;
      3. blockDim:代表线程块(block)的尺寸,blockDIm.x为x轴尺寸。拿上图来说,注意到Block(1,1)包含了4 * 3个线程,因此blockDim.x = 4, blockDim.y = 3;
      4. threadIdx:代表线程的索引,如Thread(3,2),则threadIdx.x=3,threadIdx.y=2;
        在GPU上CUDA线程可以访问到的存储资源有很多,每个CUDA线程拥有独立的本地内存(local Memory);每一个线程块(block)都有其独立的共享内存(shared memory),共享内存对于线程块中的每个线程都是可见的,它与线程块具有相同的生存时间;同时,还有一片称为全局内存(global memory)的区域对所有的CUDA线程都是可访问的。
        除了上述三种存储资源以外,CUDA还提供了两种只读内存空间:常量内存(constant memory)纹理内存(texture memory),同全局内存类似,所有的CUDA线程都可以访问它们。对于一些特殊格式的数据,纹理内存提供多种寻址模式以及数据过滤方法来操作内存。这两类存储资源主要用于一些特殊的内存使用场合。

      函数修饰符__global__:告诉编译器,函数应该编译为在设备上运行。从主机上调用并在设备上运行。

                      __device__:代码在GPU运行。被声明为__device__的函数,只能从其他__device__函数或者__global__函数中调用他们。

                          



     内置变量 ,注意i大写;

                     threadIdx,CUDA的每一个线程都有其线程ID,线程的ID信息由变量threadIdx给出。通常它用一个三维数组来表示

                     threadIdx.x;threadIdx.y;threadId.z;

                     blockIdx.x,变量中包含的值就是当前执行设备代码的线程块的索引。

                     如果线程块是一维的,则线程Id=threadIdx.x;

                     如果线程块是二维的,则线程Id=threadIdx.x+threadIdx.y*blockDim.x;

                     如果线程块是三维的,则线程Id=threadIdx.x+threadIdx.y*blockDim.x+threadIdx.z*blockDim.x*blockDim.y;(blockDim.x代表线程块中x轴的线程数量)

                     需要注意的是,在启动线程块数组的时候,数组每一维的最大数量都不不能超过65536;     dim3 grid(DIM,DIM);kernel<<<grid,1>>>();类型dim3表示一个三维数组,可以用于指定启动的线程块的数量。三维数组的最后一维的大小为1,(目前并不支持三维数组);

    

              

0 0
原创粉丝点击