Manycore Programming: CUDA 1

部署运行你感兴趣的模型镜像

在之前介绍了OpenMP的多核编程,这一节主要讲得就是CUDA的多处理器编程。

多核和多处理器平台的区别

作用的区别

这里写图片描述

多核平台的指令以及控制更加复杂,可以在单个周期实现很简单的操作。优化的时候是针对单个的线程,是对线性代码模型的加速。

多处理器更多的资源是在计算部分,实现的是减轻单个处理器的负载。

架构的区别

处理单个数据的能力CPU更强,在最大线程数量、带宽、每个cycle可以处理浮点计算个数来看,GPU更强。

这里写图片描述

什么时候用GPU比较合适呢?当然就是在并行很多的时候采用比较合适。在共享内存很多的时候使用的话,效率会比较低。

软硬件的内在模型

在这里主要是对CUDA做了一些介绍,然后这里的话是谈到了如果想要发挥CUDA的作用,那么必须了解其硬件特性,才能更好发挥其作用。

nVidia的硬件架构:
这里写图片描述

这里面谈到了CUDA的编程模型。语法和C很像。不过定义了主机和从机两部分的代码。主机一般就是CPU、从机就是GPU。主机发送数据到了从机,从机根据kernel编译的指令执行得到数据后返回给主机。

在CUDA的编程模型里面,首先是grid。grid就是比如一个main函数,里面调用了好几个不同的kernel,然后在执行的时候,每个就会生成一个grid。然grid是针对软件而言的,硬件上称之为streaming multiprocessor(SM),然后每个SM内部又有thread block,然后thread block里面又有好几个threads。每个SM之间是相互独立的。每个thread block能够容纳的最大线程数量是一定的。比如现在的gtx1080就是1024个线程。

在软件层面,有一个叫做warp的概念。就是把一些线程集合在一起,方便软件层面的使用。

这里写图片描述

应用的语义

接下来具体介绍CUDA的语法:

__global__ void vcos( int n, float* x, float* y ) { 
    int ix = blockIdx.x*blockDim.x + threadIdx.x; 
    y[ix] = cos( x[ix] );
}

int main() { 
    float *host_x, *host_y; float *dev_x, *dev_y; int n = 1024;
    // CPU的DRAM分配
    host_x = (float*)malloc( n*sizeof(float) ); 
    host_y = (float*)malloc( n*sizeof(float) );
    // GPU的DRAM上分配  
    cudaMalloc( &dev_x, n*sizeof(float) ); 
    cudaMalloc( &dev_y, n*sizeof(float) );

    /* TODO: fill host_x[i] with data here */
    // 数据拷贝 
    cudaMemcpy( dev_x, host_x, n*sizeof(float), cudaMemcpyHostToDevice );

    /* launch 1 thread per vector-element, 256 threads per block */ 
    bk = (int)( n / 256 ); 
    vcos<<<bk,256>>>( n, dev_x, dev_y );

    cudaMemcpy( host_y, dev_y, n*sizeof(float), cudaMemcpyDeviceToHost ); 
    /* host_y now contains cos(x) data */

    return( 0 );
}

CUDA的存储操作

cudaMalloc(void ** pointer, size_t nbytes) 
cudaMemset(void * pointer, int value, size_t count) 
cudaFree(void* pointer)

存储拷贝:

cudaMemcpy( !void *dst, void *src, size_t nbytes, 
enum cudaMemcpyKind direction);

direction specifies locations (host or device) of src and dst
Blocks CPU thread:  returns after the copy is completed 
Doesn’t start copying until previous CUDA calls complete enum cudaMemcpyKind 

cudaMemcpyHostToDevice 
cudaMemcpyDeviceToHost 
cudaMemcpyDeviceToDevice
cudaMemcpyPeer

CUDA的函数类型:有global、device、host三种。

这里写图片描述

对于CUDA的kernel调用的时候,各个参数的含义:
这里写图片描述

同步

在循环中至少两次访问同一个变量,那么就很有可能发生数据冲突。

举个例子:
这里写图片描述

比如在计算out[9]的值,然后out[10]在访问它。

那么如何修改呢?

这里写图片描述

然后在这里,使用的只是block的local memory的同步,还有更大的同步。比如gpu上的global memory的同步,以及整个cpu gpu系统的数据同步。

这里写图片描述

然后分别使用以下的函数实现:
这里写图片描述

接着是原子操作(原子操作就是读的时候不限制,写的时候建立临界区的操作。比单纯使用critic function更快)

这里写图片描述

CUDA平台

CUDA的代码是怎么在GPU上执行的呢?

整个模型如下:
这里写图片描述

CUDA和C/C++代码在一起,通过NVCC编译器,生成CPU执行的指令和GPU执行的指令,然后发送到不同的设备上执行。

相对GPU的并行编程,涉及CUDA有更多了解,看【1】【2】

参考链接:
【1】GPU的书籍: programming massive parallel processors.
【2】ppt截图来自于CMU:18-645 fast code的ppt

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值