CUDA笔记之一:实践编程篇


    这两天想看看GPU编程的东西,可是资料太稀少了,NVIDIA公司出的那个倒霉文档根本没法入门。现在算是东拉西扯的找到了一些资料,入了点门。先写点笔记吧,等有时间了,写个完整的pdf出来,和大家共享。

1 硬件架构
   CUDA编程中,习惯称CPU为Host,GPU为Device。

2 并行模型
   Thread:并行基本单位
   Block:相互合作的一组线程。可以彼此同步,快速交换数据,最多可以512个线程
   Grid:一组Block,有共享全局内存
   Kernel:在GPU上执行的程序,一个Kernel对应一个Grid

  Block和Thread都有各自的ID,记作blockIdx(1D,2D),threadIdx(1D,2D,3D)
   Block和Thread还有Dim,即blockDim与threadDim. 他们都有三个分量x,y,z
   线程同步:void __syncthreads(); 可以同步一个Block内的所有线程


3 存储层次
   per-thread register                             1 cycle
   per-thread local memory                     slow
   per-block shared memory                   1 cycle
   per-grid global memory                       500 cycle,not cached!!
   constant and texture memories            500 cycle, but cached and read-only
   分配内存:cudaMalloc,cudaFree,它们分配的是global memory
   Hose-Device数据交换:cudaMemcpy

  

4 变量类型
   __device__:GPU的global memory空间,grid中所有线程可访问
   __constant__:GPU的constant memory空间,grid中所有线程可访问
   __shared__:GPU上的thread block空间,block中所有线程可访问
  local:位于SM内,仅本thread可访问

   在编程中,可以在变量名前面加上这些前缀以区分。

5 数据类型
   内建矢量:int1,int2,int3,int4,float1,float2, float3,float4 ...
   纹理类型:texturetexRef;
   内建dim3类型:定义grid和block的组织方法。
   例如:
   dim3 dimGrid(2, 2);
   dim3 dimBlock(4, 2, 2);
   kernelFoo<<>>(argument);

6  CUDA函数定义

    __device__:执行于Device,仅能从Device调用。
        限制:不能用&取地址;不支持递归;不支持static variable;不支持可变长度参数
    __global__ void: 执行于Device,仅能从Host调用。此类函数必须返回void
    __host__:执行于Host,仅能从Host调用

    在执行kernel函数时,必须提供execution configuration,即<<<....>>>的部分。

    例如:
           __global__ void KernelFunc(...);
           dim3 DimGrid(100, 50); // 5000 thread blocks
           dim3 DimBlock(4, 8, 8); // 256 threads per block
           size_t SharedMemBytes = 64; // 64 bytes of shared memory
           KernelFunc<<< DimGrid, DimBlock, SharedMemBytes >>>(...);

7  CUDA包含一些数学函数,如sin,pow等。每一个函数包含有两个版本,例如正弦函数sin,一个普通版本sin,另一个不精确但速度极快的__sin版本。

8 内置变量
   gridDim, blockIdx, blockDim, threadIdx, wrapsize. 这些内置变量不允许赋值的

9 编写程序

   目前CUDA仅能良好的支持C,在编写含有CUDA代码的程序时,首先要导入头文件cuda_runtime_api.h。文件名后缀为.cu,使用nvcc编译器编译。本来想在这里给出些源码的,但是源码教程,以后单独开一个文章在说吧。

你可能感兴趣的:(CUDA)