跨CPU架构实践:Sogou C++ Workflow在ARM/龙芯平台的移植与优化
项目概述
Sogou C++ Workflow是一个高性能的并行计算与异步网络框架,支持Linux、macOS和Windows等多种操作系统。该框架的一个重要特性是跨平台兼容性,能够在不同架构的CPU上高效运行,包括32位或64位的x86处理器、大端或小端的ARM处理器以及龙芯处理器。详细信息可参考README.md。
架构支持现状
Workflow框架通过精心设计的代码结构,实现了对多种CPU架构的支持。在README_cn.md中明确提到,该框架支持国产龙芯处理器,这为其在国内服务器市场的应用奠定了基础。
框架的核心组件,如IO服务,在代码层面就考虑了不同架构的差异。以src/kernel/IOService_linux.cc为例,该文件中包含了对多种架构的条件编译支持。
跨架构移植的关键挑战
字节序问题
不同架构的CPU可能采用不同的字节序(大端或小端),这对数据的存储和传输会产生影响。Workflow框架在src/kernel/IOService_linux.cc中通过宏定义巧妙地解决了这一问题:
#if defined(__i386__) || (defined(__arm__) && !defined(__ARMEB__)) || \
defined(__sh__) || defined(__bfin__) || defined(__MIPSEL__) || \
defined(__cris__) || (defined(__riscv) && __riscv_xlen == 32) || \
(defined(__GNUC__) && defined(__BYTE_ORDER__) && \
__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && __SIZEOF_LONG__ == 4)
#define PADDED(x, y) x; unsigned y
#define PADDEDptr(x, y) x; unsigned y
#define PADDEDul(x, y) unsigned long x; unsigned y
#elif defined(__ia64__) || defined(__x86_64__) || defined(__alpha__) || \
(defined(__aarch64__) && defined(__AARCH64EL__)) || \
(defined(__riscv) && __riscv_xlen == 64) || \
(defined(__GNUC__) && defined(__BYTE_ORDER__) && \
__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && __SIZEOF_LONG__ == 8)
#define PADDED(x, y) x, y
#define PADDEDptr(x, y) x
#define PADDEDul(x, y) unsigned long x
#elif defined(__powerpc64__) || defined(__s390x__) || \
(defined(__sparc__) && defined(__arch64__)) || \
(defined(__aarch64__) && defined(__AARCH64EB__)) || \
(defined(__GNUC__) && defined(__BYTE_ORDER__) && \
__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ && __SIZEOF_LONG__ == 8)
#define PADDED(x, y) unsigned y; x
#define PADDEDptr(x,y) x
#define PADDEDul(x, y) unsigned long x
#elif defined(__PPC__) || defined(__s390__) || \
(defined(__arm__) && defined(__ARMEB__)) || \
defined(__sparc__) || defined(__MIPSEB__) || defined(__m68k__) || \
defined(__hppa__) || defined(__frv__) || defined(__avr32__) || \
(defined(__GNUC__) && defined(__BYTE_ORDER__) && \
__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ && __SIZEOF_LONG__ == 4)
#define PADDED(x, y) unsigned y; x
#define PADDEDptr(x, y) unsigned y; x
#define PADDEDul(x, y) unsigned y; unsigned long x
#else
#error endian?
#endif
这段代码根据不同的架构和字节序定义了不同的宏,确保数据结构在内存中的布局正确。
数据类型大小差异
不同架构的CPU对基本数据类型的大小可能有不同的定义,这会影响结构体的大小和布局。Workflow框架通过条件编译来处理这一问题,例如在处理32位和64位系统时使用不同的宏定义。
性能优化策略
针对ARM架构的优化
ARM架构的CPU通常具有低功耗、高效率的特点。Workflow框架可以通过以下方式针对ARM架构进行优化:
- 利用ARM的NEON指令集进行向量运算优化
- 针对ARM的缓存结构调整数据布局
- 优化函数调用,减少栈操作
针对龙芯架构的优化
龙芯处理器作为国产CPU的代表,具有独特的架构特点。Workflow框架在龙芯平台上的优化可以关注以下方面:
- 充分利用龙芯的多核心优势,优化并行计算任务的调度
- 针对龙芯的缓存层次结构调整数据访问模式
- 利用龙芯特有的指令集提高关键算法的性能
移植实践案例
以IO服务组件为例,src/kernel/IOService_linux.cc中的代码展示了如何实现跨架构的兼容性。该文件中的IOService::init函数负责初始化IO服务,它使用了与架构无关的系统调用,确保在不同CPU架构上都能正确工作:
int IOService::init(int maxevents)
{
int ret;
if (maxevents < 0)
{
errno = EINVAL;
return -1;
}
this->io_ctx = NULL;
if (io_setup(maxevents, &this->io_ctx) >= 0)
{
ret = pthread_mutex_init(&this->mutex, NULL);
if (ret == 0)
{
INIT_LIST_HEAD(&this->session_list);
this->event_fd = -1;
return 0;
}
errno = ret;
io_destroy(this->io_ctx);
}
return -1;
}
未来展望
随着ARM和龙芯等架构在服务器领域的应用越来越广泛,Workflow框架将继续加强对这些平台的支持和优化。未来的工作可能包括:
- 进一步优化针对ARM和龙芯架构的代码路径
- 增加更多针对特定架构的性能测试用例
- 与硬件厂商合作,深入挖掘架构特性,提升框架性能
通过持续的优化和改进,Sogou C++ Workflow将为跨平台应用开发提供更强大的支持,助力开发者在不同架构的CPU上构建高性能的应用系统。
参考资料
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0444
源启盛夏_AtomGit暑期开发者成长计划「源启盛夏」暑期校园开发者成长计划旨在激活校园开源力量,通过积分激励、认证扶持、资源倾斜等形式,引导高校组织和开发者完成「入驻 — 建项目 — 做贡献 — 获认证 — 得资源」的完整闭环。无论你是想带领社团入驻平台的组织者,还是希望用代码贡献证明自己的开发者,都能在这里找到属于你的成长路径。Markdown00
jiuwenswarmJiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0760
Hy3Hy3 是由腾讯混元团队研发的快慢思考融合的混合专家模型,总参数量 295B,激活参数 21B,MTP 层参数 3.8B。4 月底发布 Hy3 Preview 后,我们在 50 多个业务中获得了广泛的反馈,修复了各种体验问题,进一步提升了后训练的质量和规模。今天,我们发布 Hy3。它展现出显著强于同尺寸并比肩旗舰(参数规模往往是 Hy3 的 2~5 倍)开源模型的智能水平,显著提升了在各类产品和生产力任务中的实用价值。Python00
AscendNPU-IRAscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优C++0310
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00