《CUDA C编程权威指南》——1.4节使用CUDA C编程难吗

本节书摘来自华章社区《CUDA C编程权威指南》一书中的第1章,第1.4节使用CUDA C编程难吗,作者[美] 马克斯·格罗斯曼(Max Grossman),更多章节内容可以访问云栖社区“华章社区”公众号查看

1.4 使用CUDA C编程难吗
CPU编程和GPU编程的主要区别是程序员对GPU架构的熟悉程度。用并行思维进行思考并对GPU架构有了基本的了解,会使你编写规模达到成百上千个核的并行程序,如同写串行程序一样简单。
如果你想编写一个像并行程序一样高效的代码,那么你需要对CPU架构有基本的了解。例如,数据局部性在并行编程中是一个非常重要的概念。数据局部性指的是数据重用,以降低内存访问的延迟。数据局部性有两种基本类型。时间局部性是指在相对较短的时间段内数据和/或资源的重用。空间局部性是指在相对较接近的存储空间内数据元素的重用。现代的CPU架构使用大容量缓存来优化具有良好空间局部性和时间局部性的应用程序。设计高效利用CPU缓存的算法是程序员的工作。程序员必须处理低层的缓存优化,但由于线程在底层架构中的安排是透明的,所以这一点程序员是没有办法优化的。
CUDA中有内存层次和线程层次的概念,使用如下结构,有助于你对线程执行进行更高层次的控制和调度:
内存层次结构
线程层次结构
例如,在CUDA编程模型中使用的共享内存(一个特殊的内存)。共享内存可以视为一个被软件管理的高速缓存,通过为主内存节省带宽来大幅度提高运行速度。有了共享内存,你可以直接控制代码的数据局部性。
当用ANSI C语言编写一个并行程序时,你需要使用pthreads或者OpenMP来显式地组织线程,这两项技术使得在大多数处理器架构以及操作系统中支持并行编程。当用CUDA C编写程序时,实际上你只编写了被单个线程调用的一小段串行代码。GPU处理这个内核函数,然后通过启动成千上万个线程来实现并行化,所有的线程都执行相同的计算。CUDA编程模型提供了一个层次化地组织线程的方法,它直接影响到线程在GPU上的执行顺序。因为CUDA C是C语言的扩展,通常可以直接将C程序移植到CUDA C程序中。概念上,剥离代码中的循环后产生CUDA C实现的内核代码。
CUDA抽象了硬件细节,且不需要将应用程序映射到传统图形API上。CUDA核中有3个关键抽象:线程组的层次结构,内存的层次结构以及障碍同步。这3个抽象是最小的一组语言扩展。随着CUDA版本的更新,NVIDIA正在对并行编程进行不断简化。尽管一些人仍然认为CUDA的概念比较低级,但如果稍稍提高抽象级,对你控制应用程序和平台之间的互动关系来说会增加很大难度。如果那样的话,不管你掌握了多少底层架构的知识,你的应用程序的性能都将超出控制。
因此,你的目标应是学习GPU架构的基础及掌握CUDA开发工具和环境。
CUDA开发环境
NVIDIA为C和C++开发人员提供了综合的开发环境以创建GPU加速应用程序,包括以下几种。
NVIDIA Nsight集成开发环境
CUDA-GDB命令行调试器
用于性能分析的可视化和命令行分析器
CUDA-MEMCHECK内存分析器
GPU设备管理工具
当你熟悉这些工具的使用之后,你会发现使用CUDA C语言进行编程是非常简单高效的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值