# CUDA编程
CUDA(Compute Unified Device Architecture)的中文全称为计算统一设备架构。
[高性能编程 笔记 GPU高性能编程CUDA实战 CUDA与OpenCV实战,用于加速计算机视觉 并行机器编程 CUDA自带文档:CUDA_C_Programming_Guide](https://github.com/Ewenwan/CUDA-notes)
[pycuda](https://github.com/inducer/pycuda)
[CUDA编程之快速入门!!!!!推荐](https://www.cnblogs.com/skyfsm/p/9673960.html)
[参考](https://www.cnblogs.com/cuancuancuanhao/category/1236273.html)
[参考2](https://blog.csdn.net/fishseeker/article/details/75093166)
[参考3](https://bbs.csdn.net/topics/390798229)
[The CMake version of cuda_by_example ](https://github.com/Ewenwan/cuda_by_example)
[CUDA Program:CUDA image rgb to gray;CUDA KLT](https://github.com/canteen-man/CUDA-Program)
[CUDA 编程 加速 计算机视觉 !!!推荐](https://github.com/PacktPublishing/Hands-On-GPU-Accelerated-Computer-Vision-with-OpenCV-and-CUDA)
[并行编程 CUDA openMP 等](http://heather.cs.ucdavis.edu/~matloff/158/PLN/ParProcBook.pdf)
[并行编程 CUDA openMP 等 中文版](https://github.com/thirdwing/ParaBook)
# 0. 安装
cuda 下载 https://developer.nvidia.com/cuda-toolkit-archive 包含英伟达驱动
cudnn 下载 https://developer.nvidia.com/rdp/cudnn-download
旧版本驱动卸载
sudo apt-get remove --purge nvidia*
关闭图像服务 X 服务
sudo service lightdm stop
cuda 和 驱动安装
sudo sh cuda_xxxx.run
安装 cudnn
# 复制cudnn头文件
sudo cp cuda/include/* /usr/local/cuda-10.0/include/
# 复制cudnn的库
sudo cp cuda/lib64/* /usr/local/cuda-10.0/lib64/
# 添加可执行权限
sudo chmod +x /usr/local/cuda-10.0/include/cudnn.h
sudo chmod +x /usr/local/cuda-10.0/lib64/libcudnn*
输入如下命令查看是否安装成功:
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
# 背景
GPU里有很多Compute Unit(计算单元), 这些单元是由专门的处理逻辑, 很多register, 和L1 cache 组成. Memory access subsystem 把GPU 和RAM 连起来(通常是个L2 cache). Threads 以SIMT的形式运行: 多个thread共享一个instruction unit. 对NV GPU来说, 32 thread 组成一个warps, 对AMD GPU 来说, 64 threads 叫做一个wave fronts. 本文只使用warp的定义. 想达到最高速度, 一定要讨论SIMT, 因为它影响着memory access 也会造成code的序列化(serialization, parallelism的反面)
kernel function里会指出哪些code由一条thread处理, host program会决定多少条thread来处理一个kernel. 一个work group 里的thread可以通过barrier synchronization, 共享L1 cache 来互相协力. 再由compute unit处理这些work group. 能同时被conpute unit 运行的work group数量有限, 所以很多得等到其他完成之后再运行. 需要处理的work group的size和数量还有最大并行数量被称为kernel的execution configuration(运行配置).
kernel 的占用率就是指同时运行的thread数量除以最大数量. 传统建议就是提升这个占用率来获得更好的性能, 但也有一些其他因素比如ILP, MLP, instruction latencies, 也很关键.
# 1. GPU架构特点
首先我们先谈一谈串行计算和并行计算。我们知道,高性能计算的关键利用多核处理器进行并行计算。
当我们求解一个计算机程序任务时,我们很自然的想法就是将该任务分解成一系列小任务,把这些小任务一一完成。在串行计算时,我们的想法就是让我们的处理器每次处理一个计算任务,处理完一个计算任务后再计算下一个任务,直到所有小任务都完成了,那么这个大的程序任务也就完成了。
![](https://img2018.cnblogs.com/blog/1093303/201809/1093303-20180919122904566-1040268509.png)
串行计算的缺点非常明显,如果我们拥有多核处理器,我们可以利用多核处理器同时处理多个任务时,而且这些小任务并没有关联关系(不需要相互依赖,比如我的计算任务不需要用到你的计算结果),那我们为什么还要使用串行编程呢?为了进一步加快大任务的计算速度,我们可以把一些独立的模块分配到不同的处理器上进行同时计算(这就是并行),最后再将这些结果进行整合,完成一次任务计算。下图就是将一个大的计算任务分解为小任务,然后将独立的小任务分配到不同处理器进行并行计算,最后再通过串行程序把结果汇总完成这次的总的计算任务。
![](https://img2018.cnblogs.com/blog/1093303/201809/1093303-20180919122917935-1661200386.png)
所以,一个程序可不可以进行并行计算,关键就在于我们要分析出该程序可以拆分出哪几个执行模块,这些执行模块哪些是独立的,哪些又是强依赖强耦合的,独立的模块我们可以试着设计并行计算,充分利用多核处理器的优势进一步加速我们的计算任务,强耦合模块我们就使用串行编程,利用串行+并行的编程思路完成一次高性能计算。
接下来我们谈谈CPU和GPU有什么区别,他们俩各自有什么特点,我们在谈并行、串行计算时多次谈到“多核”的概念,现在我们先从“核”的角度开始这个话题。首先CPU是专为顺序串行处理而优化的几个核心组成。而GPU则由数以千计的更小、更高效的核心组成,这些核心专门为同时处理多任务而设计,可高效地处理并行任务。也就是,CPU虽然每个核心自身能力极强,处理任务上非常强悍,无奈他核心少,在并行计算上表现不佳;反观GPU,虽然他的每个核心的计算能力不算强,但他胜在核心非常多,可以同时处理多个计算任务,在并行计算的支持上做得很好。
GPU和CPU的不同硬件特点决定了他们的应用场景,CPU是计算机的运算和控制的核心,GPU主要用作图形图像处理。图像在计算机呈现的形式就是矩阵,我们对图像的处理其实就是操作各种矩阵进行计算,而很多矩阵的运算其实可以做并行化,这使得图像处理可以做得很快,因此GPU在图形图像领域也有了大展拳脚的机会。下图表示的就是一个多GPU计算机硬件系统,可以看出,一个GPU内存就有很多个SP和各类内存,这些硬件都是GPU进行高效并行计算的基础。
![](https://img2018.cnblogs.com/blog/1093303/201809/1093303-20180919122932879-1946399786.png)
现在再从数据处理的角度来对比CPU和GPU的特点。CPU需要很强的通用性来处理各种不同的数据类型,比如整型、浮点数等,同时它又必须擅长处理逻辑判断所导致的大量分支跳转和中断处理,所以CPU其实就是一个能力很强的伙计,他能把很多事处理得妥妥当当,当然啦我们需要给他很多资源供他使用(各种硬件),这也导致了CPU不可能有太多核心(核心总数不超过16)。而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境,GPU有非常多核心(费米架构就有512核),虽然其核心的能力远没有CPU的核心强,但是胜在多,
在处理简单计算任务时呈现出“人多力量大”的优势,这就是并行计算的魅力。
整理一下两者特点就是:
* 1.CPU:擅长流程控制和逻辑处理,不规则数据结构,不可预测存储结构,单线程程序,分支密集型算法
* 2.GPU:擅长数据并行计算,规则数据结构,可预测存储模式
![](https://img2018.cnblogs.com/blog/1093303/201809/1093303-20180919122947035-1099878851.png)
# CUDA存储器类型:
每个线程拥有自己的 register寄存器 and loacal memory 局部内存
每个线程块拥有一块 shared memory 共享内存
所有线程都可以访问 global memory 全局内存
还有,可以被所有线程访问的
只读存�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备、移动设备等 操作系统:LInux、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备
资源推荐
资源详情
资源评论
收起资源包目录
学习汇编语言 LLVM编译器 数据结构 算法 操作系统 单片机 linux 面试.zip (1151个子文件)
bootasm.asm 5KB
CAN.bin 21KB
arduino_pro_mini.bmp 3.96MB
60.两有序序列合并精简版.bmp 3.01MB
lcd.c 83KB
lcd.c 83KB
lcd.c 83KB
arduino_motor_sensor_ros.c 60KB
arduino_Sensor_Motor_Serial_kubuki.c 36KB
adc.c 32KB
Motor_Sensor_ros_auto_protected.c 27KB
3-temper_uart_cmd.c 26KB
ymodem.c 26KB
9_wifi_location.c 25KB
arm_servo.c 22KB
pmm.c 22KB
Motor_Sensor_ros_protected.c 22KB
ymodem.c 21KB
common.c 17KB
common.c 17KB
6-ADC.c 17KB
main.c 16KB
CC1101.c 16KB
0 rw_uart自建应用程序 串口读数传感器数据并发布话题.c 16KB
timer.c 15KB
usmart.c 15KB
timer.c 15KB
timer.c 15KB
timer.c 15KB
timer.c 15KB
timer.c 14KB
timer.c 14KB
can.c 14KB
zhuji_menu.c 14KB
led.c 13KB
timer.c 13KB
can.c 13KB
timer.c 13KB
led.c 13KB
led.c 13KB
kdebug.c 13KB
arduino_Sensor_Motor_Serial.c 12KB
led.c 12KB
led.c 12KB
系统启动的第一个文件 stm32_start.c 12KB
main.c 12KB
trap.c 12KB
send.c 11KB
receive.c 11KB
can_demo.c 11KB
usmart_str.c 11KB
4-watch_dog.c 11KB
led.c 11KB
arduino_Sensor_Motor_ros.c 11KB
RC_Transmitter.c 11KB
main.c 11KB
control.c 10KB
control.c 10KB
control.c 10KB
control.c 10KB
main.c 10KB
main.c 10KB
temp_rec.c 10KB
yuying.c 10KB
spi_flash_demo.c 10KB
timer.c 10KB
timer.c 10KB
LCD12864.c 9KB
main.c 9KB
TA_PWM.c 9KB
main.c 9KB
main.c 9KB
control.c 8KB
arduino_sensor.c 8KB
can.c 8KB
can.c 8KB
can.c 8KB
main.c 8KB
can.c 8KB
main.c 8KB
delay.c 8KB
MPU_里程计.c 8KB
yuying_switch.c 7KB
congji_sensor_wifi_send.c 7KB
UART_FIFO.c 7KB
MENU.c 7KB
1_temperature_timer_sand.c 7KB
can.c 7KB
can.c 7KB
i2c_mpu6050.c 7KB
1.linear_list.c 7KB
can.c 7KB
can.c 7KB
can.c 7KB
init.c 7KB
main.c 7KB
circle.c 7KB
2.link_list_loop.c 7KB
control.c 7KB
2.link_list_loop_double.c 7KB
共 1151 条
- 1
- 2
- 3
- 4
- 5
- 6
- 12
资源评论
妄北y
- 粉丝: 2w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 一个十分容易使用的Go语言JSON库(解析JSON、生成JSON).zip
- 一个十分容易使用的C语言JSON库(解析JSON、生成JSON).zip
- 2024-软件工程大作业-波普特廉价酒店的温控计费系统小组大作业.zip[前端:vue、后端:Python]
- 一个全面的 Go 语言文件操作 package,API 参照 nodejs 中 fs-extra 的设计,简单易用.zip
- 一个使用易语言编写并用精易模块调用PHP-API上的内容返回的酷Q插件.zip
- 一个使用易语言制作的音乐播放器 FatmcCloudMusic3开源仓库.zip
- 一个会篡改MBR的病毒(基于易语言和c++).zip
- 网络节点切换工具V1(分主节点+两个分节点)
- Android的在线云音乐播放器项目源码+文档说明(高分项目)
- 基于java+spring+springMVCl的医疗系统开题报告.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功