Win7老显卡安装cgminer 3.1.1:OpenCL配置与排错指南

发布时间:2026/10/30 6:02:27
Win7老显卡安装cgminer 3.1.1:OpenCL配置与排错指南

简介:cgminer 3.1.1 Windows 版是面向比特币及衍生币种矿工、硬件爱好者与旧版挖矿软件研究者的多线程多池挖矿程序,支持 GPU、FPGA 与 ASIC,带有 ATI 显卡监控、超频和风扇转速调节,使用时不宜同时连接多条区块链。压缩包共 43 个文件、约 6.83MB,含两个 exe 主程序、8 个 dll 运行库、5 个 OpenCL 内核、5 个 FPGA 比特流文件,以及 txt 文档、示例 conf 和 php、java 版 API 示例。文档覆盖 API、GPU、FPGA、ASIC 与 SCRYPT 等主题,内核与比特流体现不同算法和硬件后端,dll 对应网络、加密等依赖。已有 560 人学习下载。读者可了解早期多算法挖矿软件的目录结构、GPU/FPGA 后端组织与 API 接入方式,并对照文档梳理运行库依赖、内核选择和兼容性排查思路。

1. 一台 Win7 老机器上的 cgminer 3.1.1:为什么它到现在还有人装

上周又有人问我 cgminer 3.1.1 在 Windows 上怎么装。他的场景很典型:仓库角落翻出一台旧主机,显卡是当年的 A 卡,系统还是 Win7 SP1,装完驱动双击cgminer.exe,窗口一闪就没了,连个报错都不留。这种情况很常见,因为 3.1.1 是很旧的版本,它的运行前提和现在这些工具完全不一样:它不会自动去找 OpenCL 运行库,也不会提示你缺哪个 dll;参数没给对,它就结束运行,什么都不说,只留下一个关闭的窗口。

这套环境现在还被装,主要是因为它对上古老显卡、运行老旧驱动很稳定,命令行参数少,配置文件是纯 JSON,出问题能一行行看日志。适合手上有闲置的老机器和旧显卡、想把它重新跑起来的人,也适合想弄明白 GPU 计算程序到底依赖哪些底层组件的人。不适合指望它在新系统上开箱即用的人。这篇按真实安装顺序来:先列环境,再装驱动和运行库,然后配 conf、验证跑通,最后是装坏了怎么救。

2. 装前把环境列清楚:Windows 版本、OpenCL 运行库与目录清单

安装 cgminer 3.1.1 之前,先把三件事定下来:系统用哪个版本、OpenCL 运行库从哪来、程序放哪个目录。这三个点任何一处没定好,后面调参数都会很麻烦。

2.1 系统与硬件对照:哪套组合能一次点亮

我把手里跑通过的组合和经常出问题的组合列成一张表,照着对一遍,比装完再排查省事得多。

项目容易一次成功容易出问题说明
操作系统Win7 SP1 x64Win10 1809 之后的版本、精简版系统老驱动在新系统上签名和安装拦截更多
显卡GCN 架构的 A 卡、开普勒及更早的 N 卡核显、很新的显卡新卡驱动里往往不再带老 OpenCL 组件
显卡驱动厂商官网的旧版完整驱动包Windows Update 自动推送的驱动自动推送的包经常只装显示部分,不装计算部分
运行库VC++ 2010 与 2013 的 x86、x64 都装只装 x643.1.1 的 exe 常见是 32 位
安装位置C:\cgminer桌面、Program Files、同步盘目录路径带空格或会被 UAC 重定向
登录方式本机物理登录远程桌面会话远程会话里常常枚举不到 GPU

先说位数这件事,它是后面所有报错的根源。发布包里那个cgminer.exe我见过的构建大多是 32 位,32 位进程在 64 位 Windows 上只会去C:\Windows\SysWOW64找OpenCL.dll,不会去看System32。所以哪怕你装的是 64 位驱动、System32下明明有OpenCL.dll,程序照样报找不到平台。第一次装的时候,我在这上面花了整整一个下午,最后发现是两个目录的差异。

再说系统。Win7 SP1 需要先打全补丁,尤其是一个和 SHA-2 签名相关的补丁,否则新版驱动装不上。Win10 不是不能跑,但 1809 之后系统对老驱动的兼容性收紧,加上显示驱动的超时重置策略变了,跑起来会莫名其妙掉到 0 算力。如果手上只有 Win10 的机器,建议先做好“随时回滚”的准备再动手。

2.2 OpenCL 从哪里来:驱动自带还是单独补 dll

cgminer 3.1.1 本身不带 OpenCL 实现,它只是调用方。真正干活的是显卡驱动里那套 OpenCL 运行时。所以安装顺序永远是:干净卸载旧驱动 → 重启 → 断网 → 装官网旧版完整驱动 → 再重启 → 确认 dll 到位。

A 卡和 N 卡的表现略有差别。A 卡的完整驱动包一般会把 32 位和 64 位两套 OpenCL 运行时都装上,装完System32和SysWOW64下都应该有OpenCL.dll。N 卡的驱动自带 OpenCL,但老版本可能只实现到 OpenCL 1.1,功能上够用,问题在于某些驱动装完只留下 64 位那一份。核显我不建议拿来跑,共享内存、驱动裁剪、算力不稳定,排查成本远高于收益。

检查动作很简单,开一个 PowerShell 窗口,两条命令:

Get-ChildItem C:\Windows\System32\OpenCL.dll # 64 位运行时 Get-ChildItem C:\Windows\SysWOW64\OpenCL.dll # 32 位运行时,32 位 exe 用这个

两条都能出结果,说明运行时齐了。只有第一条有结果,就把驱动重装一遍,注意安装时别用“仅安装显示驱动”那类精简选项。两条都没有,说明驱动压根没装计算组件,别急着去找 dll。

注意:从网上随便抓一个OpenCL.dll丢进程序目录,是这类安装里最常见的错误做法。位数不对会直接报0xc000007b,版本不对会在枚举设备阶段崩掉,而且报错信息完全不指向真正的原因。

2.3 目录结构与三个必设的环境变量

目录我一般固定成这个结构,好处是所有相对路径都能预测,出问题看日志时不用猜它到底读的哪个文件。

C:\cgminer\ ├── cgminer.exe # 主程序,32 位 ├── cgminer.conf # 配置文件,必须和 exe 同目录 ├── *.cl # 部分构建会带内核文件,不能挪走 └── doc\ # 说明文档,可有可无

.cl内核文件如果在发布包里有,就必须和 exe 放在一起,程序启动时按相对路径加载,挪到别处会在开始计算的那一刻报错。这一点很隐蔽,因为枚举设备阶段完全正常。

环境变量是另一个关键点。老 A 卡在 Windows 上有一组默认的显存分配限制,不放开的话程序申请不到足够大的缓冲区,表现是设备能枚举到、但强度一调高就归零。常设的就这么几个:

变量名常用值作用不设的后果
GPU_MAX_ALLOC_PERCENT100放开单次显存分配上限高强度下分配失败
GPU_USE_SYNC_OBJECTS1改用同步对象做调度长时间跑容易卡死
GPU_SINGLE_ALLOC_PERCENT100允许一次性大块分配scrypt 模式下更明显

这三条不是玄学,是真的会影响能否跑满。装完驱动、放好文件,再设这三条,顺序别颠倒。

3. 落地安装:从解压到 cgminer.exe 第一次枚举设备

这一章是从压缩包到程序真正识别出设备的全过程。每一步都有明确的成功判据,任何一步没达到判据就别往下走,否则后面调参数就是白费功夫。

3.1 解压路径与权限:别放在中文和空格目录下

先把压缩包解到C:\cgminer。不要解到桌面,不要解到C:\Program Files,不要解到任何同步盘目录。原因有两个:一是路径里有空格时,某些内部调用拼接路径会出问题;二是Program Files受 UAC 保护,程序回写配置文件时会被重定向到虚拟存储,你以为改了 conf,实际改的是另一份。

解压完先确认文件齐全,然后给 exe 加一个兼容性设置。右键cgminer.exe→ 属性 → 兼容性 → 勾选“以管理员身份运行此程序”。这一步在 Win7 上可以不勾,在 Win10 上建议勾上,省掉后面很多权限相关的怪问题。

cd C:\cgminer Get-ChildItem | Select-Object Name, Length

这条命令的作用是核对目录内容:cgminer.exe应该在,如果发布包里带了.cl文件也要在。长度那一列能帮你判断有没有解压不完整,一个几百 KB 的 exe 是正常的,几 KB 就是坏包。

3.2 显卡驱动与 OpenCL 的安装顺序

驱动这一步我踩过最多次坑,现在的固定流程是这样:

  1. 控制面板里卸载现有的显卡驱动相关组件,重启。
  2. 断网。这一步是为了防止 Windows Update 在你装到一半时插进来覆盖。
  3. 安装官网下载的旧版完整驱动包,安装类型选完整/自定义,确保计算组件被勾上。
  4. 重启,用 2.2 节那两条命令确认两个目录下的OpenCL.dll都在。
  5. 恢复网络,立刻把驱动版本记到笔记里。

第三步的“自定义安装”值得强调。很多驱动包的默认选项是“快速安装”,它会跳过一部分可选组件。老版本里计算运行时有时候就藏在这些可选组件里,跳过之后驱动看起来是装好了,设备管理器里也没有黄色感叹号,但OpenCL.dll就是没有。

提示:装完驱动后不要马上跑 cgminer。先用一个最简单的 OpenCL 检测手段确认平台数量正常。没有现成工具的话,直接跑下一步的-n,效果一样。

3.3 环境变量用 setx 写死,别只在当前窗口 set

环境变量要用setx写进用户级,不要用set。set只在当前命令行窗口有效,关掉窗口就丢了,下次从快捷方式启动又变回默认值,然后你会以为是程序的问题。

# 写入当前用户的环境变量,新开的窗口才生效 setx GPU_MAX_ALLOC_PERCENT 100 setx GPU_USE_SYNC_OBJECTS 1 setx GPU_SINGLE_ALLOC_PERCENT 100

三条命令执行完,会提示“成功: 指定的值已得到保存”。这时候当前窗口里的变量还是旧的,必须关掉重开一个 PowerShell 窗口才读得到。验证方式:

$env:GPU_MAX_ALLOC_PERCENT $env:GPU_USE_SYNC_OBJECTS

能打印出100和1就对了。

为什么用用户级而不是系统级?因为系统级变量对所有进程生效,包括浏览器和别的图形程序,改错了会影响别的东西,而且排查时很难想到是环境变量的问题。用户级只影响你自己登录的会话,够用且安全。

3.4 首次启动:用 -n 枚举设备,用 -T 看日志

第一次运行不要直接连矿池,先枚举设备。-n(--ndevs)的作用是列出所有能识别到的设备然后退出,它是整个安装过程中最重要的一个探针。

cd C:\cgminer .\cgminer.exe -n

正常输出会先打印版本信息,然后列出平台和设备,每一块 GPU 一行,带设备序号和名称。看到这些行,说明 OpenCL 运行时、驱动、位数三件事全对上了,可以往下走。

如果这一步就报clGetPlatformIDs failed或者No devices detected,先回到 2.2 节,不要继续。这个报错和配置无关,是运行环境的问题。

枚举通过之后,用前台模式跑一次最小可运行命令:

# -T 只输出文本日志,不刷界面;--verbose 打详细过程 .\cgminer.exe -o stratum+tcp://<节点地址>:<端口> -u <用户名> -p x -T --verbose *> run.log

参数逐个说:-o指定节点地址,格式是stratum+tcp://加地址和端口;-u是用户名;-p是密码,很多场景下填x占位就行;-T关掉那种不断刷新的界面,只往标准输出打文本,这样重定向到文件才有意义;--verbose打开详细日志,第一次跑必须加,不然出问题什么都看不到。

*>是 PowerShell 的重定向写法,把标准输出和错误输出一起写进run.log。第一次跑完先别管算力多少,打开这个文件,从最后一行往前看,能定位绝大部分启动阶段的问题。

另外,如果设备是串口连接的外接设备,光有-n还不够,要显式指定串口:

.\cgminer.exe -S COM3 -o stratum+tcp://<节点地址>:<端口> -u <用户名> -p x -T

-S后面跟的是设备管理器里看到的实际端口号。USB 转串口的线要装对应芯片的驱动,端口号会随插拔变化,固定用同一个 USB 口能减少这类折腾。

4. 配置文件怎么写:cgminer.conf 里的节点、GPU 与 API 参数

命令行跑到能出算力,就可以把参数固化进配置文件了。配置文件的规则很简单:文件名必须叫cgminer.conf,必须和 exe 同目录,格式是标准 JSON,键名就是命令行长参数去掉前面两个横线。

4.1 从命令行参数迁移到 cgminer.conf

先给一份能直接改着用的骨架:

{ "pools": [ { "url": "stratum+tcp://<主节点地址>:<端口>", "user": "<用户名>", "pass": "x" }, { "url": "stratum+tcp://<备用节点地址>:<端口>", "user": "<用户名>", "pass": "x" } ], "api-listen": true, "api-port": "4028", "api-allow": "W:127.0.0.1,W:192.168.1.0/24", "intensity": "13", "worksize": "256", "thread-concurrency": "8192", "auto-fan": true, "temp-target": "75", "temp-cutoff": "85", "log": "5", "verbose": true }

几个必须知道的细节:

pools是数组,第一个是主节点,后面的是备用。主节点连不上时程序会自动往下切,切换记录会打在日志里,靠这个能判断是节点的问题还是本地的问题。

键名的大小写和连字符要严格对上,thread-concurrency不能写成thread_concurrency,写错了不会报错,只会被当成未知键忽略,然后你发现参数怎么调都没反应。

数值建议统一写成字符串,像"intensity": "13"。写成数字13大多数情况下也能读,但字符串是程序自己回写配置时的格式,保持一致能省掉一类莫名其妙的解析问题。

JSON 不允许尾逗号。最后一项后面多一个逗号,整个文件会被判定为无效,程序静默回落到默认值启动,表现就是“我明明配了,为什么没生效”。

命令行和配置文件同时存在时的行为容易让人困惑。我的习惯是只用一种:调参阶段全部走命令行,稳定之后一次性写进 conf,然后用快捷方式或计划任务启动,不再叠命令行参数。这样任何时候看到的现象,都能对应到唯一一份配置。

4.2 GPU 三件套:intensity、worksize、thread-concurrency

这三个参数决定了 GPU 怎么被喂数据,也是调参时唯一值得反复试的三个。其余参数基本是保护性质的。

参数作用常用区间调过头的表现
intensity单次提交的并行工作量8~20桌面卡顿、驱动重置、算力反降
worksize每个工作组的大小64 / 128 / 256数值不合适时算力平平、无明显报错
thread-concurrency并发的线程总数4096 / 8192 / 16384显存不足、启动即失败

调法我一般按这个顺序:

先把thread-concurrency和worksize固定在一个保守值,比如 8192 和 256。然后只动intensity,从 13 开始,每加 1 跑五分钟,看两个指标:日志里的算力数字,以及桌面是否还能正常操作。算力涨、桌面流畅,就继续加;算力不涨了或者鼠标开始一顿一顿的,退回上一档。

intensity定下来之后再动thread-concurrency。这个参数和显卡的流处理器数量、显存容量强相关,8192 是个通用起点,显存大的卡可以试 16384。它调过头的表现很干脆:程序启动时直接报分配失败,或者跑两分钟就崩。崩了就减半。

worksize的调整收益最小,通常放在最后。64、128、256 三个值试一遍,选算力最高的那个就行,差距一般在个位数百分比。

还有一个常被忽略的保护参数组:auto-fan、temp-target、temp-cutoff。老卡的散热风扇轴承磨损很常见,手动设个固定转速,夏天跑起来很容易过热降频。temp-target设 75、temp-cutoff设 85,让程序自己调风扇,比手动固定转速靠谱。

4.3 scrypt 与 SHA-256 两套参数不要混用

3.1.1 支持两种算法路径,靠--scrypt开关切换,配置文件里对应"scrypt": true。这两套路径对显存的要求完全不是一个量级。

scrypt 路径需要为每个线程预留一块较大的内存,显存占用随thread-concurrency线性上升。一块 1GB 的卡在 scrypt 下thread-concurrency到 4096 就很紧张了,2GB 以上才好调。SHA-256 路径主要靠整数运算,显存占用小得多,同样的卡可以把并发拉得很高。

混用的典型现象是:按 SHA-256 的经验配了一套参数,加上--scrypt之后程序启动就崩,或者设备枚举正常但算力一直是 0。这不是卡坏了,是内存申请不下来。遇到这种情况第一反应应该是把thread-concurrency砍一半,而不是怀疑驱动。

另一个容易忽略的点是内核文件。scrypt 路径在部分构建里依赖单独的.cl内核文件,如果发布包里带了这类文件却没和 exe 放一起,表现同样是算力为 0 且日志里没有明显报错。

4.4 开 API:--api-listen 与白名单

要在另一台机器上看运行状态,把 API 打开。配置里那三行就是干这个的:

"api-listen": true, "api-port": "4028", "api-allow": "W:127.0.0.1,W:192.168.1.0/24"

api-listen打开监听,api-port指定端口,默认 4028,api-allow是白名单。白名单的写法是权限:地址,W表示可读可写,R表示只读,多个条目用逗号分隔,不加空格。

白名单不写或者写错,表现是本地能连、局域网连不上,而且不报错,只是连接被静默拒绝。这个坑我在第一次配远程监控时踩过,查了半小时防火墙,最后发现是白名单里写了个不存在的网段。

打开 API 之后记得在系统防火墙里放行对应端口,只放行内网段,不要图省事全放开。

5. 装坏了怎么救:五条排查记录

cgminer 3.1.1 的报错信息很少,很多失败是静默的。所以排查不能靠猜,要靠固定的观察顺序。

5.1 先看这三行日志,能定位八成问题

不管什么现象,先把日志抓下来(-T --verbose *> run.log),然后按顺序找三类信息:

第一类是版本和配置加载行,一般在最前面几行,会告诉你读的是哪个配置文件、有没有加载成功。没看到配置文件相关的那行,说明程序没找到 conf,用的是默认值。

第二类是设备枚举结果,会列出平台数量和每块设备的序号。这里数量不对,问题在驱动和 OpenCL,不在参数。

第三类是节点连接状态,会打出连接成功、认证成功、开始提交这样的过程。到这一步才轮到讨论算力。

5.2 启动阶段的三条坑

坑一:双击 exe 窗口一闪就没了。

现象:双击cgminer.exe,黑窗口闪一下就消失,什么提示都没有。

原因:这个程序不带参数启动时会直接退出,它没有图形界面可以停留。另外,如果配置文件有语法错误,它也会在极短时间内退出,快到你看不清。

解决:永远从命令行启动。开一个 PowerShell 窗口,cd C:\cgminer之后执行.\cgminer.exe -T,输出会留在窗口里。如果还是要闪退,加上重定向*> run.log,然后看文件最后十几行。

坑二:clGetPlatformIDs failed或No devices detected。

现象:启动即报错,退出码非 0,日志里只有这两句之一。

原因:三种可能。一是OpenCL.dll缺失;二是位数不对,32 位 exe 找不到SysWOW64下的那份;三是在远程桌面会话里运行,那种会话拿不到 GPU 设备。

解决:先确认 2.2 节那两条路径下的 dll 都在;再确认 exe 位数,任务管理器里看进程有没有(32 位)标记;最后,如果是远程连过去的,换成本机物理登录再试一次。第三条最容易被忽略,我见过有人为了这个问题重装了三遍系统。

坑三:改了cgminer.conf完全不生效。

现象:改完配置重启,算力、节点、API 端口全是旧的,日志里也没有加载配置的记录。

原因:配置文件不在 exe 同目录;或者从快捷方式启动,快捷方式的“起始位置”指向了别的目录,程序按起始位置找 conf;或者 JSON 有语法错误,比如尾逗号、中文引号,整个文件被判定无效后静默回落到默认值。

解决:先cd C:\cgminer再启动,排除路径问题。然后用任意 JSON 校验工具过一遍文件,把中文引号、尾逗号清掉。快捷方式启动的话,右键看属性里的“起始位置”,必须也是C:\cgminer。

5.3 运行阶段的两条坑

坑四:跑几分钟算力掉到 0,屏幕黑一下又恢复。

现象:启动时算力正常,三五分钟后突然归零,显示器黑屏一两秒,然后画面回来,程序还在跑但不出活了。

原因:Windows 的显示驱动超时重置机制。GPU 上跑的计算任务如果占用时间超过默认阈值(大约 2 秒),系统会认为驱动挂了,强制重置,正在跑的任务全部丢失。老卡跑高intensity很容易触发。

解决:两条路一起走。一是降intensity,把它压到不触发重置的水平;二是调整系统的超时阈值,在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers下新建一个TdrDelay的 DWORD 值,设成 10 或 20,重启生效。这个改动会影响整机的图形稳定性,改之前想清楚。

坑五:本地能连 API,局域网另一台机器连不上。

现象:本机查询 4028 端口正常返回,局域网内另一台机器连接超时或被拒绝。

原因:api-allow白名单没包含对方网段;或者系统防火墙没放行;或者端口被别的进程占了。

解决:按顺序查。先netstat -ano | findstr 4028确认端口在监听且只有一个进程占用;再把对方所在网段加进api-allow,格式是W:192.168.1.0/24,注意斜杠后面是掩码位数不是 IP;最后在防火墙里给这个端口加一条只对内网段生效的入站规则。

提示:这五条里,前三条能在十分钟内定位,后两条需要观察一段时间才能复现。所以每次改完配置,至少让它跑十分钟再判断有没有修好。

6. 验证跑通:三条日志、一次 API 查询和半小时温度观察

参数配完、程序能起来,还不算装完。我判断一套环境是否真的跑通,看三样东西:日志里的持续产出、API 返回的运行状态、半小时内的温度曲线。

先看日志。程序跑起来十分钟后,打开run.log,搜索三类关键字。第一类是连接状态,能看到节点连上、认证通过这样的记录;第二类是产出记录,会出现 accepted 字样,偶尔夹着 rejected;第三类是异常,如果出现GPU 0 failure、disabled这类词,说明那块卡已经被程序踢出工作队列了,算力数字再好看也没意义。

判断健康度看比例:十分钟内 accepted 的数量应该远多于 rejected,比例大概在几十比一以上。rejected 偏多要么是节点侧的问题,要么是intensity调得太激进导致提交超时,后者降一档就能改善。

再看 API。开一个 PowerShell 窗口,用最原始的方式发一条命令:

# 直接对 API 端口发一条 summary 查询 $c = New-Object Net.Sockets.TcpClient('127.0.0.1', 4028) $s = $c.GetStream() $w = New-Object IO.StreamWriter($s) $w.WriteLine('{"command":"summary"}') # 每条命令一行 $w.Flush() $buf = New-Object byte[] 8192 $n = $s.Read($buf, 0, $buf.Length) [Text.Encoding]::ASCII.GetString($buf, 0, $n) $c.Close()

返回的是一段 JSON,重点看三个字段:总算力、已接受数量、被拒绝数量。把summary换成{"command":"devs"}能拿到每块卡单独的状态,多卡机器上用它来判断是不是某一块在拖后腿。

最后是温度。启动后每五分钟记一次,连续记半小时。合格的曲线是:前五分钟上升,之后在一个区间内小幅波动,不持续爬升。如果温度一路往上走没有平台期,说明散热跟不上,先把temp-target调低,再考虑清灰换硅脂。老机器的散热问题比参数问题更常见,也更容易被忽略。

我现在的习惯是:任何一台机器重新装完,都强制走一遍“日志十分钟 + API 查询 + 半小时温度记录”,三样都过才认为这套环境交付了。有一次省掉了温度那一步,结果机器在第三天因为风扇停转降频,算力掉了一半才发现,回头查日志什么都看不出来。从那以后我每次装完都强制走一遍这个流程,参数可以慢慢调,环境和温度必须先立住。希望帮到你。

本文还有配套的精品资源,点击获取