多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Pony 语言 GUPS 基准实战:用 gups_basic 测量随机访问内存性能

Pony 语言 GUPS 基准实战:用 gups_basic 测量随机访问内存性能 编程语言编译器语言运行时【免费下载链接】ponycPony is an open-source, actor-model, capabilities-secure, high performance programming language项目地址https://gitcode.com/gh_mirrors/po/ponyc点击查看免费下载gups_basic是 Pony 开源仓库ponyc中一个以 GUPSGiga Updates Per Second每秒十亿次更新为度量指标的随机访问内存性能基准程序。它通过多个Streamer流生成器与Updater更新器actor 协作对一块大数组执行随机 XOR 更新从而反映内存随机访问的吞吐能力。读完本文你将掌握该基准的编译与运行方法、全部 CLI 参数含义并通过源码剖析理解其 actor 协作、随机数生成与完成检测机制进而用它验证 Pony 并发模型在随机访问场景下的表现。GUPS 是什么为什么用随机更新衡量内存GUPS 是 HPC 领域衡量随机访问内存Random Access性能的经典指标核心思想是对一个大到无法放入缓存的数据表执行随机地址的更新操作单位时间内完成的更新次数即为 GUPS。由于访存地址是随机的缓存几乎失效性能主要受制于内存子系统与调度开销——这正是 GUPS 能反映真实随机访问能力的原因。本仓库中的 gups_basic 程序 用 Pony 的 actor 模型实现了这一度量一批Streameractor 产生随机数据按哈希结果分发到多个Updateractor每个Updater维护自己的一段数据表并对命中的条目执行xor更新全部更新完成后主 actor 以纳秒级计时计算并打印耗时与 GUPS 数值。如何编译按照 gups_basic 的 README只需一个最小化的 Pony 安装进入该 README 所在目录即examples/benchmarks/gups_basic/直接运行ponyc即可$ ponyc编译期间会先构建依赖包随后进入代码生成阶段正常结束时输出如下... Generating Reachability Selector painting Data prototypes Data types Function prototypes Functions Descriptors Optimising Writing ./gups_basic.o Linking ./gups_basic以上各阶段是ponyc编译管线的标准流程先做可达性分析Reachability与选择器绘制Selector painting再生成数据/函数原型与描述符随后优化Optimising最后写出目标文件并链接成可执行文件gups_basic。关于ponyc编译流程与平台搭建细节可参考仓库根目录的 BUILD.md 与 INSTALL.md。如何运行与 CLI 参数编译成功后在同一目录执行$ ./gups_basic Time: 0.594845 GUPS: 0.0688583第一行Time为本次运行的耗时秒第二行GUPS为该次运行的每秒更新数。运行参数均可通过命令行配置具体可用./gups_basic --help查看该选项由源码中的add_help()注册。从 main.pony 中的 Config 定义 可以看到全部参数及其默认值参数说明默认值--table总表大小的 log2 值即以 2 为底的对数20--iterate迭代次数10000--chunk每次迭代的块大小chunk size1024--streamersStreamer actor 数量4--updatersUpdater actor 数量8这些参数直接决定了基准的规模与形态源码见 main.pony--table表总大小为1 logtable默认2^20个U64条目。该表按 updater 数量均分每个Updater管理size (1 c.logtable) / _updater_count的一段main.pony。--iterate与--chunk控制总更新量源码中_updates c.chunk * c.iterate * _streamer_countmain.pony即总更新次数 块大小 × 迭代次数 × streamer 数量。最终GUPS _updates.f64() / elapsed其中elapsed是纳秒计时main.pony。--streamers/--updaters控制并发规模直接影响 actor 调度与消息分发开销。实际测量时建议把表调大例如--table 26以避免数据全部落入缓存并结合机器核数调整--streamers/--updaters观察扩展性。源码剖析actor 协作与完成检测gups_basic的实现位于 main.pony由四个核心部件组成。Main计时与汇总Mainactor 启动时记录起始时间戳_start Time.nanos()main.pony解析配置后按 updater 数量创建等量的Updateractor再创建_streamer_count个Streamer并派发迭代任务main.pony。全部Streamer结束后Main通过streamer_done行为通知各Updater收尾全部Updater结束后updater_done计算耗时与 GUPS 并打印main.pony。Streamer随机数据分发每个Streamer持有全部Updater的引用数组并用PolyRand生成随机数。生成一个数据后通过((datum shift) and mask)计算其归属的 updater 下标——shift由表段大小推导mask由 updater 数量推导main.pony。随后按目标分组打包把非空的数据块作为消息发送给对应的Updatermain.pony。apply采用尾递归方式递减迭代次数既避免阻塞调度器也便于 runtime 在消息间隙执行垃圾回收。Updater局部表段上的 XOR 更新每个Updater拥有自己的一段Array[U64]初始化时填入i offset形式的序号值main.pony。收到数据块后对每个 datum 计算表内下标(datum and (table.size() - 1).u64()).usize()并执行table(i) table(i) xor datummain.pony。这种“写后回写”的模式正是 GUPS 基准的核心操作。PolyRand多项式随机数生成器为了在多个 streamer 间产生可复现、互不重叠的随机序列gups_basic自带了一个多项式线性反馈移位寄存器LFSR风格的生成器PolyRand本原多项式poly 7周期period 1317624576693539401main.pony。_seed通过平方-乘风格的跳转算法把生成器推进到指定的种子位置main.pony从而让每个Streamer从不同相位开始扩大随机覆盖范围。完成检测倒计数模式Main使用两个倒计数变量跟踪进度streamer_done每收到一次就减一归零时向所有Updater发送done消息updater_done同理归零时输出结果main.pony。这是一种典型的 actor 聚合countdown模式在 examples/README.md 中被概括为“可配置并行度 倒计数完成检测”也可在仓库其他示例如 actor 树聚合中看到类似思路。与 gups_opt 的对照理解优化方向如果希望进一步理解该基准的优化空间可对照阅读同目录的 gups_opt 程序。它把 CLI 参数改为对数形式--chunk表示 chunk 大小的 log2、--actors表示 actor 数量的 log2并引入了数组复用_reuse列表回收已用过的消息缓冲、让Updater直接更新本段数据、用 barrier 式同步done/confirm双向确认替代单向倒计数gups_opt 的 main.pony。其输出示例也额外打印了运行设置$ ./gups_opt logtable: 20 iterate: 10000 logchunk: 10 logactors: 2 Time: 0.114243 GUPS: 0.358534对比二者可以看到减少消息缓冲分配、降低跨 actor 通信量能在相同工作负载下显著提升 GUPS。需要说明的是具体数值受硬件、ponyc版本与编译参数影响应以本机实测为准。作为学习材料读而不是改正如 gups_basic 的 README 在“Program Modifications”一节明确指出的这是一个基准程序应当作为阅读学习材料而不是修改练习对象。改动它会影响测量结果的有效性。若要探索不同实现策略建议仿照仓库中gups_opt的做法新建独立程序在同一负载下做对照实验。从学习角度看gups_basic是理解 Pony actor 模型的好样本Main/Streamer/Updater三类 actor 展示了消息传递、尾递归行为、不可变共享引用Array[Updater] val与recover块的使用Config展示了基于cli包的CommandSpec.leaf/OptionSpec.i64声明式参数解析main.pony。掌握这些模式后你可以利用本仓库其他基准如 benchmark 目录 中的 Google Benchmark 套件对 runtime 与编译器优化做更细粒度的验证。赞分享编程语言编译器语言运行时【免费下载链接】ponycPony is an open-source, actor-model, capabilities-secure, high performance programming language项目地址https://gitcode.com/gh_mirrors/po/ponyc点击查看免费下载相关推荐Pony性能基准测试与主流编程语言的终极对比分析Pony性能基准测试与主流编程语言的终极对比分析 想要了解Pony编程语言在性能方面的真正实力吗 今天我们将深入分析这个基于Actor模型的现代编程语言编程语言编译器语言运行时OpenShell 沙箱出口代理适配器模型RFC 0005 分阶段实施计划解析OpenShell 沙箱出口代理适配器模型RFC 0005 分阶段实施计划解析 本文以 RFC 0005 实施计划 https://link.gitcode.编程语言编译器语言运行时Android 性能基准测试实战用 Jetpack Benchmark 与 BenchmarkRule 精确测量 CPU、内存与 IOAndroid 性能基准测试实战用 Jetpack Benchmark 与 BenchmarkRule 精确测量 CPU、内存与 IO Jetpack Ben文档教程知识库上一篇BiliTools AI智能总结功能如何用3分钟掌握90分钟B站视频的核心知识下一篇BiliTools终极指南3步实现B站视频的智能总结与高效下载创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表