
sgminer ADL集成揭秘如何读取GPU温度、风扇并实现超频的完整实现原理【免费下载链接】sgminerScrypt GPU miner项目地址: https://gitcode.com/gh_mirrors/sg/sgminersgminer 是一款著名的开源 GPU 挖矿客户端而它的ADLAMD Advanced Data Link集成正是读取 GPU 温度、风扇转速并实现超频调频的核心能力。这篇文章带你完整拆解 sgminer ADL 模块的实现原理从动态加载驱动库、枚举显卡、温度/频率读取到风扇控制与智能温控超频算法新手也能看懂。 什么是 ADLsgminer 与 AMD 显卡之间的桥梁ADL 是 AMD 官方提供的显卡硬件监控与控制接口。sgminer 并没有把 ADL 编译进程序而是运行时动态加载驱动库平台加载方式对应库文件Linuxdlopen()动态加载libatiadlxx.soWindowsLoadLibrary()atiadlxx.dll失败则回退 32 位的atiadlxy.dll这种运行时加载 函数指针的设计有两大好处不强依赖驱动没有 AMD 显卡的机器也能正常编译运行程序里所有 ADL 功能自动降级为空操作见 adl.h 中#else分支的 inline 空函数跨平台统一Linux 下用dlsym、Windows 下用GetProcAddress代码里统一封装成GetProcAddressadl.c。相关的核心文件一目了然adl.c — 全部实现约 1800 行初始化、读数、超频、温控adl.h — 对外接口gpu_temp()、gpu_fanspeed()、gpu_autotune()等adl_functions.h — ADL 3.0 全部函数指针类型定义Overdrive 5/6ADL_SDK/readme.txt — 官方 SDK 说明 初始化四步走搭好硬件监控系统程序启动时由 driver-opencl.c 调用init_adl()内部流程如下第 1 步加载库并解析函数prepare_adl()adl.c打开驱动库后逐个解析约 30 个 ADL 函数指针然后调用ADL_Main_Control_Create()初始化、ADL_Main_Control_Refresh()刷新设备列表再依次探测 Overdrive 5/6 API 是否可用。第 2 步枚举系统中的所有适配器通过ADL_Adapter_NumberOfAdapters_Get()ADL_Adapter_AdapterInfo_Get()拿到每张卡的索引、PCI 总线号、BIOS 信息。其中ADL_Adapter_ID_Get()返回0 就表示不是 AMD 卡会被跳过——这就是 sgminer 只监控 AMD 显卡的原因。第 3 步OpenCL 设备与 ADL 设备对号入座这是多卡用户最常踩的坑OpenCL 和 ADL 各自独立枚举显卡两者顺序可能不一致。sgminer 的策略是默认假设两者顺序一致数量对不上时会明确报错提示使用--gpu-map手动映射adl.cWindows 下总线号顺序混乱可用--reorder按总线号重新排序adl.c。第 4 步记录默认值并应用用户超频参数程序会保存每张卡的出厂性能档位DefPerfLev和风扇默认值以便退出时一键还原随后应用--gpu-engine、--gpu-memclock、--gpu-vddc、--gpu-fan、--gpu-powertune等启动参数adl.c。 还有一个贴心细节双芯显卡如某些双 GPU 矿卡上只有一颗 GPU 带风扇控制接口。sgminer 通过总线号相差 1 同名显卡自动识别出孪生 GPUtwin让没有风扇接口的那颗共享孪生兄弟的风扇数据adl.c。️ 温度、频率、风扇底层都是哪几个 ADL 调用所有读数函数都遵循同一模式加互斥锁 → 调 ADL 接口 → 换算单位 → 解锁。核心换算关系值得记住监控项ADL 接口单位换算GPU 温度ADL_Overdrive5_Temperature_Get原始值 ÷ 1000 ℃核心频率 / 显存频率 / 电压 / 活动率ADL_Overdrive5_CurrentActivity_Get频率 ÷ 100 MHz电压 ÷ 1000 V风扇转速RPMADL_Overdrive5_FanSpeed_Get设为SPEED_TYPE_RPM模式风扇百分比同上设为SPEED_TYPE_PERCENT模式功耗调节ADL_Overdrive5_PowerControl_Get百分比-20 ~ 20对应实现分别在 gpu_temp()、gpu_engineclock()、gpu_fanspeed()。两个值得学习的工程设计一次性全量读取gpu_stats()adl.c在一把锁内批量读出温度、双频、电压、风扇、功耗避免多把锁交叉带来的性能损耗驱动故障自愈若显卡突然停止上报风扇转速驱动崩溃的典型症状gpu_fanpercent()会自动禁用该卡的监控并触发app_restart()重启保护adl.c。⚡ 超频原理性能档位的读—改—写—回读AMD 显卡的频率/电压保存在**性能档位表ODPerformanceLevels**中通常有多个档位空闲/中/最高。sgminer 的超频函数set_engineclock()、set_memoryclock()、set_vddc()共用同一套套路adl.c读取出当前全部档位ODPerformanceLevels_Get改修改最高档的目标值并把所有低于目标值的低档位一并钳制到该值——因为低档位不能比高档位还高写ODPerformanceLevels_Set()写回驱动回读校验再次 Get 确认驱动真的接受了新值并更新内部缓存的 min/max 边界。单位小约定频率以MHz×1000.01 MHz 精度传输电压以mV×1000传输。风扇控制set_fanspeed()多两个关键步骤先置位USER_DEFINED_SPEED标志把风扇从驱动自动切换到用户手动老显卡只支持写 RPM 不支持写百分比时自动换算RPM 最大RPM × 百分比 ÷ 100。 智能温控超频与散热之间的自动闭环sgminer 最精彩的部分是gpu_autotune()adl.c它把超频变成了负反馈闭环——温度是目标风扇和频率是手段。三个默认阈值目标温度 targettemp 75℃ | 过热温度 overheat 85℃ | 迟滞 hysteresis 3℃风扇自动调节fan_autotuneadl.c温度 过热温度 → 风扇直接拉满 100%并报告过热错误温度 目标温度 → 按迟滞判断风扇 5% 或 10%温度 目标温度 − 迟滞值 → 风扇按比例缓慢下降防止抖动。核心频率自动调节超过cutoff 温度→ 降频到最低并停用该卡DEV_RECOVER等温度回落自动恢复adl.c超过过热温度 → 直接降频到最低速温度略高于目标 → 按驱动报告的步进值iStep逐级降频温度低于目标 →逐级提频温差大时步进翻倍加速爬升。⚠️ 迟滞hysteresis是经典控制思想温度必须偏离目标 3℃ 以上才动作避免风扇/频率在临界点来回振荡。️ 上手实践常用参数与交互面板启动时即可让 ADL 干活参数定义见 sgminer.csgminer --gpu-engine 850 --gpu-fan 80 --autofan --autoengine参数作用--gpu-engine MHz启动时设定核心频率--gpu-memclock MHz/--gpu-memdiff设定显存频率或相对核心的偏移--gpu-vddc V设定核心电压--gpu-fan %/--gpu-minfan %风扇上限/下限自动风扇模式--gpu-powertune %功耗调节-20 ~ 20--gpu-map n,m手动映射 OpenCL 卡序 → ADL 卡序--autofan/--autoengine开启风扇 / 频率自动温控终端交互模式下按c进入设置面板可实时查看Temp / Fan Speed / Engine Clock / Vddc并按单字母操作adl.cE核心频率 ·F风扇 ·M显存频率 ·V电压 ·P功耗 ·A自动参数U Ultratune自动扫描核心 × 显存频率组合GPU 按 10MHz、显存按 5MHz 步进实测每种组合的哈希率最后自动应用收益最高的那组频率——一个基于 ADL 的自动化暴力调优器adl.c。️ 安全设计退出即还原风险可控自动还原正常退出/重启时clear_adl()只对被修改过的卡managed标志恢复出厂性能档位和默认风扇再销毁控制、卸载驱动库adl.c边界保护所有手动设置都校验安全范围越界会要求二次确认官方警告adl_functions.h头部明确写着——同时拉高电压/频率却调低风扇可能烧毁显卡adl_functions.h。 延伸阅读整体架构文档doc/MINING.md、doc/FAQ.md多算法支持入口algorithm/ 目录scrypt、sha2 等OpenCL 驱动层与 ADL 的衔接driver-opencl.c设备结构体struct gpu_adl定义miner.h一句话总结sgminer 用运行时动态加载 函数指针解耦 AMD 驱动用锁内批量读取保证监控线程安全用目标温度 迟滞 步进的负反馈算法让超频与散热自动平衡——这套 ADL 集成的实现思路至今仍值得所有硬件监控类项目借鉴。【免费下载链接】sgminerScrypt GPU miner项目地址: https://gitcode.com/gh_mirrors/sg/sgminer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考