C_and_CPP 板


LINE

论坛版:https://forum.community.tw/t/topic/68 新尝试的论坛,目前以电脑相关的主题为主,能自动将程式码上色,也可使用 Markdown 并且可以作为其他部落格的留言系统,欢迎大家来发表/参与讨论 如果有关於这篇的相关感想或问题,发在 PTT 或者该论坛上都可 HIP AMD 前几年开始推广 HIP,其中一个卖点就是 HIP 的程式码是可以跑在 A MD GPU (但非全部 GPU,例如 rx5700xt 因为架构不一样所以还不行) 跟 NVIDIA GPU。另 外 AMD 也有提供 HIPIFY 帮助你把 cuda 程式码转成 HIP 程式码。等等会介绍他大致上 有哪些差异。 HIP 和 CUDA 的差别 - 函式库 (library) : 例如 cusparse 会变成 hipsparse、cuda_runtime 变 成 hip_runtime 等,那相对应的呼叫函数也会相对应的改变,但大多都是 cuda -> hip 这样的转换 - warp/wavefront size 以及 launch bound 等一些可能会影响程式的实作。另外 HIP 并 没有直接支援 cooperative group ,必须直接使用 shuffle ,当然也可以另外实作相对 应的 cooperative group 来方便使用。 - 呼叫 gpu kernel 的差异,CUDA 是使用 <<<>>> , cuda_kerenl<<<grid, block, dynamic shared memory, stream>>>(args...) ,之中 stream 跟 dynamic shared memory 是可以省略的;HIP 则是使用 hipLaunchKernelGGL(hip_kernel, grid, block, dynamic shared memory, stream, args...) 那这边的 stream 跟 dynamic shared memory 就不能省略了。另外确保他 kernel 名称没有解析错误可以用上 HIP_KERNEL_NAME 如果在程式编写上有用的 warp 的观念的话,最大的差别是在 NVIDIA GPU 是用 32 但 是 AMD GPU 是用 64 ( AMD 称为 wavefront = CUDA warp),但如果原先在 CUDA 是使 用 blocksize = (32, 32) 这种,在 AMD 上也是只能用 blocksize = (32, 32) 并非 (64, 64) ,因为 blocksize 一样最多只能 1024。另外 AMD 的 shuffle 是利用 shared memory 去做,并不像 NVIDIA 是直接从 register 操作。但他们也有提供 AMD GCN Assembly: Cross-Lane Operations,就不会从 shared memory 处理。 另外一个差异点是在 __launch_bounds__ , CUDA 的 __launch_bounds__(max threads per block, min blocks per multipreocessor) , 但 HIP 是 __launch_bounds__(max threads per block, min warps per eu) 。如果只使用第一个参数的话那就是一致的, 但第二个参数就要修改,HIP 也有提供公式转换 min warps per eu = (min blocks per multiprocessor * max threads per block)/32 范例 // CUDA template <int value> __global__ void set_value(int num, int *__restrict__ array) { // set_value; } int main() { // ... set_value<4><<<grid, block>>>(num, array); // ... } // HIP template <int value> __global__ void set_value(int num, int *__restrict__ array) { // set_value; } int main() { // ... hipLaunchKernelGGL(HIP_KERNEL_NAME(set_value<4>), grid, block, 0, 0, num, array); // ... } 基本上 kernel 本身不太会需要变动,通常更动呼叫 kernel 的方式 hipify 常见错误 - namespace: 假如 kernel 有放在 namespace 的话,hipify 会给出错误的 结果,例如变成 namespace::hipLaunchKernelGGL(HIP_KERNEL_NAME(kernel), ...) 但 应该是要改成 hipLaunchKernelGGL(HIP_KERNEL_NAME(namespace::kernel), ...) 才对 - 有逗号 , 在 kernel 名称或是 syntax (grid, block 那些 <<<>>> 中的参数): hipify 类似将前面东西放完看有几个逗号,然後再补差项上去。所以当有逗号在里面时 他可能就会补错地方。 例如 kernel<<<calc(num, block), block>>>(...) 可能就会变 成 hipLaunchKernelGGL(kernel, calc(num, block), block, 0, ...) ,中间的 calc(num, block) 被当成两项了,应该要是 hipLaunchKernelGGL(kernel, calc(num, block), block, 0, 0, ...) 才对。 个人心得 (或趣事?) 我们在将 CUDA 转成 HIP 时,整体上没有遇到太多困难,大多东西都有对应,hipify 也 可以只用在单档上,但在整体使用上会相较 CUDA 本身比较麻烦的在於没有一致性、且有 一些变动是没有考虑到以前版本。例如在使用 CMake 时, find_pacakage 要找 HIP, hipblas, hipsparse 但在 hiprand 的时候还要额外找 rocrand ,而在 target_link_libraries 时是用 roc::hipblas, roc::hipsparse, hip::hiprand, roc::rocrand 等总总不能从上一个的经验推出下一个的时常发生 又或者 hip 4.1 版之前 HIP_PLATFORM(可拿来区别 amd/nvidia 的程式码) 是用 hcc 或 者 nvcc 来做编译期间的区别,但在 4.1 後,改成 amd 或 nvidia 来作区别,所以程式 本身要自己另外定义使之支援不同版。 但好消息是,AMD 有在跟 CMake 一起处理这些,希望之後再 CMake 上使用体验会再更顺 畅些。 另外一些是跟 CUDA 有关,有些函式在 CUDA 的说明文件是没有标明 const 的,但在使 用上你是可以丢 const 的参数进去,且那个函数本身的确是不会更动那个参数;但 HIP 为了符合该说明文件,使用上是要去掉 const 才能使用函数,即使两边都不会动到该参 数的值。 HIP 也算是有推一阵子,在 CUDA 10.2 之前是真的可以两边都跑;但 CUDA 更新到 11 时,这个就不成立了,因为 CUDA 11 把很多函式如 csr_spmv 等砍掉,改用 generic api 来操作,所以 10.2 的函数就不能直接在 cuda 11 用且 HIP 尚未有 generic api 的对应函式,因此目前是只有在 cuda 10.2 版以前才能直接用 HIP 跑在 NVIDIA GPU 上 。 对於 cross line operation 试起来的确比较快,但是写法上并不是直接从 shuffle 直 接对应,且他是用 compile time 的参数,可能一个加总原先是五个 shuffle 但改用 cross line operation 可能就要七到八个指令组合,且不能直接使用 for (因为要 compile time 的参数) 总结 HIP 整体上使用还算可以,且 CUDA (10.2 前) 的函式大多都已有相对应的,所以不用担 心移到 HIP 时要自己写一些函式库的东西,一些参数也相对好转换很多。且 HIP 本身是 开源,所以有兴趣的话也可以去看他们怎麽实作一些函式的,但缺点可能就是在编译上或 者一些说明文件并没有像 CUDA 那麽一致,需要一些时间去克服(我很多时候都是先去看 CUDA 的说明文件,然後再把函式名称改掉)。 第一次发比较长篇的文章,如果版面有乱掉请见谅 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 46.223.163.145 (德国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1629294227.A.D5E.html
1F:推 ManOfSteel: 推 08/19 02:01
2F:推 kyushu: 想请教转hip的原因? 08/19 08:21
3F:推 wtchen: 推 08/19 16:40
4F:→ mikemike1021: 主要让他能跑在 AMD 上面,让程式跑在不同厂上,我 08/19 17:40
5F:→ mikemike1021: 们还是有留 cuda 给 Nvidia。而且现在 AMD GPU 有加 08/19 17:40
6F:→ mikemike1021: 入这个战局,top 500 用的 GPU 不会只有 Nvidia 了 08/19 17:40
7F:推 loveme00835: 想问在维护的时候如何确保两边的逻辑一致? 直接用 ma 08/19 20:42
8F:→ loveme00835: cro 切换吗? 08/19 20:42
9F:→ mikemike1021: 可以分成两个来讲,第一我们有用 gtest 来做测试, 08/20 06:12
10F:→ mikemike1021: 第二是减少重复性,所以像 kernel 本身大多一样的, 08/20 06:13
11F:→ mikemike1021: 我们会把它写进一个档案,在要用时,使用 #include 08/20 06:14
12F:→ mikemike1021: 把他加进档案,并留参数在引入前调整来配合不同厂 08/20 06:15
13F:→ mikemike1021: 我也回覆在论坛文章下,加范例解释 #include 用法 08/20 06:17
14F:→ loveme00835: 谢谢 08/21 03:34
15F:推 wtchen: 即将入手AMD GPU,有空用看看,谢谢分享 08/22 20:34
16F:→ mikemike1021: 不太确定一般状况下好不好入手 HIP 支援的 AMD GPU 08/22 23:45
17F:→ mikemike1021: 可参考列表:https://reurl.cc/gWV9Gp 08/22 23:49
18F:→ mikemike1021: 之前 radeon VII 还买得到,现在应该不好找了 08/22 23:51
19F:→ mikemike1021: HIP 不像 NVCC 一样支援他旗下的所有卡,蛮可惜的点 08/22 23:52
20F:推 jun0325: OpenCL可以用在更多的device上(CPU, GPU, DSP等只要符 08/24 00:19
21F:→ jun0325: 合OpenCL规范),HIP看起来只能用在AMD/NV的GPU上,我这 08/24 00:19
22F:→ jun0325: 样理解对吗? 08/24 00:19
23F:→ mikemike1021: 嗯,我本身对於 OpenCL 不是很熟,不确定他是不是只 08/25 18:22
24F:→ mikemike1021: 有通用的部分,且 Nvidia 跟 AMD 好像是用不同版本 08/25 18:22
25F:→ mikemike1021: 的?另外目前也有 sycl,也是有支援很多平台(待确 08/25 18:22
26F:→ mikemike1021: ),而 intel dpcpp 也是基於 sycl 下去弄,关於 in 08/25 18:22
27F:→ mikemike1021: tel dpcpp 之後可能会再写一篇(非近期),它比 hip 08/25 18:22
28F:→ mikemike1021: 麻烦许多XD 08/25 18:22
29F:→ mikemike1021: 另外也有 hip-sycl 只是要确认一下方向性,不确定是 08/25 18:23
30F:→ mikemike1021: hip 在 sycl 上跑还是反过来 08/25 18:23
31F:→ diabolica: 推 09/07 23:31







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP