C++17高性能量子计算模拟器:从态向量到SIMD优化的工程实践
1. 项目概述为什么用C17来模拟量子计算量子计算模拟器听起来像是前沿科研的专属工具离我们普通开发者很远。但如果你深入了解一下会发现它的核心——态向量的存储与量子门的操作——本质上是一个高性能数值计算问题。这正是C的拿手好戏。我之所以选择C17来实现而不是Python或者Julia核心原因在于对极致性能和内存控制的追求。一个中等规模的量子电路模拟比如30个量子比特其态向量的大小就是2^30约10亿个复数。在Python里用numpy数组光是内存占用就可能超过16GB每个复数16字节操作起来更是缓慢。而C允许我们精细地控制内存布局、利用SIMD指令集并行计算甚至通过模板元编程在编译期完成一些优化这是解释型语言难以企及的。C17标准带来了许多让这类数值计算更优雅、更高效的特性。比如std::complex的稳定性和性能、constexpr if带来的编译期分支优化、结构化绑定让代码更清晰以及并行算法库为未来的多核优化铺平道路。这个项目的目的就是探索如何利用这些现代C特性将量子计算中抽象的“态”和“门”封装成高效、易用的类库让研究者或学习者能在一个高性能的沙盒中验证算法而无需被底层实现的性能瓶颈所困扰。2. 核心设计思路从数学抽象到高效代码量子计算模拟器的核心是两大块态向量State Vector和量子门Quantum Gate。态向量代表了量子系统的状态是一个长度为2^n的复数向量n为量子比特数。量子门则是对这个态向量进行线性变换的酉矩阵。模拟器的任务就是高效地存储这个巨大的向量并快速应用各种量子门操作。2.1 态向量StateVector的高效封装态向量的设计首要考虑内存和访问效率。直接使用std::vectorstd::complexdouble是最简单的但未必最优。2.1.1 内存布局与对齐为了最大化利用CPU缓存和SIMD如SSE, AVX指令我们需要确保数据是连续且对齐的。我选择使用std::unique_ptrstd::complexdouble[]来管理原生数组而不是std::vector因为这样可以更直接地控制内存分配和对齐。#include complex #include memory #include immintrin.h // 用于AVX指令 class StateVector { private: size_t num_qubits_; size_t dim_; // 2^num_qubits_ std::unique_ptrstd::complexdouble[] data_; // 使用C17的aligned_alloc替代品需注意平台兼容性或使用_aligned_malloc/_mm_malloc static constexpr std::size_t alignment 32; // 对齐到32字节适配AVX void allocate_aligned() { // 实际项目中可能需要平台特定的对齐分配如posix_memalign或_aligned_malloc // 此处为简化使用C17的new (std::align_val_t) 但需注意编译器支持 data_ std::unique_ptrstd::complexdouble[]( static_caststd::complexdouble*(::operator new[](dim_ * sizeof(std::complexdouble), std::align_val_t(alignment))) ); } public: explicit StateVector(size_t num_qubits) : num_qubits_(num_qubits), dim_(1ULL num_qubits) { if (num_qubits 63) throw std::overflow_error(Too many qubits.); allocate_aligned(); // 初始化到|0...0态即第一个元素为1其余为0 data_[0] 1.0; std::fill(data_.get() 1, data_.get() dim_, std::complexdouble(0.0, 0.0)); } // ... 其他方法 };注意跨平台的对齐内存分配是个坑。在Windows上常用_aligned_malloc在Linux/macOS上用posix_memalign或aligned_alloc。C17标准库的std::aligned_alloc理论上可行但编译器支持度和行为有差异。在生产代码中通常会封装一个平台相关的aligned_new函数。2.1.2 利用SIMD进行向量化运算当应用一个单量子比特门如泡利X门时我们需要更新态向量中许多成对的元素。手动展开循环并利用SIMD intrinsics可以带来数倍的性能提升。例如对于作用于第target个量子比特的X门其操作模式是交换特定间隔的复数对。我们可以用AVX指令一次处理4个double即2个复数。#include immintrin.h void apply_x_gate_avx(StateVector sv, size_t target) { size_t stride 1ULL target; auto* data reinterpret_castdouble*(sv.data()); // 将复数数组视为双精度浮点数交错数组 for (size_t i 0; i sv.dim(); i 2 * stride) { for (size_t j 0; j stride; j 2) { // 每次处理2个复数4个double size_t index_lo 2 * (i j); // 每个复数占2个double size_t index_hi 2 * (i j stride); // 加载低地址和高地址的复数对 __m256d vec_lo _mm256_load_pd(data index_lo); __m256d vec_hi _mm256_load_pd(data index_hi); // 交换 _mm256_store_pd(data index_lo, vec_hi); _mm256_store_pd(data index_hi, vec_lo); } } }实操心得直接写intrinsics代码很繁琐且难以维护。一个更好的策略是使用像xsimd或Eigen这样的库来包装SIMD操作它们提供了跨平台的向量类型让代码更清晰。但在性能最关键的核心里手写intrinsics有时仍是必要的。2.2 量子门QuantumGate的通用化设计量子门本质上是一个矩阵。但直接存储和运用大矩阵如多量子比特门效率极低。我们需要根据门的类型进行特化。2.2.1 门类型的表示与分发我设计了一个基类Gate然后派生出各种具体的门类如PauliXGate、HadamardGate、CNOTGate等。每个门类都知道如何高效地应用到态向量上。这里的关键是避免虚函数调用开销虽然现代编译器能去虚化但在最内层循环仍需谨慎。我们可以使用std::variantC17来存储不同类型的门并结合std::visit进行类型安全的分发。class Gate { public: virtual ~Gate() default; virtual void apply_to(StateVector sv) const 0; }; class PauliXGate : public Gate { size_t target_; public: explicit PauliXGate(size_t target) : target_(target) {} void apply_to(StateVector sv) const override { // 调用优化后的X门应用函数如上面提到的AVX版本 apply_x_gate_avx(sv, target_); } }; // 使用variant管理门序列 using GateVariant std::variantPauliXGate, HadamardGate, CNOTGate, /* ... */; std::vectorGateVariant circuit; void run_circuit(StateVector sv, const std::vectorGateVariant circuit) { for (const auto gate : circuit) { std::visit([sv](const auto g) { g.apply_to(sv); }, gate); } }2.2.2 矩阵分解与稀疏性利用对于通用的单量子比特门它可以表示为一个2x2的酉矩阵。应用这样的门到第k个量子比特上有一个标准的算法将态向量视为许多大小为2 * stride的块在每个块内门矩阵作用于两个相距stride的元素上。我们可以预先计算这个2x2矩阵并用循环应用它。对于CNOT受控非门这类双量子比特门其操作模式是条件性的交换或相位翻转我们可以设计出比通用矩阵乘法更高效的专用算法。3. 实现细节与C17特性的应用现代C特性能让代码更安全、更清晰同时不损失性能。3.1 利用constexpr进行编译期计算量子计算中很多常量是可以编译期确定的比如从量子比特数计算维度或者生成一些小的变换矩阵。constexpr函数和if constexpr能将这些计算移到编译期。constexpr size_t calculate_dimension(size_t num_qubits) noexcept { return (num_qubits 64) ? 0 : (1ULL num_qubits); // 防止溢出 } templatesize_t N constexpr auto generate_identity_matrix() { std::arraystd::complexdouble, N * N mat{}; for (size_t i 0; i N; i) { mat[i * N i] 1.0; } return mat; } // 在编译期生成一个2x2单位矩阵 constexpr auto id2 generate_identity_matrix2(); static_assert(id2[0] 1.0 id2[3] 1.0, Identity matrix generation error);3.2 使用结构化绑定和折叠表达式简化代码在处理门的参数或进行张量积计算时结构化绑定能让代码意图更明确。// 假设一个门需要目标比特和控制比特列表 struct GateApplication { size_t target; std::vectorsize_t controls; }; void apply_controlled_gate(const GateApplication ga) { auto [target, controls] ga; // 结构化绑定 // ... 使用target和controls } // 折叠表达式用于可变参数模板例如构建多控门 templatetypename... Controls bool all_controls_in_range(size_t num_qubits, Controls... controls) { return ((controls num_qubits) ...); // C17折叠表达式 }3.3 内存管理与零开销抽象使用std::unique_ptr管理动态数组结合自定义删除器来处理对齐内存的释放可以确保资源安全。RAII资源获取即初始化原则在这里至关重要确保态向量这个“重资产”在异常发生时也能正确释放。struct AlignedDeleter { std::size_t alignment_; void operator()(std::complexdouble* ptr) const { // 调用平台相关的对齐释放函数如 _aligned_free 或 free ::operator delete[](ptr, std::align_val_t(alignment_)); } }; using AlignedComplexArray std::unique_ptrstd::complexdouble[], AlignedDeleter;4. 性能优化实战从朴素实现到SIMD加速让我们以应用一个哈达玛门Hadamard Gate到单个量子比特为例看看优化过程。4.1 朴素实现最直接的实现就是按照数学公式对每一对受影响的振幅进行更新。void apply_hadamard_naive(StateVector sv, size_t target) { size_t stride 1ULL target; const std::complexdouble factor 1.0 / std::sqrt(2.0); for (size_t i 0; i sv.dim(); i 2 * stride) { for (size_t j 0; j stride; j) { size_t lo i j; size_t hi lo stride; auto a sv[lo]; auto b sv[hi]; sv[lo] factor * (a b); sv[hi] factor * (a - b); } } }这个版本清晰易懂但性能很差。每次循环都有两次加载、两次存储、四次复数运算并且没有利用任何数据局部性或并行性。4.2 循环展开与局部变量第一步优化是手动展开内层循环并使用局部变量减少数组访问次数。void apply_hadamard_unrolled(StateVector sv, size_t target) { size_t stride 1ULL target; const double inv_sqrt2 1.0 / std::sqrt(2.0); for (size_t i 0; i sv.dim(); i 2 * stride) { for (size_t j 0; j stride; j 4) { // 一次处理4个元素 auto a0 sv[i j]; auto b0 sv[i j stride]; auto a1 sv[i j 1]; auto b1 sv[i j stride 1]; auto a2 sv[i j 2]; auto b2 sv[i j stride 2]; auto a3 sv[i j 3]; auto b3 sv[i j stride 3]; sv[i j] inv_sqrt2 * (a0 b0); sv[i j stride] inv_sqrt2 * (a0 - b0); sv[i j 1] inv_sqrt2 * (a1 b1); sv[i j stride 1] inv_sqrt2 * (a1 - b1); // ... 类似处理a2,b2和a3,b3 } } }4.3 AVX-512向量化实现终极优化对于支持AVX-512的CPU我们可以一次处理8个复数16个double。这需要将复数运算拆解为实部和虚部。#include immintrin.h void apply_hadamard_avx512(StateVector sv, size_t target) { size_t stride 1ULL target; auto* data reinterpret_castdouble*(sv.data()); const __m512d inv_sqrt2 _mm512_set1_pd(1.0 / std::sqrt(2.0)); const __m512d minus_inv_sqrt2 _mm512_set1_pd(-1.0 / std::sqrt(2.0)); for (size_t i 0; i sv.dim(); i 2 * stride) { for (size_t j 0; j stride; j 8) { // 每次处理8个复数 size_t base_lo 2 * (i j); // 每个复数2个double size_t base_hi 2 * (i j stride); // 加载低地址和高地址的实部、虚部交错存储real0, imag0, real1, imag1... // 需要仔细排列加载指令以匹配运算模式 __m512d real_lo _mm512_load_pd(data base_lo); // 加载实部 __m512d imag_lo _mm512_load_pd(data base_lo 8); // 加载虚部假设对齐 __m512d real_hi _mm512_load_pd(data base_hi); __m512d imag_hi _mm512_load_pd(data base_hi 8); // 计算 (ab)/sqrt2 和 (a-b)/sqrt2 __m512d real_sum _mm512_mul_pd(_mm512_add_pd(real_lo, real_hi), inv_sqrt2); __m512d imag_sum _mm512_mul_pd(_mm512_add_pd(imag_lo, imag_hi), inv_sqrt2); __m512d real_diff _mm512_mul_pd(_mm512_sub_pd(real_lo, real_hi), inv_sqrt2); __m512d imag_diff _mm512_mul_pd(_mm512_sub_pd(imag_lo, imag_hi), inv_sqrt2); // 存储结果 _mm512_store_pd(data base_lo, real_sum); _mm512_store_pd(data base_lo 8, imag_sum); _mm512_store_pd(data base_hi, real_diff); _mm512_store_pd(data base_hi 8, imag_diff); } } }踩坑记录AVX-512指令要求内存严格对齐64字节。如果分配的内存没有对齐到64字节使用_mm512_load_pd会导致段错误。务必确保你的分配器返回对齐的内存。另外复数数组的交错存储实部、虚部交错使得向量化加载和存储变得复杂有时采用“数组结构体”AoS到“结构体数组”SoA的转换即分别存储所有实部和所有虚部可能更有利于向量化但这会增加数据重组开销需要根据具体门操作权衡。5. 构建与测试打造健壮的模拟器一个高性能的库离不开完善的构建系统和测试。5.1 现代CMake构建使用现代CMake管理项目可以方便地设置编译标志、检测CPU指令集支持、管理依赖。cmake_minimum_required(VERSION 3.15) project(QuantumSimulator VERSION 0.1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 根据CPU架构设置优化标志 include(CheckCXXCompilerFlag) check_cxx_compiler_flag(-marchnative COMPILER_SUPPORTS_MARCH_NATIVE) if(COMPILER_SUPPORTS_MARCH_NATIVE) add_compile_options(-marchnative) endif() # 添加SIMD指令集检测和对应编译选项 check_cxx_compiler_flag(-mavx2 COMPILER_SUPPORTS_AVX2) if(COMPILER_SUPPORTS_AVX2) add_compile_options(-mavx2) add_definitions(-DUSE_AVX2) endif() check_cxx_compiler_flag(-mavx512f COMPILER_SUPPORTS_AVX512F) if(COMPILER_SUPPORTS_AVX512F) add_compile_options(-mavx512f) add_definitions(-DUSE_AVX512) endif() add_library(quantum_simulator STATIC src/state_vector.cpp src/gates.cpp) target_include_directories(quantum_simulator PUBLIC include) # 添加单元测试 enable_testing() add_executable(test_simulator tests/test_basic.cpp) target_link_libraries(test_simulator quantum_simulator) add_test(NAME BasicTests COMMAND test_simulator)5.2 单元测试与基准测试使用Google Test或Catch2进行单元测试确保算法的正确性。对于性能使用Google Benchmark进行微基准测试。// 使用Google Benchmark #include benchmark/benchmark.h #include state_vector.h #include gates.h static void BM_HadamardNaive(benchmark::State state) { StateVector sv(state.range(0)); for (auto _ : state) { apply_hadamard_naive(sv, 0); benchmark::DoNotOptimize(sv.data()); // 防止编译器优化掉整个计算 } state.SetComplexityN(state.range(0)); } BENCHMARK(BM_HadamardNaive)-RangeMultiplier(2)-Range(15, 115)-Complexity(); static void BM_HadamardAVX512(benchmark::State state) { StateVector sv(state.range(0)); for (auto _ : state) { apply_hadamard_avx512(sv, 0); benchmark::DoNotOptimize(sv.data()); } state.SetComplexityN(state.range(0)); } BENCHMARK(BM_HadamardAVX512)-RangeMultiplier(2)-Range(15, 115)-Complexity(); BENCHMARK_MAIN();通过对比不同实现和不同量子比特数下的性能我们可以清晰地看到向量化带来的收益并验证算法的时间复杂度是否符合预期的O(2^n)。6. 常见问题与调试技巧在开发这类高性能数值计算库时会遇到一些典型问题。6.1 精度问题量子模拟涉及大量浮点运算累积误差可能导致态向量不再归一化所有概率幅的平方和不为1。定期进行重新归一化是一个办法但更关键的是选择稳定的算法。例如在应用酉矩阵时使用旋转而非直接乘加可能数值上更稳定。对于关键算法可以添加断言检查归一化条件。void check_normalization(const StateVector sv, double epsilon 1e-12) { double norm 0.0; for (size_t i 0; i sv.dim(); i) { auto amp sv[i]; norm std::norm(amp); // |amp|^2 } if (std::abs(norm - 1.0) epsilon) { std::cerr Warning: State vector norm is norm , renormalizing.\n; // 触发重新归一化逻辑 } }6.2 多线程与并发量子门应用到不同量子比特上的操作通常是独立的可以并行化。但并行化需要仔细处理数据竞争。一个常见的模式是将态向量分区每个线程处理不相交的索引范围。C17的execution库和并行算法如std::for_each可以简化这部分工作但需要确保迭代器操作是线程安全的。更精细的控制可能需要使用OpenMP或std::thread。#include execution #include algorithm void apply_hadamard_parallel(StateVector sv, size_t target) { size_t stride 1ULL target; const double inv_sqrt2 1.0 / std::sqrt(2.0); std::vectorsize_t block_starts; for (size_t i 0; i sv.dim(); i 2 * stride) { block_starts.push_back(i); } // 并行处理每个块 std::for_each(std::execution::par, block_starts.begin(), block_starts.end(), [](size_t start) { for (size_t j 0; j stride; j) { size_t lo start j; size_t hi lo stride; auto a sv[lo]; auto b sv[hi]; sv[lo] inv_sqrt2 * (a b); sv[hi] inv_sqrt2 * (a - b); } }); }注意并行化并非总是带来加速。当问题规模较小量子比特数少时线程创建和同步的开销可能超过计算收益。需要根据问题规模动态决定是否启用并行。6.3 内存瓶颈与缓存优化对于大规模态向量内存带宽是主要瓶颈。优化内存访问模式至关重要。应用量子门时的循环顺序会影响缓存命中率。通常让最内层循环遍历连续的内存地址即对j的循环能获得最好的性能因为CPU缓存预取器可以很好地工作。此外可以考虑使用分块tiling技术将数据块装入L2或L3缓存进行处理减少对主存的访问。6.4 调试技巧使用Sanitizers在开发阶段使用-fsanitizeaddress,undefined编译并运行测试可以快速发现内存错误和未定义行为。精度调试对于复杂的多门电路将模拟结果与已知的数学结果或小规模下的暴力计算结果进行对比。性能剖析使用perf(Linux) 或VTune(Intel) 工具分析热点函数和缓存命中率指导优化方向。可视化中间态对于小规模系统如10个量子比特可以编写函数将态向量输出为概率分布图直观验证门操作的正确性。开发这样一个模拟器的过程是不断在数学正确性、代码优雅性和运行效率之间寻找平衡。最终的目标是提供一个既可靠又快速的工具让使用者能专注于量子算法本身而不是底层实现的细节。虽然完全模拟大规模通用量子计算机仍是遥不可及但一个精心优化的模拟器对于研究中等规模量子算法、教学演示乃至验证专用量子硬件的行为都有着不可替代的价值。

相关新闻

YOLOv8与EIEStem在玉米害虫检测中的实践应用

YOLOv8与EIEStem在玉米害虫检测中的实践应用

1. 项目背景与核心价值在农业生产中,玉米作为全球三大主粮之一,其病虫害防治一直是影响产量的关键因素。传统的人工巡查方式效率低下且依赖经验,而基于深度学习的视觉检测技术为这个问题提供了全新的解决方案。这个项目采用YOLOv8模型结合EIE…

2026/10/9 8:56:13 阅读更多 →
基于GNN的谣言检测系统设计与实现

基于GNN的谣言检测系统设计与实现

1. 项目背景与核心价值谣言检测一直是社交网络内容安全领域的重要课题。传统基于关键词匹配或简单统计的方法在复杂网络环境中表现乏力,而图神经网络(GNN)能够有效捕捉信息传播的拓扑结构特征。这个毕业设计项目采用Flask框架构建Web应用&…

2026/9/27 12:41:58 阅读更多 →
垂直领域AI解决方案:核心技术架构与工程实践

垂直领域AI解决方案:核心技术架构与工程实践

1. 项目背景与定位解析天津地一科技这个由大厂团队创立的工作室,选择在2026年前完成技术布局,背后有着深层次的行业考量。从当前AI技术发展曲线来看,2024-2026年正是生成式AI从技术爆发期向产业落地期过渡的关键窗口。我们团队在计算机视觉和…

2026/10/8 22:19:53 阅读更多 →

最新新闻

从零跑通大模型应用全链路:模型选型、OCR、知识库与Agent框架实战

从零跑通大模型应用全链路:模型选型、OCR、知识库与Agent框架实战

大模型这两年从“新鲜玩意”变成了日常工具,但真正落到自己手里跑通一条完整链路的人其实没想象中多。我身边不少朋友的状态是:聊天窗口里用得挺溜,一到要接自己的数据、要批量处理文档、要搭一个能持续用的服务,就卡住了。这篇东…

2026/10/9 8:55:22 阅读更多 →
给Claude Code装上长期记忆:claude-mem如何突破上下文窗口限制

给Claude Code装上长期记忆:claude-mem如何突破上下文窗口限制

如果你也在用 Claude Code 干活,多半遇到过同一个尴尬:上一个会话里刚交代清楚的偏好,下一个会话它全忘了。我折腾 claude-mem 之前,几乎每天都要把“接口返回格式用 camelCase”“日志必须打印 requestId”“测试命令用 pnpm tes…

2026/10/9 8:55:22 阅读更多 →
Python统一身份认证服务设计与实现:JWT多端登录毕设项目全解析

Python统一身份认证服务设计与实现:JWT多端登录毕设项目全解析

最近来问毕设选题的同学特别多,十个里有七八个都在犹豫做什么才能既好写又能顺利答辩。我个人的建议非常明确:如果你不想被简单管理系统卷死,又没精力挑战算法难度,那用 Python 做一个统一身份认证服务,绝对是性价比很…

2026/10/9 8:55:22 阅读更多 →
pytest自动化测试失败现场回放:自动截图与日志捕获机制详解

pytest自动化测试失败现场回放:自动截图与日志捕获机制详解

自动化测试跑完一看报告,一堆失败用例,但是除了一个红叉和一个异常栈之外什么线索都没有——这种体验我相信做自动化的小伙伴都经历过。尤其是UI自动化,定位元素失败、弹窗遮挡、网络延迟导致的加载慢,光靠报错信息很难还原现场。…

2026/10/9 8:55:22 阅读更多 →
PHP性能优化实战:从版本选型到代码、并发与SQL的完整地图

PHP性能优化实战:从版本选型到代码、并发与SQL的完整地图

做PHP做了这么多年,隔三差五就会看到有人在技术群里问“PHP怎么优化”。问的人多了,答案也很散:有人说换PHP 8,有人说开OPcache,有人上来就让你上Redis、上队列。说实话这些都对,但如果你脑子里没有一张完整…

2026/10/9 8:55:22 阅读更多 →
pstack-claude:Linux下Claude服务进程级诊断方法论

pstack-claude:Linux下Claude服务进程级诊断方法论

1. “pstack-claude”不是工具名,而是调试现场的命名习惯——先破除一个普遍误解很多人第一次在GitHub Issues、运维日志或团队内部文档里看到pstack-claude这个词,第一反应是:“这是个新出的Claude配套CLI工具?还是某个开源项目代…

2026/10/9 8:54:19 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →