1.新鲜资讯|AMD FidelityFX™ SDK 1.0现已上线GPUOpen
2.AMD 编译概述 & Fatbin 文件生成 & HIP Runtime API(启动 CUDA 核函数)
3.Golang源码剖析panic与recover,码链看不懂你打我好了
新鲜资讯|AMD FidelityFX™ SDK 1.0现已上线GPUOpen
欢迎使用AMD FidelityFX软件开发工具包(SDK)!码链 AMD FidelityFX SDK是码链一个易于集成的解决方案,可将AMD FidelityFX技术应用于游戏中,码链无需复杂移植过程。码链它是码链易语言订单系统源码我们提供给开发者的新图形中间件。 自从发布AMD FidelityFX技术以来,码链我们已成为业界领先的码链技术合作伙伴之一,覆盖了多款知名游戏。码链随着技术发展和广泛应用,码链我们致力于简化开发者集成体验。码链AMD FidelityFX SDK为此成果。码链 这个SDK特点如下: 标准、码链风格一致,码链友好易用。码链 简便生成应用,专注于核心算法。 稳定框架适用于各种API,支持多平台。 丰富文档可参考: gpuopen.com/manuals/fid... 预构建解决方案简化集成,集成仅需二十行代码。 新增三种效果: AMD FidelityFX 模糊 1.0:基于计算的高斯模糊技术。 AMD FidelityFX 景深1.0:重现相机镜头效果。 AMD FidelityFX 镜头特效1.0:支持多种镜头和胶片效果。 现有技术更新并纳入SDK: AMD FidelityFX CACAO 1.3:高度优化环境光遮蔽效果,引入对比纯AO和最终渲染结果功能。 AMD FidelityFX CAS 1.1:低开销自适应锐化算法,新增选择上采样功能。 FSR 1.1和FSR 2.2.1:图像放大解决方案,合并为一个示例。日历php源码 AMD FidelityFX LPM 1.3:HDR映射解决方案,Vulkan支持,修复操作系统和交换链问题。 AMD FidelityFX 并行排序1.2:优化的基数排序实现。 AMD FidelityFX SPD 2.1:优化的单pass下采样器。 AMD FidelityFX SSSR 1.4和AMD FidelityFX 降噪器 1.2:反射和阴影质量优化。 AMD FidelityFX 可变着色1.1:可变速率着色集成。 示例集成代码已更新,包含混合光线追踪、反射、阴影等。 使用SDK步骤: 创建或链接SDK库到解决方案。 查询内存需求。 分配内存并初始化。 创建功能上下文。 运行时使用上下文。 释放内存。 完整源代码和二进制文件在GitHub上发布,查看丰富文档,访问GPUOpen上的新主页获取更多信息。如需反馈或建议,请联系我们,所有请求都非常重要且会回复。请注意AMD FSR技术的使用限制和归属声明。AMD 编译概述 & Fatbin 文件生成 & HIP Runtime API(启动 CUDA 核函数)
AMD 平台的术语概览
AMD GPU 计算生态基于 ROCm(Radeon Open Computing platform),ROCm 包括ROC 和 Radeon 等简称,ROC:Radeon 开放计算平台,Radeon 是 AMD GPU 产品的品牌名。ROCm 类似于 CUDA 于 NVIDIA GPU。源码智造ROCx 包含 ROCr - ROC Runtime,ROCk - ROC kernel driver, ROCt - ROC Thunk。
HIP(Heterogeneous-Computing Interface for Portability)是一个旨在简化 CUDA 应用程序到便携式 C++ 代码转换的接口,支持 C 风格的 API 和 C++ 内核语言。
HIP-Clang 是 AMDGPU 异构编译器,用于在 AMD 平台上编译 HIP 程序。
HCC(Heterogeneous Compute Compiler)是面向异构设备的开源 C++ 编译器,基于 LLVM + CLANG,实现将并行编程程序转换为 AMD GCN ISA。
在 ROCM v3.5 版本前,HCC 编译器被使用,之后引入了 HIP-Clang 编译器,HCC 编译器不再发展新特性,AMD 公司不再维护。
“HIP化”工具,即 HIPify,能将 CUDA 代码转换为便携式 C++ 代码,自动执行大部分转换工作。
ROCm 计算平台的编译流程包括使用 HIPify 工具转换 CUDA 源码到 HIP 源码,HIP 源码能够在 AMD 或 NVIDIA GPU 上运行。
在 AMD ROCm 平台上,HIP 提供 HIP 运行时 API,实现与应用程序链接的对象库,包括流、事件和内存管理。在 NVIDIA CUDA 平台上,提供头文件,从 HIP 运行时 API 转换为 CUDA 运行时 API,提供内联函数以实现低开销。禾鲜源码
在 AMD ROCm 平台生成 Fat Binary 文件,使用 clang-offload-bundler 工具,将针对不同架构的多个 ELF 二进制文件合并成单个捆绑文件。
clang-offload-bundler 工具在编译过程中对翻译单元进行多次编译,生成主机和设备代码对象,然后合并这些代码对象到单个捆绑文件中。
HIP Runtime API 支持 CUDA <<<>>> 核函数语法,通过 hip-clang 编译选项选择 -fhip-new-launch-api,遇到 <<<>>> 时,调用一系列 API 来存储和处理核运行参数,最终通过 hipLaunchKernel API 运行核函数。
在编译过程中,使用 hip-clang 时,会调用 API 来存储核运行参数,然后通过桩函数调用,再通过 hipLaunchKernel API 实现核函数的运行。
API 包括用于初始化和注册函数的 API,如 __hipRegisterFatBinary 和 __hipRegisterFunction,保证 fatbin 文件只加载一次。
Golang源码剖析panic与recover,看不懂你打我好了
哈喽,大家好,我是asong,今天与大家来聊一聊go语言中的"throw、try.....catch{ }"。如果你之前是一名java程序员,我相信你一定吐槽过go语言错误处理方式,但是这篇文章不是来讨论好坏的,我们本文的源码编程案例重点是带着大家看一看panic与recover是如何实现的。上一文我们讲解了defer是如何实现的,但是没有讲解与defer紧密相连的recover,想搞懂panic与recover的实现也没那么简单,就放到这一篇来讲解了。废话不多说,直接开整。
Go 语言中panic 关键字主要用于主动抛出异常,类似 java 等语言中的 throw 关键字。panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码,并在当前 Goroutine 中递归执行调用方的 defer;
Go 语言中recover 关键字主要用于捕获异常,让程序回到正常状态,类似 java 等语言中的 try ... catch 。recover 可以中止 panic 造成的程序崩溃。它是一个只能在 defer 中发挥作用的函数,在其他作用域中调用不会发挥作用;
recover只能在defer中使用这个在标准库的注释中已经写明白了,我们可以看一下:
这里有一个要注意的点就是recover必须要要在defer函数中使用,否则无法阻止panic。最好的验证方法是先写两个例子:
运行我们会发现example2()方法的panic是没有被recover住的,导致整个程序直接crash了。这里大家肯定会有疑问,为什么直接写recover()就不能阻止panic了呢。我们在 详解defer实现机制(附上三道面试题,我不信你们都能做对)讲解了defer实现原理,一个重要的知识点**defer将语句放入到栈中时,也会将相关的值拷贝同时入栈。**所以defer recover()这种写法在放入defer栈中时就已经被执行过了,panic是发生在之后,所以根本无法阻止住panic。
通过运行结果可以看出panic不会影响defer函数的使用,所以他是安全的。
这里我开了两个协程,一个协程会发生panic,导致程序崩溃,但是只会执行自己所在Goroutine的延迟函数,所以正好验证了多个 Goroutine 之间没有太多的关联,一个 Goroutine 在 panic 时也不应该执行其他 Goroutine 的延迟函数。
其实我们在实际项目开发中,经常会遇到panic问题, Go 的 runtime 代码中很多地方都调用了 panic 函数,对于不了解 Go 底层实现的新人来说,这无疑是挖了一堆深坑。我们在实际生产环境中总会出现panic,但是我们的程序仍能正常运行,这是因为我们的框架已经做了recover,他已经为我们兜住底,比如gin,我们看一看他是怎么做的。
我们先来写个简单的代码,看看他的汇编调用:执行go tool compile -N -l -S main.go就可以看到对应的汇编码了,我们截取部分片段分析:
上面重点部分就是画红线的三处,第一步调用runtime.deferprocStack创建defer对象,这一步大家可能会有疑惑,我上一文忘记讲个这个了,这里先简单概括一下,defer总共有三种模型,编译一个函数里只会有一种defer模式。在讲defer实现机制时,我们一起看过defer的结构,其中有一个字段就是_panic,是触发defer的作用,我们来看看的panic的结构:
简单介绍一下上面的字段:
上面的pc、sp、goexit我们单独讲一下,runtime包中有一个Goexit方法,Goext能够终止调用它的goroutine,其他的goroutine是不受影响的,goexit也会在终止goroutine之前运行所有延迟调用函数,Goexit不是一个panic,所以这些延迟函数中的任何recover调用都将返回nil。如果我们在主函数中调用了Goexit会终止该goroutine但不会返回func main。由于func main没有返回,因此程序将继续执行其他gorountine,直到所有其他goroutine退出,程序才会crash。
下面就开始我们的重点吧~。
在讲defer实现机制时,我们一起看过defer的结构,其中有一个字段就是_panic,是触发defer的作用,我们来看看的panic的结构:简单介绍一下上面的字段:上面的pc、sp、goexit我们单独讲一下,runtime包中有一个Goexit方法,Goext能够终止调用它的goroutine,其他的goroutine是不受影响的,goexit也会在终止goroutine之前运行所有延迟调用函数,Goexit不是一个panic,所以这些延迟函数中的任何recover调用都将返回nil。如果我们在主函数中调用了Goexit会终止该goroutine但不会返回func main。由于func main没有返回,因此程序将继续执行其他gorountine,直到所有其他goroutine退出,程序才会crash。写个简单的例子:运行上面的例子你就会发现,即使在主goroutine中调用了runtime.Goexit,其他goroutine是没有任何影响的。所以结构中的pc、sp、goexit三个字段都是为了修复runtime.Goexit,这三个字段就是为了保证该函数的一定会生效,因为如果在defer中发生panic,那么goexit函数就会被取消,所以才有了这三个字段做保护。看这个例子:
英语好的可以看一看这个: github.com/golang/go/is...,这就是上面的一个例子,这里就不过多解释了,了解就好。
接下来我们再来看一看gopanic方法。
gopanic的代码有点长,我们一点一点来分析:
根据不同的类型判断当前发生panic错误,这里没什么多说的,接着往下看。
上面的代码都是截段,这些部分都是为了判断当前defer是否可以使用开发编码模式,具体怎么操作的就不展开了。
在第三部分进行defer内联优化选择时会执行调用延迟函数(reflectcall就是这个作用),也就是会调用runtime.gorecover把recoverd = true,具体这个函数的操作留在下面讲,因为runtime.gorecover函数并不包含恢复程序的逻辑,程序的恢复是在gopanic中执行的。先看一下代码:
这段代码有点长,主要就是分为两部分:
第一部分主要是这个判断if gp._panic != nil && gp._panic.goexit && gp._panic.aborted { ... },正常recover是会绕过Goexit的,所以为了解决这个,添加了这个判断,这样就可以保证Goexit也会被recover住,这里是通过从runtime._panic中取出了程序计数器pc和栈指针sp并且调用runtime.recovery函数触发goroutine的调度,调度之前会准备好 sp、pc 以及函数的返回值。
第二部分主要是做panic的recover,这也与上面的流程基本差不多,他是从runtime._defer中取出了程序计数器pc和栈指针sp并调用recovery函数触发Goroutine,跳转到recovery函数是通过runtime.call进行的,我们看一下其源码(src/runtime/asm_amd.s 行):
因为go语言中的runtime环境是有自己的堆栈和goroutine,recovery函数也是在runtime环境执行的,所以要调度到m->g0来执行recovery函数,我们在看一下recovery函数:
在recovery 函数中,利用 g 中的两个状态码回溯栈指针 sp 并恢复程序计数器 pc 到调度器中,并调用 gogo 重新调度 g , goroutine 继续执行,recovery在调度过程中会将函数的返回值设置为1。这个有什么作用呢? 在deferproc函数中找到了答案:
当延迟函数中recover了一个panic时,就会返回1,当 runtime.deferproc 函数的返回值是 1 时,编译器生成的代码会直接跳转到调用方函数返回之前并执行 runtime.deferreturn,跳转到runtime.deferturn函数之后,程序就已经从panic恢复了正常的逻辑。
在这里runtime.fatalpanic实现了无法被恢复的程序崩溃,它在中止程序之前会通过 runtime.printpanics 打印出全部的 panic 消息以及调用时传入的参数。
这就是这个逻辑流程,累死我了。。。。
结尾给大家发一个小福利,哈哈,这个福利就是如果避免出现panic,要注意这些:这几个是比较典型的,还有很多会发生panic的地方,交给你们自行学习吧~。
好啦,这篇文章就到这里啦,素质三连(分享、点赞、在看)都是笔者持续创作更多优质内容的动力!
2024-11-29 20:571600人浏览
2024-11-29 20:552169人浏览
2024-11-29 20:34707人浏览
2024-11-29 20:14694人浏览
2024-11-29 20:101517人浏览
2024-11-29 19:51916人浏览
1.los是什么系统。2.CyanogenMod系统los是什么系统。 los就是LineageOS。 年月日,Cyanogen公司突然宣布关闭Cyanogenmod的服务器,宣告持续6年的开
1.如何解决手机能安装多个易安卓编译出来的程序?如何解决手机能安装多个易安卓编译出来的程序? 1。方舟编译器 首先,让我们简单地谈谈方舟编译器的功能。 编译器:应用程序制造商编写的应用程序
1.做一个小程序多少钱2.做凡科网代理靠不靠谱?我认为,因人而异。做一个小程序多少钱 目前市场上小程序制作主要有三种方式,如下: 1、小程序模板套用 2、第三方平台拖拽制作 3、小程序