AMDGPU.jl将ROCm库与Julia生态系统集成

与Julia生态系统集成

AMDGPU.jl将ROCm库与Julia生态系统集成在一起,提供统一的体验,使用AMDGPU.j、CPU或其他加速器支持的阵列几乎没有区别。

例如,rocBLAS用于常见的BLAS操作,Julia的算子为了提高效率而分派给他们。

julia> a = AMDGPU.rand(Float32, 1024, 1024);

julia> b = AMDGPU.rand(Float32, 1024, 1024);

julia> c = a * b; # 分派给rocBLAS进行矩阵乘法

Flux.jl或Lux.jl可用于进行支持常见构建块的机器学习:

julia> using AMDGPU, Flux;

julia> Flux.gpu_backend!("AMDGPU");

julia> model = Conv((3, 3), 3 => 7, relu; bias=false);

julia> x = AMDGPU.rand(Float32, (100, 100, 3, 50)); # WxHxCxB形状的随机图像。

julia> y = model(x); # 发送到MIOpen进行卷积

Zygote.jl可用于计算给定任何Julia函数的梯度:

julia> θ = AMDGPU.rand(Float32, 16, 16);

julia> x = AMDGPU.rand(Float32, 16, 16);

julia> loss, grads = Zygote.withgradient(θ) do θ

           sum(θ * x)

       end;

2.7.5性能

如果使用高效的构造,Julia GPU代码的性能与C++相当,有时甚至超过它,具体取决于工作负载。

使用AMDGPU.jl在Julia中实现,并在MI250x GPU上执行的memcopy,以及2D扩散内核的性能比较。

对于性能检查,可以使用分析来获得整个程序的时间线视图,如图2-11所示。

 

图2-11 HIP和AMDGPU网格点数目、内存时间线视图

还有@device_code_... (llvm, gcn, lowered)宏,以每个内核为基础转储不同的中间表示(未优化的llvm IR、优化的LLVMIR、汇编)。

下面是vadd的优化LLVM IR!上面定义的内核:

julia> @device_code_llvm @roc launch=false vadd!(c, a, b)

;  @ REPL[4]:1 within `vadd!`

define amdgpu_kernel void @_Z5vadd_14ROCDeviceArrayI7Float32Li1ELi1EES_IS0_Li1ELi1EES_IS0_Li1ELi1EE(

    { i64, i64, i64, i64, i64, i64, i32, i32, i64, i64, i64, i64 } %state,

    { [1 x i64], i8 addrspace(1)*, i64 } %0,

    { [1 x i64], i8 addrspace(1)*, i64 } %1,

    { [1 x i64], i8 addrspace(1)*, i64 } %2

) local_unnamed_addr #1 {

转换:

  %.fca.2.extract9 = extractvalue { [1 x i64], i8 addrspace(1)*, i64 } %0, 2

;  @ REPL[4]:2 within `vadd!`

  %3 = call i32 @llvm.amdgcn.workitem.id.x()

  %4 = add nuw nsw i32 %3, 1

  %5 = call i32 @llvm.amdgcn.workgroup.id.x()

  %6 = zext i32 %5 to i64

  %7 = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()

  %8 = getelementptr inbounds i8, i8 addrspace(4)* %7, i64 4

  %9 = bitcast i8 addrspace(4)* %8 to i16 addrspace(4)*

  %10 = load i16, i16 addrspace(4)* %9, align 4

  %11 = zext i16 %10 to i64

  %12 = mul nuw nsw i64 %11, %6

  %13 = zext i32 %4 to i64

  %14 = add nuw nsw i64 %12, %13

;  @ REPL[4]:3 within `vadd!`

  %.not = icmp sgt i64 %14, %.fca.2.extract9

  br i1 %.not, label %L92, label %L45

L45:                                              ; preds = %conversion

  %.fca.1.extract = extractvalue { [1 x i64], i8 addrspace(1)*, i64 } %2, 1

  %.fca.1.extract2 = extractvalue { [1 x i64], i8 addrspace(1)*, i64 } %1, 1

  %.fca.1.extract8 = extractvalue { [1 x i64], i8 addrspace(1)*, i64 } %0, 1

;  @ REPL[4]:4 within `vadd!`

  %15 = add nsw i64 %14, -1

  %16 = bitcast i8 addrspace(1)* %.fca.1.extract2 to float addrspace(1)*

  %17 = getelementptr inbounds float, float addrspace(1)* %16, i64 %15

  %18 = load float, float addrspace(1)* %17, align 4

  %19 = bitcast i8 addrspace(1)* %.fca.1.extract to float addrspace(1)*

  %20 = getelementptr inbounds float, float addrspace(1)* %19, i64 %15

  %21 = load float, float addrspace(1)* %20, align 4

 

  %22 = fadd float %18, %21

  %23 = bitcast i8 addrspace(1)* %.fca.1.extract8 to float addrspace(1)*

  %24 = getelementptr inbounds float, float addrspace(1)* %23, i64 %15

  store float %22, float addrspace(1)* %24, align 4

  br label %L92

 

L92:                                              ; preds = %L45, %conversion

;  @ REPL[4]:6 within `vadd!`

  ret void

}

用户可以很好地控制他们的代码,并可以针对高性能应用程序。

2.7.6应用程序和库

通过丰富的生态系统集成,实现应用程序非常容易,以下是其中一些支持AMD GPU的应用程序:

Nerf.jl:在原生Julia中即时实现NGP。

Whisper.jl:流行的语音转文本模型。

Diffusers.jl:稳定扩散。

GPU4GEO:使用LUMI超级计算机,针对LUMI-G的AMD MI250x GPU,对冰运动进行建模。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901199.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐几本书1《AI芯片开发核心技术详解》、2《智能汽车传感器:原理设计应用》、3《TVM编译器原理与实践》、4《LLVM编译器原理与实践》

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

ragflow-naive模式pdf解析 调试日志

测试用例1:test_emf 无图映射解析结果 boxes1: {x0: 70.0, x1: 308.6666666666667, top: 76.0, text: Test with three images in unusual formats, bottom: 90.0, page_number: 1, layout_type: } {x0: 70.66666666666667, x1: 152.33333333333334, top: 109.66666666666667, …

树形DP 树的重心

树形DP 树的重心 给定一颗树,树中包含 \(n\) 个结点(编号 \(1 \sim n\))和 \(n-1\) 条无向边。 请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。 重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个…

Bootstrap5入门

Bootstrap 5 入门教程 目录Bootstrap 简介 环境配置 布局与网格系统 常用组件 工具类与工具函数 定制化与主题 项目实战示例1. Bootstrap 简介什么是 Bootstrap?开源前端框架,用于快速构建响应式网页。 基于 HTML、CSS、JavaScript。Bootstrap 5 新特性移除 jQuery,依赖原生…

如何写自己的springboot starter?自动装配原理是什么?

如何写自己的springboot starter?自动装配原理是什么? 官方文档地址:https://docs.spring.io/spring-boot/docs/2.6.13/reference/html/features.html#features.developing-auto-configuration 1. 不用starter有什么弊端?我们开发需要引入maven依赖,如果我们需要的依赖又有…

清理 node.js 包管理工具 npm 的缓存

清理 node.js 包管理工具 npm 的缓存清理 node.js 包管理工具 npm 的缓存 要清理 Node.js 包管理工具 npm 的缓存,可以按照以下步骤操作。npm 的缓存主要用于存储下载的包,通常位于用户主目录下的 .npm 文件夹中。以下是清理方法: 1. 检查 npm 缓存位置 npm 默认将缓存存储在…

清理 Python 包管理工具 pip 的缓存

清理 Python 包管理工具 pip 的缓存清理 Python 包管理工具 pip 的缓存 要清理 pip 的缓存,可以按照以下步骤操作(适用于 Python 的包管理工具 pip):检查 pip 缓存位置 pip 默认会将下载的包缓存在本地。你可以通过以下命令查看缓存目录: pip cache dir常见的缓存路径:Wi…

清理 Python 的包管理工具 pip 的缓存

清理 Python 的包管理工具 pip 的缓存清理 Python 的包管理工具 pip 的缓存 要清理 pip 的缓存,可以按照以下步骤操作(适用于 Python 的包管理工具 pip):检查 pip 缓存位置 pip 默认会将下载的包缓存在本地。你可以通过以下命令查看缓存目录: pip cache dir常见的缓存路径…

微服务的网关配置

微服务的网关配置 1. 网关路由 1.1 网关 1.1.1 存在问题 单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,这就存在一些问题:每个微服务都需要编写身份校验、用户信息获取的接口,非常麻烦。 用户…

博客图床 VsCode + PigGo + 阿里云OSS方案

关键字 写博客,图床,VsCode,PigGo,阿里云OSS 背景环境 我想把我在本地写的markdown文档直接搬到CSDN上和博客园上,但是图片上传遇到了问题。我需要手动到不同平台上传文件,非常耗费时间和经历。 为了解决这个问题,我想到了图床方案,我只需要把图片链接放到我本地写好的…

20244203张晨曦 实验一《Python程序设计》实验报告

20244203张晨曦《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2442 姓名: 张晨曦 学号:20244203 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 专选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和…

Cobalt Strike基础

Cobalt Strike基础 Staged(有阶段) 在有阶段的执行方式中,分为Stager和Stage两个阶段Stager(初始执行载荷):​ 定义:Stager是Stage 1,是一个较小的、轻量级的初始执行载荷 ​ 作用:与服务端建立初始连接,并从服务器下载更大的Payload,也就是Stage2Stage(更大、…