前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大模型与AI底层技术揭秘(42)蜂巢里藏着的奥秘

大模型与AI底层技术揭秘(42)蜂巢里藏着的奥秘

作者头像
用户8289326
发布2024-07-12 17:25:00
810
发布2024-07-12 17:25:00
举报
文章被收录于专栏:帅云霓的技术小屋

在上期,我们讲到,在CUDA中,可以利用GPU的通用指令(加减乘除、乘方等),通过计算麦克劳林展开式,来计算超越函数。

当然,由于麦克劳林展开式是一个时间复杂度较高的算法,我们期望有较为快速的算法,以一定的精度妥协为代价,得到超越函数的计算值。

话分两头。小H出差跑了趟重庆,由于吃了本地特色的各类食品,回来以后,脸上开始长痘。为了平息暴乱,小H决定求助于中华文明的优秀传统,网购了两瓶蜂蜜。

很快,蜂蜜到货了,店家还在蜂蜜里面送了一小块蜂巢(证明自己的蜂蜜是真的)。小H第一次看见真正的蜂巢,放在办公桌上摆弄。小H发现,蜂巢从正面看,是由多个六边形构成的,但它的底却不是平的,而是由三个菱形拼成。

方老师路过小H座位,看见小H在观察蜂巢的底部,给小H讲了一个有趣的故事:

巴黎科学院的数学家马拉尔齐和小H一样,对蜂巢底部很感兴趣,并且从理论上进行了计算,得到的结论是,如果想消耗最少的材料,制成尽可能大的容积,菱形的两个角度应该是109°26′和70°34′。但实际测量的结果却有细微的偏差,是109°28′和70°32′。

苏格兰科学家麦克劳林(对,就是麦克劳林展开式的发现者,使用行列式解线性方程组的克莱姆法则也是他发现的)重新进行了计算,得出的结果与实际测量的值是完全一致的,也就是说,小蜜蜂构建的蜂巢,完全符合通过数学公式计算得出的最优解!

那么,为什么马拉尔齐的计算出现了偏差呢?经过仔细的验证和检查,大家发现,马拉尔齐计算arcsin(2)的时候,使用的三角函数表出现了错误。

三角函数表是一种列出不同角度下的三角函数值的表格,对于快速查找特定角度的三角函数值非常有用。

如图,有了三角函数表以后,通过方式就可以快速计算出误差在容许范围内的三角函数值。

类似地,反三角函数、双曲函数/反双曲函数、指数/对数函数均可以通过这样的方式进行快速计算。

在GPU中,也有类似的指令和执行单元。这个执行单元叫做SFU(Special Function Unit)。

倒数计算 rep: d = 1/a

平方根计算 sqrt:d=sqrt(a)

倒数平方根计算 rsqrt:d=1/sqrt(a)

正弦函数计算 sin: d=sin(a)

余弦函数计算 cos:d=cos(a)

以2为底的对数 lg2:d=log2(a)

以2为底的指数 ex2:d = 2**a

具备大学本科数学知识的读者也可以很容易地理解,对于其他底的对数函数和指数函数,我们能够通过换底公式来计算。而双曲函数本质上就是指数函数,因此,也可以通过ex2指令进行计算。

我们如何调用GPU的这些指令呢?

在CUDA中有两种方式。一种是,在编译的时候使用编译开关 -use_fast_math,编译器会将sqrt, rsqrt, sin, cos, lg2, ex2等函数编译为使用SFU的指令。另一种则是使用这些函数代替:

__expf(x) 代替 expf(x);

__logf(x) 代替 logf(x);

__sinf(x) 代替 sinf(x);

以此类推,在函数名前面加两个下划线,可以将原数学函数替换为允许在精度上妥协而提升计算性能的数学函数。这种方法适用于部分函数在此方面进行妥协的场景。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帅云霓的技术小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档