让 C++ 不那么慢:Less Slow C++

跳至内容

导航菜单

切换导航 登录

搜索或跳转到...

搜索代码、仓库、用户、问题、拉取请求...

搜索 清除 搜索语法提示

提供反馈

我们会阅读每一条反馈,并非常认真地对待您的意见。 包括我的电子邮件地址,以便与我联系 取消 提交反馈

保存的搜索

使用保存的搜索可以更快地过滤结果

名称 查询 要查看所有可用的限定符,请参阅我们的文档。 取消 创建保存的搜索 登录 注册 重新聚焦 您已在另一个标签或窗口中登录。重新加载以刷新您的会话。您已在另一个标签或窗口中注销。重新加载以刷新您的会话。您已在另一个标签或窗口中切换了帐户。重新加载以刷新您的会话。关闭警报 {{ message }} ashvardanian / less_slow.cpp 公开

学习如何在 C++ 20、C 99、CUDA、PTX 和汇编中编写“Less Slow”的代码,从数值和 SIMD 到协程、ranges、异常处理、网络和用户空间 IO。 ashvardanian.com/tags/less-slow/

许可证

Apache-2.0 license 643 stars 36 forks Branches Tags Activity Star 通知 您必须登录才能更改通知设置

附加导航选项

ashvardanian/less_slow.cpp

main BranchesTags 转到文件 代码

文件夹和文件

名称| 名称| 最后提交消息| 最后提交日期 ---|---|---|---

最近提交

历史

374 Commits .github/workflows| .github/workflows .vscode| .vscode .clang-format| .clang-format .gitattributes| .gitattributes .gitignore| .gitignore CMakeLists.txt| CMakeLists.txt LICENSE| LICENSE README.md| README.md VERSION| VERSION less_slow.cpp| less_slow.cpp less_slow.cu| less_slow.cu less_slow_aarch64.S| less_slow_aarch64.S less_slow_amd64.S| less_slow_amd64.S less_slow_sm70.ptx| less_slow_sm70.ptx less_slow_sm80.ptx| less_slow_sm80.ptx less_slow_sm90a.ptx| less_slow_sm90a.ptx 查看所有文件

仓库文件导航

学习编写 Less Slow 的 C、C++ 和汇编代码

本仓库中的基准测试并不旨在完全涵盖每个主题,但它们有助于形成一种心态和直觉,以便进行面向性能的软件设计。它还提供了一个在 C++ 中使用一些非 STL 但事实上标准的库、通过 CMake 导入它们并从源代码编译的示例。对于更高级别的抽象和语言,请查看 less_slow.rsless_slow.py

许多现代代码都存在常见的缺陷,例如 bug、安全漏洞和性能瓶颈。大学课程经常教授过时的概念,而训练营则过度简化了关键的软件开发原则。

Less Slow C++

本仓库提供了编写高效 C 和 C++ 代码的实践示例。它利用了 C++20 功能,主要为 Linux 上的 GCC 和 Clang 编译器设计,但也可能在其他平台上工作。主题范围从在几纳秒内执行的基本微内核到涉及并行算法、协程和多态性的更复杂的结构。 一些亮点包括:

要阅读,请跳转到 less_slow.cpp源文件,并阅读代码片段和注释。 按照以下说明在您的环境中运行代码,并将其与阅读源代码时的注释进行比较。

运行基准测试

该项目旨在与 Linux、MacOS 和 Windows 上的 GCC、Clang 和 MSVC 编译器兼容。 也就是说,为了涵盖最广泛的功能,建议在 Linux 上使用 GCC:

如果您熟悉 C++ 并希望在阅读时查看代码和测量结果,您可以克隆仓库并执行以下命令。

git clone https://github.com/ashvardanian/less_slow.cpp.git # 克隆仓库
cd less_slow.cpp                      # 更改目录
pip install cmake --upgrade                 # PyPI 拥有较新版本的 CMake
sudo apt-get install -y build-essential g++         # 安装默认构建工具
sudo apt-get install -y pkg-config liburing-dev       # 安装 liburing 以绕过内核
sudo apt-get install -y libopenblas-base          # 安装数值库
cmake -B build_release -D CMAKE_BUILD_TYPE=Release     # 生成构建文件
cmake --build build_release --config Release        # 构建项目
build_release/less_slow                   # 运行基准测试

构建将从源代码中提取并编译多个第三方依赖项:

要控制输出或运行特定的基准测试,请使用以下标志:

build_release/less_slow --benchmark_format=json       # 以 JSON 格式输出
build_release/less_slow --benchmark_out=results.json    # 将结果保存到文件而不是 `stdout`
build_release/less_slow --benchmark_filter=std_sort     # 仅运行名称中包含 `std_sort` 的基准测试

为了提高稳定性和可重复性,请禁用 CPU 上的同步多线程 (SMT) 并使用 --benchmark_enable_random_interleaving=true 标志,该标志会像此处所述地对基准测试进行洗牌和交错。

build_release/less_slow --benchmark_enable_random_interleaving=true

Google Benchmark 通过 libpmf 支持 User-Requested Performance Counters。 请注意,收集这些可能需要 sudo 权限。

sudo build_release/less_slow --benchmark_enable_random_interleaving=true --benchmark_format=json --benchmark_perf_counters="CYCLES,INSTRUCTIONS"

或者,使用 Linux perf 工具来收集性能计数器:

sudo perf stat taskset 0xEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFF build_release/less_slow --benchmark_enable_random_interleaving=true --benchmark_filter=super_sort

项目结构

本仓库的主要文件显然是包含 CPU 端代码的 less_slow.cpp C++ 文件。 创建了用于不同硬件特定优化的其他几个文件:

$ tree .
.
├── CMakeLists.txt     # 所有文件的构建和汇编指令
├── less_slow.cpp      # 主要 CPU 端基准测试代码,包含大部分示例
├── less_slow_amd64.S    # 64 位 x86 CPU 的手写汇编内核
├── less_slow_aarch64.S   # 64 位 Arm CPU 的手写汇编内核
├── less_slow.cu      # 用于 Nvidia GPU 并行算法的 CUDA C++ 示例
├── less_slow_sm70.ptx   # Nvidia Volta GPU 的手写 PTX IR 内核
└── less_slow_sm90a.ptx   # Nvidia Hopper GPU 的手写 PTX IR 内核

梗图和参考文献

没有梗图的教育内容?! 算了吧!

IEEE 754 vs GNU Compiler | No Easter Bunny, No Free Abstractions ---|---

Google Benchmark 功能

此基准测试套件使用 Google Benchmark 提供的大部分功能。 如果您编写了很多基准测试,并且避免阅读完整的用户指南,以下是最有用的功能的简要列表: