Qt 作为 Linux 上最重要的开发工具之一,为中国信创产业的发展和创新提供了更多的可能性和选择。Qt Group 中国区负责人许晟在开幕致辞中表示,“Qt 中国作为 Qt Group 在中国的本地化团队,不仅通过源代码交付帮助本地企业实现软件的自主创新,还基于强大的跨平台能力支持针对本地操作系统和主流芯片的开发,为中国信创产业的发展和创新提供了更多的可能性和选择。
Breakpoint 1, startline (c=0x4f8270, d=TO_SERVER, format=0x417a71"%04x:%3u: Request(%hhu): %s ") at parse.c:5252if( (print_timestamps || print_reltimestamps)
(gdb) bt
#0 startline (c=0x4f8270, d=TO_SERVER, format=0x417a71 "%04x:%3u: Request(%hhu): %s ") at parse.c:52
#1 0x000000000040b5f5 in print_client_request (c=0x4f8270, bigrequest=false) at parse.c:1692
#2 0x000000000040cc2d in parse_client (c=0x4f8270) at parse.c:1996
#3 0x0000000000403b4a in mainqueue (listener=4) at main.c:406
#4 0x00000000004045d4 in main (argc=4, argv=0x7fffffffdef8) at main.c:706
(gdb) c
Continuing.
Breakpoint 1, startline (c=0x4f8270, d=TO_CLIENT, format=0x417b32"%04x:%u: Reply to %s: ") at parse.c:5252if( (print_timestamps || print_reltimestamps)
(gdb) bt
#0 startline (c=0x4f8270, d=TO_CLIENT, format=0x417b32 "%04x:%u: Reply to %s: ") at parse.c:52
#1 0x000000000040c1f3 in print_server_reply (c=0x4f8270) at parse.c:1859
#2 0x000000000040d0e5 in parse_server (c=0x4f8270) at parse.c:2064
#3 0x00000000004035ed in mainqueue (listener=4) at main.c:336
#4 0x00000000004045d4 in main (argc=4, argv=0x7fffffffdef8) at main.c:706
// connect socket
Breakpoint 2, generateSocketName (addr=0x7fffffffdd30, display=9) at x11common.c:114114 snprintf(addr->sun_path,sizeof(addr->sun_path),"/tmp/.X11-unix/X%d",display);
(gdb) p display
$5=9
(gdb) c
Continuing.
[Detaching after fork from child process 7682]
Got connection from unknown(local)
Breakpoint 2, generateSocketName (addr=0x7fffffffd9d0, display=0) at x11common.c:114114 snprintf(addr->sun_path,sizeof(addr->sun_path),"/tmp/.X11-unix/X%d",display);
(gdb) p display
$6=0
(gdb) bt
#0 generateSocketName (addr=0x7fffffffd9d0, display=0) at x11common.c:114
#1 0x0000000000404c92 in connectToServer (displayname=0x7fffffffe363 ":0", family=1, hostname=0x0, display=0) at x11client.c:77
#2 0x0000000000402766 in acceptConnection (listener=3) at main.c:95
#3 0x0000000000403edd in mainqueue (listener=3) at main.c:452
#4 0x00000000004045d4 in main (argc=2, argv=0x7fffffffdf18) at main.c:706
(gdb)
近期,我们收到用户反馈,在使用 deepin 系统过程中遇到了 CPU 功耗过高导致的设备发热、续航较差情况,而用户在这些负载场景下,CPU 的占用往往不高。为了解决这个痛点,统信软件开源社区中心特别成立专项计划,对于 deepin 的电源进行专项优化,本文旨在针对此问题根因进行分析于说明。
在对电源进行专项优化之前,我们首先对 deepin 系统进行了深入的调查和分析,以了解其在负载场景下的实际运行情况。经过对 CPU 使用率和功耗的监测,我们发现了一个令人惊讶的事实:尽管在高负载场景下 CPU 的占用率不高,但其功耗却持续升高,最终导致设备发热并影响续航。也就是说,我们前期做的省电优化工作,不仅无效,还起了反作用(具体情况作者将在下文作出仔细说明)。
ACPI 是 Advanced Configuration and Power Interface 的缩写,是一种计算机硬件和操作系统之间交换能源相关信息的接口规范。它定义了计算机硬件的能源相关信息,如电源供应器状态、设备功耗、设备功率因数等。ACPI 是操作系统控制计算机硬件能源管理的标准,同时也是硬件厂商和操作系统之间通信的标准。
在/sys/devices/system/cpu/cpufreq目录下有许多文件名为policy<x>(x 代表核心编号),这些文件对应着你电脑上的 CPU 核心,而 CPU 的电源调度细节就在这些文件夹里面。在policy<x>目录下有一个文件`scaling_driver``,使用 cat 或其他方式访问它,得到的结果就是我们当前使用的调度器:
intel_cpufreq / acpi_cpufreq : 使用 scaling freq 调度
intel_pastate : 使用 Intel Pstate 调度
amd-pstate : 使用 AMD Pstate 调度
scalling freq 调度
这是最传统的 CPU 调度方式,你可以在 policy文件夹下的 scaling_available_governors 获取可选电源模式:
英文
中文
含义
performance
性能模式
最极致的性能表现,最火热的 CPU 温度,最短的续航。
powersave
节能模式
为绿色地球出一份力。
balance
平衡模式
性能和续航兼顾。小孩子才做选择,我全都要。
schedutil
平衡模式
平衡模式的一种,使用不同算法进行调度。
ondemand
平衡模式
平衡模式的一种,根据当前 CPU 负载动态调整频率。当负载大于阈值时调整到最高频率,其他情况按负载比例计算频率。
conservative
平衡模式
平衡模式的一种,根据当前 CPU 负载动态调整频率。当负载大于最大阈值时步进递增频率,当负载小于最低阈值时步进递减。
应用级别的省电,应该就是在保证用户使用流畅度的情前提下下节省性能。之前也有用户提出过,是否能参照 vivo 的 origin3 os 的不公平调度算法来实现优化。毕竟安卓系统的底层也是 linux,理论上实现难度不大。
Cgroups,全称 Control Groups,是 Linux 内核提供的一种资源管理机制,用于对进程分组并对其资源进行限制和隔离。Cgroups 可以用于限制进程的 CPU、内存、磁盘、网络等资源,也可以用于限制进程的优先级和 IO 权限。利用其提供的能力,我们很容易实现类似不公平调度算法(我们新的 AM 天然支持 Cgroups 的操作),但是我还有一些顾虑:
要是你觉得我们就是单纯把一些官方提供的二进制归档文件甚至是直接可用的deb包转化来上架应用商店,比如Visual Studio Code。那我很坦白告诉你,就是单纯几个字,“解包–运行–重新打包”。
但如果你是看了上文内容的话,就知道事情并不简单了。不只是从源码开始编译,核心在于如何与终端用户、各大开发者站在统一战线。当然,这里指的并不只是不断去满足用户的需要,这种可能会比较适合C端方向。我更希望的,是帮助用户在专业性比较强的问题面前能够提供满意的答卷,比如这次Wireshark,其实大部分用户真的不一定知道需要使用root来运行,所以我们做了优化。
应用/软件包只是一个普通产出物,不可替代的其实是整个适配过程中与其他人产生差异化的用户思维。
DAP 即调试适配协议( Debug Adapter Protocol ),顾名思义,它是用来对多种调试器进行抽象统一的适配层,将原有 IDE 和调试工具直接交互的模式更改为和 DAP 进行交互。该模式可以让 IDE 集成多种调试器变得更简单,且灵活性更好。
在 IDE 中的调试功能有许多小功能组成,包括单步执行、断点、查看变量值等,常规的实现方式是在每个 IDE 中去实现这些逻辑,且因为调试工具的接口不同,还需要为每个调试工具做一些适配工作,这将导致大量且重复的工作,如下图所示:
调试适配器协议背后的想法是标准化一个抽象协议,用于开发工具如何与具体调试器通信。这个思想和 LSP(Language Server Protocol)和 BSP(Build Server Protocol)类似,都是通过协议去统一相同功能在不同工具之间的差异性。其所处位置如下图所示,其中左边为不同的开发工具,右边为不能同的调试器,不同于开发工具和调试器直接交互的方式,DAP 将这些交互统一了起来,让开发工具和调试工具都面向 DAP 编程。
上图中的交互是通过协议进行,所以不会像通过 API 的方式存在语言限制,可以更好的适应调试器的集成。
DAP 如何工作
以下部分解释了开发工具(例如 IDE 或编辑器)和调试适配器之间的交互,包括具体的协议格式说明、交互流程等。
说到神经网络的起源,一般都会追溯到沃尔特·皮茨(Walter Pitts)与麦卡洛克(McCulloch),其中皮茨起到了更主要的作用,而且更具传奇性。皮茨(见图1)于1923年出生于美国底特律的铁匠家庭,家庭教育以老爸的拳头为主,而在这种家庭环境里,他主要靠自学学会了拉丁文、希腊文、逻辑和数学。在12岁那年,皮茨看完了罗素与怀特海的大厚本《数学原理》,并向罗素写邮件附上了自己发现的一些问题,罗素不免大吃一惊,还回信邀请皮茨到剑桥大学读他的研究生。由于家庭与年龄原因,皮茨当然不可能成行,不过当三年后,罗素到美国芝加哥讲学的消息传到皮茨耳朵里时,他就离家出走,而且终其一生再也没有回去过。其后皮茨遇到了麦卡洛克,两人在数学、逻辑和神经网络上有着共同的看法,并一起努力,于1943年合作完成了知名论文《A LOGICAL CALCULUS OF THE IDEAS IMMANENT IN NERVOUS ACTIVITY》,在这篇论文中,他们用二进制逻辑门来表示神经元,而且证明了此模型可以实现任何经典逻辑,从而表明了神经网络的通用性,奠定了深度学习的基础,同时也建立了神经科学和计算机科学之间的交叉研究。高中未毕业的皮茨受到了数学家与控制论之父维纳的欣赏,破格进入麻省理工学院攻读博士学位,被引荐给了冯·诺依曼,而上述论文也成为了冯·诺依曼关于计算机架构的著名论文《First Draft of a Report on the EDVAC》所引用的唯一一篇文章。但是在其后,首先是维纳与皮茨等断绝了关系,然后科学家们又发现神经网络并不能解释一切生物感知现象,皮茨深感失望,于是烧掉了自己历经数年写作的博士论文,从此退出了科研界,并死于酗酒相关的病症。
图1 沃尔特·皮茨
我们要介绍的下一位是弗兰克·罗森布拉特(Frank Rosenblatt),他是感知机(Perceptron)的提出者(感知机在我们之前的文章“深度学习入门”里介绍过),并且于1958年在实验了50次之后,让IBM 704自行学会了识别打孔卡上的标记是在左侧还是在右侧。他认为,通过感知机可以不依赖人类的训练与控制,就能感知、识别和辨认周边的环境,其代表作是《Principles of Neurodynamics: Perceptrons and the Theory of Brain Mechanisms》。但是,当时罗森布拉特设计的感知机实际上是只有一层的神经网络,能力非常有限,相比之下,现代成熟的神经网络则有数十层,因此同样是人工智能专家的明斯基撰文指出了感知机的局限性,并使得相应的研究进入了低潮。直到在2004年,大家重新看到了神经网络的潜力,IEEE协会为此也专门设立了罗森布拉特奖。
图3给出了基于大模型的问答。这次的代码稍多一点,但实际的代码也只有三行。第14行给出了需要一个问答(question-answering)的大模型,但是没有指定大模型的名字,第15行是提问的字符串“What does the customer want”,即用户到底想要什么。第16行则使用上述文本作为上下文,提问字符串作为问题,传给问答大模型获取答案。从运行结果看来,答案还是蛮靠谱的。
在ChatGPT之前,大模型其实也在发展,但是ChatGPT表现出来的多领域通用性和流畅性与之前的产品相比有明显的超越,所以造成了轰动。其后的GPT-4表现更为优异,在《Sparks of Artificial General Intelligence:Early Experiments with GPT-4》这篇论文里,微软团队给出了这样的一个示例:
提问:Can you write a proof that there are infinitely many primes, with every line that rhymes?
GPT4:Yes, I think I can,
Though it might take a clever plan.
I’ll start by noting Euclid’s proof,
Which shows that primes aren’t just aloof.
Assume we have a finite list,
Of primes, and that none have been missed.
Multiply them all together,
And add one, just to be clever.
The result will be a number,
That has no prime factors, oh wonder!
But every number has a prime,
That divides it, it’s just a matter of time.
So we’ve found a contradiction,
And our finite list needs eviction.
There must be infinitely many primes,
And that’s the end of my rhyming lines.
GPT中的G表示生成(Generative),这表示它主要的工作方式是生成内容,内容在这里主要是自然语言文本。按照OpenAI首席执行官Sam Altman的说法,The most important difference between ChatGPT and GPT-4, is that the GPT-4 predicts the next word with greater accuracy,即 ChatGPT与GPT-4最大的差异就在于GPT-4在预测下一个词的准确度比ChatGPT更高。
以ChatGPT与GPT-4为代表的大模型由于其使用了自然语言对话而引发了轰动,让普通人都能直观感受到大模型的魅力,但同时它作为一个基础设施,也提出了一个难题,就是它的编程接口是基于自然语言的,所以需要做所谓的提示工程(prompt engineering)。所谓提示工程,指的就是想让大模型好好干活,那就需要自己好好琢磨怎么和大模型好好说话。俗话说见人下菜,或者说见人说人话,见鬼说鬼话,那见了ChatGPT,当然就得说ChatGPT话了,不然它就没法理解问题,自然也没法给出好的回答了。Linux圈子里有Linus大佬的一句名言:“talk is cheap, show me your code”,中文翻译也很传神:“废话少说,放码过来”,俗一点的话那就是“少哔哔,秀代码”,但是自打GPT横空出世,以后可能就是“code is cheap, show me your talk”了,毕竟,给GPT一个提示,它可以还你百行代码。
从去年底以来,AIGC 炙手可热,多个业界大佬都认为 AIGC 会给整个产业带来一场革命,甚至所有的软件都会用 AI 重写。从历史上来看,人机交互方式的变革往往会将操作系统带入下一个世代,著名的例子如从命令行界面的 DOS 到键鼠图形界面的 Windows,以及带来触控界面的 iPhone,领创者都成为了世界顶级企业,带动了整个生态的发展。