AI并行计算:CUDA和ROCm
1 介绍
1.1 CUDA
CUDA(Compute Unified Device Architecture)是Nvidia于2006年推出的一套通用并行计算架构,旨在解决在GPU上的并行计算问题。其易用性和便捷性能够方便开发者方便的进行GPU编程,充分利用GPU的并行能力,可以大幅提高程序的性能。目前CUDA已成为GPU加速计算的事实标准。

自从CUDA诞生以来,CUDA生态系统也迅速的发展,包括了大量的软件开发工具、服务和解决方案。CUDA Toolkit包括了库、调试和优化工具、编译器和运行时库。
CUDA特点:
-
专有性:CUDA仅适用于NVIDIA的GPU。
-
成熟度:CUDA拥有广泛的应用案例,被广泛应用于学术研究和工业界。
-
生态系统:CUDA有一个成熟且广泛的生态系统,包括深度学习框架(如TensorFlow和PyTorch)、科学计算库和多种工具。
1.2 ROCm
AMD ROCm是Radeon Open Compute (platform)的缩写,是2015年AMD公司为了对标CUDA生态而开发的一套用于HPC和超大规模GPU计算提供的开源软件开发平台,ROCm只支持Linux平台。

同样ROCm包含一些列的开发工具、软件框架、库、编译工具、编程模型等。
ROCm特点:
-
开放性:作为一个开源项目,ROCm旨在提供一个跨供应商的GPU计算解决方案。
-
兼容性:主要支持AMD的GPU,但也在向其他厂商的硬件开放。
-
生态系统:虽然相对较新,但正在迅速发展,支持包括TensorFlow和PyTorch在内的多个深度学习框架。
2 CUDA和ROCm对比
2.1 编程模型和API
| NVIDIA | AMD | 功能描述 |
| CUDA | HIP | 为C/C++开发GPU加速程序提供全面的环境,API、Runtime、编译器、调试工具等。 |
| OpenCL | OpenCL | 面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码, |
| OpenACC | 并行计算指令,研究人员和技术程序员最常用的GPU并行编程模型。 | |
| OpenMP | OpenMP是一套编译器指令、库例程和环境变量的规范,可用于指定Fortran和C/C++程序中的高级并行性。 |
2.2 编译及工具链
| NVIDIA | AMD | 功能描述 |
| NVCC | ROCmCC / HCC | 编译器 |
| CUDA-GDB | ROCgdb | debug工具 |
| HIPify | 将CUDA原生代码转换为HIP原生c++代码 | |
| Nvidia Nsight | ROCm Profiling Tools | 性能分析工具 |
| nvidia-smi | rocm-msi | 系统管理界面和命令行界面的工具 |
2.3 GPU加速库
CUDA和ROCm的基础框架提供众多的支持库,包括基础数学库、AI支持库、通信库、并行库等一些列,下面将列出来做个对照:
-
数学库
| NVIDIA | AMD | 功能描述 |
| cuBLAS | rocBLAS | 基本线性代数库(basic linear algebra,BLAS) |
| cuFFT | rocFFT | 快速傅里叶变换库(Fast Fourier Transforms) |
| CUDA Math Library | 标准数学函数库 | |
| cuRAND | 随机数生成(random number generation,RNG) | |
| cuSOLVER | rocSOLVER | 密集和稀疏直接求解器 |
| cuSPARSE | rocSPARSE / rocALUTION | 稀疏矩阵BLAS |
| cuTENSOR | rocWMMA | 张量线性代数库 |
| AmgX | 用于模拟和隐式非结构化方法线性解算器 |
-
并行算法库
| NVIDIA | AMD | 功能描述 |
| Thrust | Parallel STL / rocThrust | C++并行算法和数据结构库 |
-
图像和视频库
| NVIDIA | AMD | 功能描述 |
| nvJPEG | 用于JPEG解码的高性能GPU加速库 | |
| Nvidia Performance Primitive | 提供GPU加速的图像、视频和信号处理功能 | |
| Nvidia Video Codec SDK | 硬件加速视频编码和解码的一整套API、示例和文档网址:yii666.com< |
-
通信库
| NVIDIA | AMD | 功能描述 |
| NVSHMEM | OpenSHMEM标准的GPU内存,具有扩展以提高GPU性能。 | |
| NCCL | RCCL | 多GPU、多节点通信 |
-
深度学习/人工智能库
| Nvidia | AMD |
|
|
2.4 开发工具
| Nvidia | AMD |
|
|
3 总结
CUDA和ROCm对比总结如下:
-
硬件支持: CUDA专注于NVIDIA的GPU,而ROCm更注重提供跨平台的支持,尽管目前主要针对AMD的GPU。
-
开放性: ROCm作为一个开源项目,更加开放和灵活,而CUDA是NVIDIA的专有技术。
-
生态系统和成熟度: CUDA拥有更成熟的生态系统和更广泛的应用案例。相比之下,ROCm还在发展中,但正在迅速成长。
-
性能: 性能方面,CUDA和ROCm都能提供优秀的计算能力,但具体表现会根据应用场景和硬件配置而有所不同。
CUDA和ROCm都是用于高性能计算的平台,特别是在GPU加速的情况下。它们提供了工具和库,使得开发者能够有效地利用GPU来加速计算密集型任务,选择CUDA还是ROCm主要取决于业务的特定需求、所使用的硬件以及对开放性的偏好。CUDA在高性能计算领域更加成熟和普遍,但如果你使用AMD的硬件或者更倾向于使用开源技术,ROCm是一个不断增长的选择。
相关文章:
AI并行计算:CUDA和ROCm
1 介绍 1.1 CUDA CUDA(Compute Unified Device Architecture)是Nvidia于2006年推出的一套通用并行计算架构,旨在解决在GPU上的并行计算问题。其易用性和便捷性能够方便开发者方便的进行GPU编程,充分利用GPU的并行能力࿰…...
2023五岳杯量子计算挑战赛数学建模思路+代码+模型+论文
目录 计算力网络(CPN)是一种新型的信息基础设施,完整论文代码见文末 问题描述 2.1 问题1 2.2 问题2 2.3 问题3 问题1的解答过程: 问题3的解答过程: 决策优化应用场景:人工智能模型超参数调优 背景信…...
生信数据分析高效Python代码
1. Pandas glob获取指定目录下的文件列表 import pandas as pd import globdata_dir "/public/data/" # 获取文件后缀为.txt的文件列表 df_all pd.concat([pd.read_csv(f, sep\t) for f in glob.glob(data_dir *.txt)]) print(df_all)2. 使用 enumerate 函数获取…...
Spring Kafka常用配置详解
目录 前言producer配置consumer 配置listener 配置 前言 在 Spring Kafka 中,主要的配置分为三大块,分别是producer、consumer、listener,下面我们就按模块介绍各个模块的常用配置 producer配置 在 Spring Kafka 中,spring.kaf…...
跨域的多种方案详解
浏览器的同源策略是为了保护用户的安全,限制了跨域请求。同源策略要求请求的域名、协议和端口必须完全一致,只要有一个不同就会被认为是跨域请求。 本文列举了一些处理跨域请求的解决方案: JSONPCORS跨域资源共享http proxynginx反向代理web…...
Java / Scala - Trie 树简介与应用实现
目录 一.引言 二.Tire 树简介 1.树 Tree 2.二叉搜索树 Binary Search Tree 3.字典树 Trie Tree 3.1 基本概念 3.2 额外信息 3.3 结点实现 3.4 查找与存储 三.Trie 树应用 1.应用场景 2.Java / Scala 实现 2.1 Pom 依赖 2.2 关键词匹配 四.总结 一.引言 Trie 树…...
JS/jQuery 获取 HTTPRequest 请求标头?
场景:在jquery封装的ajax请求中,默认是异步请求。 需要定一个秘钥进行解密,所以只能存放在请求头中。然后需要值的时候去请求头中读取。 注意:dataType设置,根据请求参数的格式设置,如果是加密字符串&…...
Leetcode—2034.股票价格波动【中等】
2023每日刷题(五十二) Leetcode—2034.股票价格波动 算法思想 实现代码 class StockPrice { public:int last 0;multiset<int> total;unordered_map<int, int> m;StockPrice() {}void update(int timestamp, int price) {if(m.count(time…...
【Linux】diff命令使用
diff命令 是一个用于比较两个文件或目录之间差异的命令。它可以显示两个文件之间的行级别差异,并以易于阅读的格式输出结果。 著者 由保罗艾格特、迈克海特尔、大卫海耶斯、理查德史泰尔曼和Len Tower撰写。 diff命令 -Linux手册页 语法 diff [选项] [文件1]…...
讯飞星火认知大模型与软件测试结合,提升软件质量与效率
随着人工智能技术的不断发展,越来越多的企业开始将其应用于软件开发过程中。其中,讯飞星火认知大模型作为一种基于深度学习的自然语言处理技术,已经在语音识别、机器翻译、智能问答等领域取得了显著的成果。而在软件测试领域,讯飞…...
【Flink on k8s】- 4 - 在 Kubernetes 上运行容器
目录 1、准备 k8s 集群环境、Docker 环境 2、启用 kubernetes 2.1 查询 k8s 集群基本状态...
软件重装或系统重装后避免重复踩坑
1. Office软件的坑在于字体又没了 Word字体库默认没有仿宋_GB2312和楷体仿宋_GB2312,需要手动添加。 提供如下两个下载链接,亲测有效: 仿宋_GB2312 楷体_GB2312 安装步骤:解压-复制.ttf文件至C:\Windows\Fonts 持续更新贴~...
【Jmeter】JSON Extractor变量包含转义字符,使用Beanshell脚本来消除
如果使用Jmeter的JSON Extractor提取的变量包含特殊字符,直接引用时会包含转义字符。可以使用Beanshell脚本来进行字符串转换,从而消除这些转义字符。 import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONArray; import com.ali…...
GO设计模式——5、建造者模式(创建型)
目录 建造者模式(Builder Pattern) 建造者模式的核心角色 优缺点 使用场景 注意事项 代码实现 建造者模式(Builder Pattern) 建造者模式(Builder Pattern)是将一个复杂对象的构建与它的表示分离&…...
《LeetCode力扣练习》代码随想录——字符串(反转字符串II---Java)
《LeetCode力扣练习》代码随想录——字符串(反转字符串II—Java) 刷题思路来源于 代码随想录 541. 反转字符串 II 模拟过程 class Solution {public String reverseStr(String s, int k) {if(s.length()1){return s;}char[] chs.toCharArray();for(int i…...
WMMSE方法的使用笔记
标题很帅 原论文的描述WMMSE的简单应用 无线蜂窝通信系统的预编码设计问题中,经常提到用WMMSE方法设计多用户和速率最大化的预编码,其中最为关键的一步是将原和速率最大化问题转化为均方误差最小化问题,从而将问题由非凸变为关于三个新变量的…...
MySQL核心知识点整理大全1-笔记
目录 MySQL 一、MySQL的基本概念 1.数据库 2.表 3.列 4.行 5.主键 6.索引 二、MySQL的安装与配置 1.下载MySQL安装包 2.安装MySQL 3.启动MySQL 4.配置MySQL a.设置监听端口和IP地址 b.设置数据存储路径 c.设置字符集和排序规则 5.测试MySQL 三、MySQL的基本操…...
理解输出电压纹波和噪声:来源与抑制
医疗设备、测试测量仪器等很多应用对电源的纹波和噪声极其敏感。理解输出电压纹波和噪声的产生机制以及测量技术是优化改进电路性能的基础。 1:输出电压纹波 以Buck电路为例,由于寄生参数的影响,实际Buck电路的输出电压并非是稳定干净的直流…...
uni-app 微信小程序之好看的ui登录页面(二)
文章目录 1. 页面效果2. 页面样式代码 更多登录ui页面 uni-app 微信小程序之好看的ui登录页面(一) uni-app 微信小程序之好看的ui登录页面(二) uni-app 微信小程序之好看的ui登录页面(三) uni-app 微信小程…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
