cuda编程day001

一、环境:

①、linux cuda-11.3 opecv4.8.0

不知道头文件和库文件路径,用命令查找:

bash 复制代码
# find /usr/local -name cuda.h 2>/dev/null   # 查询cuda头文件路径
/usr/local/cuda-11.3/targets/x86_64-linux/include/cuda.h
bash 复制代码
# find /usr/local -name libcudart.so 2>/dev/null  # 查询库文件路径
/usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudart.so
bash 复制代码
# pkg-config --cflags opencv4  # 查看opencv头文件
-I/usr/include/opencv4/opencv -I/usr/include/opencv4
bash 复制代码
# pkg-config --libs opencv4  查看opencv 库文件
-lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired 
-lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm 
-lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf 
-lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality 
-lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo 
-lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres 
-lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets 
-lopencv_text -lopencv_dnn -lopencv_plot -lopencv_ml -lopencv_videostab 
-lopencv_videoio -lopencv_viz -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d 
-lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core

添加到makefile文件里面:

bash 复制代码
# 这里定义头文件库文件和链接目标没有加-I -L -l,后面用foreach一次性增加
include_paths := /usr/local/cuda-11.3/targets/x86_64-linux/include /usr/include/opencv4 /usr/include/opencv4/opencv
library_paths := /usr/local/cuda-11.3/targets/x86_64-linux/lib
link_librarys := cudart opencv_core opencv_imgcodecs opencv_imgproc $(shell pkg-config --libs opencv4 | sed 's/-l//g')

因为OpenCV的库文件太多,使用shell函数将pkg-config命令的结果作为一个命令执行,并将其分割为单独的库名称,使用了sed命令来移除pkg-config命令返回的库名称中的横线-。这样,link_librarys中的库名称和pkg-config命令返回的库名称都将不带横线。这样就可以正确链接opencv4.8.0中的库了。

二、GPU的大致了解

原文:Bringing HPC Techniques to Deep Learning - Andrew Gibiansky

1、DataParallel模式(DP),Parameter Center模式,主从模式(主卡收集梯度,从卡发送参数和接受结果)

速度受限于主卡到从卡的带宽和速度。我们定义:

D = 模型参数总量,设为1GB

S = 单条线路的传输速率,设为1GB/s,也就是任何显卡传数据到GPU0,或者传输出去都是最大1GB/s

N = 显卡的个数,这里为5

则有:

①. 数据的传输量为4 x D x 2,我们经过了1次Scatter Reduce传输了4D数据量,经过了1次Allgather传输了4D数据量

②. 我们传输耗时理论为4 x 2 x D / S,得到结果约为8秒,公式为:Times = 2(N-1) * D / S

③. 我们传输的数据总量(显卡数相关):Data Transferred = 2(N-1) * D

2、DistributedDataParallel模式(DDP),Ring模式,环形模式

传输速度只与单个显卡的速度和带宽。我们定义:

D = 模型参数总量,设为1GB

S = 单条线路的传输速率,设为1GB/s,也就是任何显卡传数据到GPU0,或者传输出去都是最大1GB/s

N = 显卡的个数,这里为5

①、Scatter-Reduce(循环N-1次):

每个卡都传递其显卡索引对应的那份数据,给相邻的下一个显卡做累加,递所使用的线路是相邻显卡路径,不存在等待堆积,执行一次耗时: 1/N

②、Allgather(循环N-1次):

将每个卡中存在的完整数据发送给相邻下一个卡,执行一次耗时:1/N

则:

  1. 我们Scatter-Reduce时经过了N-1次1/N大小的数据传输,耗时认为是𝐷/𝑆 * 1/𝑁 * (𝑁−1)
  2. 我们Allgather时经过了N-1次1/𝑁大小的数据传输,耗时认为是𝐷/𝑆 * 1/𝑁 * (𝑁−1)
  3. 因此传输的耗时为:𝑇𝑖𝑚𝑒𝑠=2(𝑁−1) * 1/𝑁 * 𝐷/𝑆
  4. 传输的数据量为:𝐷𝑎𝑡𝑎𝑇𝑟𝑎𝑛𝑠𝑓𝑒𝑟𝑟𝑒𝑑=2(𝑁−1) * 𝐷 / 𝑁

可见:传输的数据量与显卡数量无关了 只与对应的显卡之间的数据传输速度有关

总结:

  1. DP模式下的主从模式,通信速度受限于单个显卡的通信速率。传递的数据量为2(𝑁−1)𝐷
    • N为显卡数,D为模型参数大小
  2. DDP模式下的RingAllReduce,通信速度受限于显卡邻居间通信速率
    • 于PCIE下,受限于主板的PCIE速度,而不是显卡的速度
    • 于NVLINK下则最高可达100GB/s甚至更高
    • 传递的数据量为2(𝑁−1)*𝐷/𝑁,与显卡数量无关,也因此其效率高
相关推荐
安思派Anspire8 分钟前
LangGraph + MCP + Ollama:构建强大代理 AI 的关键(一)
前端·深度学习·架构
退役小学生呀9 分钟前
十、K8s集群资源合理化分配
linux·云原生·容器·kubernetes·k8s
程序员陆通12 分钟前
独立开发A/B测试实用教程
人工智能·ai编程
knowfoot14 分钟前
硬核拆解!跟着公式“走”一遍,你也能彻底看懂神经网络
人工智能·神经网络
FF-Studio21 分钟前
大语言模型(LLM)课程学习(Curriculum Learning)、数据课程(data curriculum)指南:从原理到实践
人工智能·python·深度学习·神经网络·机器学习·语言模型·自然语言处理
DDDDDouble24 分钟前
<二>Sping-AI alibaba 入门-记忆聊天及持久化
java·人工智能
PyAIExplorer25 分钟前
图像处理中的插值方法:原理与实践
图像处理·人工智能
狗头大军之江苏分军35 分钟前
疑似华为盘古AI大模型翻车造假风波【实时记录篇】
人工智能·机器学习·程序员
Mr.Winter`36 分钟前
轨迹优化 | 基于激光雷达的欧氏距离场ESDF地图构建(附ROS C++仿真)
c++·人工智能·机器人·自动驾驶·ros·ros2·具身智能
Winner13001 小时前
Debian、Buildroot 和 Ubuntu 都是基于 Linux 的系统区别
linux·ubuntu·debian