高性能计算科学计算【免费下载链接】OpenBLASOpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.项目地址https://gitcode.com/gh_mirrors/op/OpenBLAS点击查看免费下载OpenBLAS 是一个基于 GotoBLAS2 1.13 BSD 版本优化而来的 BLASBasic Linear Algebra Subprograms基础线性代数子程序库同时内置了 LAPACKLinear Algebra PACKage的实现。本文以仓库根目录 README.md 为主线结合 Makefile.rule、TargetList.txt、docs/install.md、docs/runtime_variables.md 与 docs/user_manual.md 等文档完整讲解 OpenBLAS 的二进制获取、源码编译、交叉编译、目标 CPU 选择、多线程控制与程序链接方法。读完本文你将能针对自己的硬件平台从零构建一个 OpenBLAS并掌握线程数与 CPU 亲和性等运行时调优手段。OpenBLAS 是什么OpenBLAS 的核心定位是一个优化过的 BLAS 实现其代码基础可追溯到 2010 年的 GotoBLAS2 1.13 BSD 版本。BLAS 是线性代数运算的行业标准接口按运算规模分为三级Level-1向量运算如?axpy标量乘向量加向量、?dot点积、?scal标量缩放Level-2矩阵-向量运算如?gemv、?trmvLevel-3矩阵-矩阵运算如?gemm、?trsm这是性能优化投入最大的部分。OpenBLAS 还随附了更高级的 LAPACK 库线性代数包提供线性方程组求解、特征值分解等例程并提供了 CBLASC 语言接口与 LAPACKELAPACK 的 C 接口两套 C API。仓库中的cblas.h、lapacke相关头文件以及 driver/、kernel/、lapack/、interface/ 等目录共同构成了这一实现体系。提示BLAS/LAPACK 是标准化 API其函数级参考文档可参见 Netlib 的 BLAS 与 LAPACK 文档OpenBLAS 自身文档只覆盖少量非标准扩展函数详见 docs/extensions.md如?axpby、?imatcopy、?gemm3m、批处理 GEMM、bfloat16/hfloat16 支持以及openblas_set_num_threads等工具函数。获取 OpenBLAS二进制包与包管理器如果只是想使用 OpenBLAS 而不是修改其源码优先推荐安装预编译二进制包。OpenBLAS 项目官方发布二进制包的平台是 Windowsx86/x86_64 与 arm64/woa可从 Releases 页面下载这些二进制用 MinGW 构建采用的构建选项为NUM_THREADS64 TARGETGENERIC DYNAMIC_ARCH1 DYNAMIC_OLDER1 CONSISTENT_FPCSR1 INTERFACE0zip 压缩包内含头文件、静态库、共享库以及用于 CMake/pkg-config 查找的配置文件使用时需按实际安装路径修改其中的openblas.pc与OpenBLASConfig.cmake。在 Linux/macOS 等平台绝大多数包管理器都提供 OpenBLAS 包常见安装方式包括Debian/Ubuntu 系sudo apt install libopenblas-dev并可通过sudo update-alternatives --config libblas.so.3将 OpenBLAS 设为系统默认 BLASopenSUSE/SLEsudo zypper install openblas-develFedora/CentOS/RHELdnf install openblas-develCentOS/RHEL 经 EPEL 仓库提供Fedora 不提供 pkg-config 文件官方建议使用 FlexiBLAS其默认后端即为 OpenBLASArch/Manjarosudo pacman -S openblasWindowsconda install openblas或vcpkg install openblasmacOSbrew install openblas、sudo port install OpenBLAS-devel或 condaFreeBSDpkg install openblas。Linux 发行版通常将库本体openblas/libopenblas与开发文件头文件、pkg-config、CMake 文件包名常带-dev/-devel后缀拆成两个包要在自己的项目里直接使用 OpenBLAS 时必须两者都装。更多平台细节含 conda-forge 切换默认 BLAS 实现的方法见 docs/install.md。从源码编译 OpenBLAS源码可从https://github.com/OpenMathLib/OpenBLAS/获取注意默认分支是developmaster分支已严重过时。依赖编译 OpenBLAS 需要GNU Make 或 CMake一个 C 编译器如 GCC 或 Clang一个 Fortran 编译器可选仅用于 LAPACK 部分。一般强烈建议使用较新版本的编译器各 CPU 目标的具体版本要求见下文“故障排查”。如果系统没有 Fortran 编译器仍可编译 LAPACK 中一个由 Fortran 机器翻译为 C 的较旧版本但性能与精度都会略差。常规编译自动检测 CPU最简单的方式是直接执行make # BSD 系统上为 gmake可加 -j4 并行编译 make install不指定任何参数时构建系统会自动检测当前 CPU 并针对它做优化。要指定目标 CPU使用TARGET参数make TARGETNEHALEM完整的目标 CPU 列表见仓库根目录 TargetList.txt。构建参数既可以写在 Makefile.rule 中通常是去掉对应行的注释也可以直接作为make命令行参数传入两者等价。重要注意事项make install时必须重复构建阶段使用的所有命令行参数。原因在于部分设置如支持的最大线程数默认是从构建主机自动推导的若不显式重复安装产物可能与你预期的配置不符。另外从 Makefile.rule 可以看到当前仓库版本号为0.3.34.dev。用 CMake 构建用 CMake 构建遵循常规惯例在源码顶层目录之下或独立于源码树创建构建目录然后在其中调用cmake并传入源码树路径与需要的构建选项例如mkdir build cd build cmake .. -DDYNAMIC_ARCHON -DCMAKE_BUILD_TYPERelease cmake --build . cmake --install . --prefix /your/prefixCMake 侧的常用选项与 Make 参数一一对应如-DDYNAMIC_ARCHTRUE等价于DYNAMIC_ARCH1。Windows 平台用 CMake 生成 Visual Studio 解决方案时需注意至少使用 CMake 3.11详见 docs/install.md 的 Visual Studio 章节。核心构建选项速查表Makefile.rule 是构建配置的权威参考以下为最常用的核心选项选项默认值说明TARGET自动检测指定目标 CPU 架构列表见 TargetList.txtBINARY32/64视主机生成 32/64 位二进制32 位下禁用 AVX/AVX2/AVX-512CC/FC/HOSTCCgcc / 自动C/Fortran 编译器交叉编译时HOSTCC为本机 C 编译器NUM_THREADS自动检测支持的最大线程数数值过大会增加内存占用即使运行时用不满USE_THREAD0/1自动强制单线程/多线程构建USE_OPENMP1否用 OpenMP 实现多线程POWER8 目标必须开启USE_LOCKING1否单线程库被多个线程同时调用时的线程安全锁INTERFACE641否使用 64 位整数接口等价于 ifort 的-i8并非所有 Fortran 编译器支持DYNAMIC_ARCH1否在一个库内支持多目标 CPU 并在运行时检测详见下文DYNAMIC_OLDER1否DYNAMIC_ARCH 模式下额外加入老型号 x86_64 CPU 的专门优化DYNAMIC_LIST默认列表自定义 DYNAMIC_ARCH 包含的目标列表NO_LAPACK1否不编译 LAPACK会自动连带关闭 LAPACKENO_LAPACKE1否不编译 LAPACKEC 接口NO_CBLAS1/ONLY_CBLAS1否禁用 CBLAS / 只要 CBLAS 且无需 Fortran 编译器NO_STATIC1/NO_SHARED1否不生成静态库 / 不生成共享库NO_AFFINITY1开见说明默认关闭 CPU/内存亲和性处理注释掉该行可启用仅 Linux 实现BIGNUMA1否支持超过 256 核/16 个 NUMA 节点Linux 下实验性支持至 1024 核BUILD_BFLOAT161/BUILD_HFLOAT161否启用实验性 bfloat16 / fp16 支持BUILD_SINGLE/BUILD_DOUBLE/BUILD_COMPLEX/BUILD_COMPLEX16全开按需裁剪库只编译指定的数据类型DEBUG1否构建调试版本PREFIX/opt/OpenBLAS安装目录CROSS1否抑制构建末尾的自动测试调用同架构交叉编译现代 CPU 时使用NO_WARMUP1开关闭 BLAS 进入主函数前的缓冲区最佳区域搜寻省时GEMM_MULTITHREAD_THRESHOLD4GEMM 问题规模低于该阈值时单线程执行避免小矩阵多线程开销Julia 推荐 50BUFFERSIZE3220 (x86_64)多线程通信内存缓冲区大小处理 30000x30000 以上大矩阵时需调大MAX_STACK_ALLOC2048栈分配上限0 会禁用栈分配并可能降低 GER/GEMV 性能BLAS3_MEM_ALLOC_THRESHOLD32线程 Level-3 作业数组从栈切换到堆分配的阈值与 Java 默认 1MB 栈兼容CPP_THREAD_SAFETY_TEST1否构建后运行 C 线程安全测试DGEMM 测试约需 1300 MiB 内存LIBNAMEPREFIX/LIBNAMESUFFIX无修改库文件名如libopenblas_omp.soSYMBOLPREFIX/SYMBOLSUFFIX无给导出符号加前后缀避免与其他 BLAS 冲突例如构建一个只含单精度实数的多线程调试库并安装到自定义目录make BUILD_SINGLE1 USE_THREAD1 DEBUG1 make install PREFIX/opt/myopenblas BUILD_SINGLE1 USE_THREAD1 DEBUG1调试版本需要调试时构建make DEBUG1即可得到带调试信息的版本。在 Power CPU 上启用 IBM MASS可选IBM MASS 是一组面向 POWER 架构优化的数学函数库。OpenBLAS 的 MASS 支持要求 64 位小端little-endianPOWER 系统安装 MASS 库后编译时加USE_MASS1例如make USE_MASS1 TARGETPOWER8安装到指定目录默认安装目录是/opt/OpenBLAS。要安装到其他位置make install PREFIXyour_installation_directory并重复构建阶段的所有命令行参数。交叉编译交叉编译的通用规则是设置CC和FC指向交叉工具链使用 Make 时还需把HOSTCC设为本机 C 编译器并且必须显式指定TARGET。README 中给出的典型示例在 Linux 上交叉编译到较老的 MIPS64 路由器板make BINARY64 CCmipsisa64r6el-linux-gnuabi64-gcc FCmipsisa64r6el-linux-gnuabi64-gfortran HOSTCCgcc TARGETP6600交叉编译到 Windows x64 主机make CCi686-w64-mingw32-gcc -Bstatic FCi686-w64-mingw32-gfortran -static-libgfortran TARGETHASWELL BINARY32 CROSS1 NUM_THREADS20 CONSISTENT_FPCSR1 HOSTCCgcc几点实践要点为同一架构中较新的 CPU 目标如在 HASWELL 主机上编TARGETSKYLAKEX编译时加CROSS1可抑制构建末尾自动运行的测试更多平台的交叉编译命令Android/NDK、iOS、HarmonyOS、MIPS、RISC-V、Cortex-M 等详见 docs/install.md源码附带的 CI 脚本azure-pipelines.yml等也提供了大量可参考的构建命令在模拟器KVM/QEMU中构建时需确保虚拟机暴露的 CPU 特性组合与真实 CPU 一致否则 CPU 型号检测可能失败。支持的 CPU 与操作系统README 的“Supported CPUs and Operating Systems”一节列出了在 GotoBLAS2010 年已支持的老型号之外新增的 CPU 目标完整可用的TARGET列表含老型号以 TargetList.txt 为准覆盖 x86/x86_64、PowerPOWER4–POWER11、PPC970、CELL 等、MIPS/MIPS64、IA64、SPARC、ARMARMV5–ARMV7、ARM64CORTEXA53/57/72/76/510/710、NEOVERSEN1/V1/N2/V2、FALKOR、THUNDERX 系列、TSV110、A64FX、ARMV8SVE、ARMV9SME 等、System ZZ13/Z14、RISC-V 64RISCV64_GENERIC、RISCV64_ZVL128B/256B、C910V、x280、U74、LOONGARCH64LA64_GENERIC/LA264/LA464以及 WASMWASM128_GENERIC等。主要架构的优化特点摘自 READMEx86/x86-64Sandy Bridge 用 AVX 优化 Level-2/3Haswell 用 AVX2FMASkylake-X 用 AVX512FMACooper Lake 改进 BFLOAT16Sapphire Rapids 进一步改进 BFLOAT16 SBGEMM 内核AMD ZEN 系列分别借用 Haswell/SkylakeX/Cooperlake 代码ARM64Cortex-A57 及其同族A72/A73/A76/Falkor 等优化 Level-2/3ThunderX2T99 优化 Level-3 与部分 Level-1/2Neoverse V1 优化 Level-3A64FX 优化 Level-3PPC/PPC64POWER8/POWER9 仅支持 PPC64LE 且必须USE_OPENMP1POWER10 支持 SBGEMM 与部分 Level-1/2RISC-VC910V 使用 RVV 0.7.1 向量扩展优化 Level-3 与 Level-1/2x280 与 RISCV64_ZVL128B/256B 使用 RVV 1.0其中 ZVL 目标要求 GCC 14 及以上GCC 13 缺少__riscv_vsseg*分段访存内建函数相关例程会退化为标量路径LOONGARCH64LA64_GENERIC标量、LA264LSX、LA464LASX分别优化三级 BLAS旧式名称 LOONGSONGENERIC/LOONGSON2K1000/LOONGSON3R5 仍可用并自动映射到新名称。支持的操作系统包括 GNU/Linux、WindowsMinGW 或 Visual Studio/CMake、macOS/iOS含 ARM64、FreeBSD/OpenBSD/NetBSD/DragonFly BSD、Android、AIXPPC 至 POWER10、Haiku、SunOS、Cortex-M 等。单库多目标支持DYNAMIC_ARCH在 Makefile.rule 中设置DYNAMIC_ARCH1或命令行传入、CMake 用-DDYNAMIC_ARCHTRUE即可构建一个包含多个 CPU 目标、运行时自动检测并分派的库x86_64默认激活 Prescott、Core2、Nehalem、Barcelona、Sandybridge、Bulldozer、Piledriver、Steamroller、Excavator、Haswell、Zen、SkylakeX、Cooper Lake、Sapphire Rapids加DYNAMIC_OLDER1再补入 Penryn、Dunnington、Opteron、Opteron/SSE3、Bobcat、Atom、Nano也可用DYNAMIC_LIST自定义列表x86对应 Katmai、Coppermine、Northwood、Prescott、Banias、Core2、Penryn、Dunnington、Nehalem、Athlon、Opteron、Opteron_SSE3、Barcelona、Bobcat、Atom、NanoARMV8支持 CortexA53/57/72/73、Falkor、ThunderX、ThunderX2T99、TSV110 及通用 ARMV8编译时若编译器支持 SVE还会启用 NeoverseN2、NeoverseV1 与通用 ArmV8SVEPOWER覆盖 POWER6/POWER8/POWER9编译器够新时可加 POWER10ZARCH覆盖 Z13/Z14 与通用 zarchriscv64额外加入 zvl128b/zvl256b需要支持 RVV 1.0 的编译器LoongArch64覆盖 LA264/LA464 与通用目标。使用 DYNAMIC_ARCH 时TARGET通常应该同时指定用来决定库中公共代码按哪个 CPU 型号编译——一般设为预期遇到的最老型号。否则编译器可能仅因构建主机支持就用上高级指令导致库在较弱硬件上运行到公共代码时就因“非法指令”崩溃。另需注意无法在同一库中组合不同架构如 32 位与 64 位、x86_64 与 arm64 不能混在一个库里。使用 OpenBLAS链接方式编译产物为静态库libopenblas.a或共享库Linux 下为libopenblas.soWindows 下为libopenblas.dll及导入库libopenblas.dll.a。使用方法静态链接gcc -o test test.c /your/path/libopenblas.a -lpthread动态链接gcc -o test test.c -I/your_path/OpenBLAS/include/ -L/your_path/OpenBLAS/lib -Wl,-rpath,/your_path/OpenBLAS/lib -lopenblas。动态链接时若未把库所在目录加入ld.so搜索路径/etc/ld.so.conf、ldconfig或LD_LIBRARY_PATH运行时会出现cannot open shared object file: no such file or directory。根据构建选项可能还需追加链接参数多线程库加-lpthread含 LAPACK 时通常加-lgfortran可能还需要-lquadmath等如果只用 LAPACKE 的 C 接口#include lapacke.h并调用LAPACKE_dgeqrf这类函数则不需要-lgfortran。安装了 pkg-config 文件openblas.pc后可直接查询链接参数$ pkg-config --cflags openblas -I/usr/local/include $ pkg-config --libs openblas -L/usr/local/lib -lopenblas代码示例CBLAS 接口docs/user_manual.md 给出了完整的cblas_dgemm调用示例核心代码如下#include cblas.h #include stdio.h void main() { int i0; double A[6] {1.0,2.0,1.0,-3.0,4.0,-1.0}; double B[6] {1.0,2.0,1.0,-3.0,4.0,-1.0}; double C[9] {.5,.5,.5,.5,.5,.5,.5,.5,.5}; cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans,3,3,2,1,A, 3, B, 3,2,C,3); for(i0; i9; i) printf(%lf , C[i]); printf(\n); }编译命令gcc -o test_cblas_open test_cblas_dgemm.c -I/your_path/OpenBLAS/include/ -L/your_path/OpenBLAS/lib -lopenblas -lpthread -lgfortran。代码示例Fortran 接口也可从 C 中直接调用 Fortran 风格的dgemm_注意下划线后缀由 gcc/gfortran 的符号命名约定决定不同编译器可能不同因此跨平台时推荐 CBLASextern void dgemm_(char*, char*, int*, int*,int*, double*, double*, int*, double*, int*, double*, double*, int*); ... dgemm_(ta, tb, m, n, k, alpha, A, m, B, k, beta, C, m);编译命令gcc -o time_dgemm time_dgemm.c /your/path/libopenblas.a -lpthread运行时传入m n k三个维度参数。Java 调用注意事项JVM 默认栈大小只有 1MB对较大的矩阵规模可能不够遇到问题时用-Xss调大栈若 Windows 版 OpenBLAS 的 LAPACK 部分由 MinGW gfortran 编译Java 应用在 Win11/SBT/Play 环境下可能因 gfortran 运行时初始化与管道创建之间死锁而启动挂起可用-Djdk.consolejdk.internal.le规避。多线程控制通过环境变量设置线程数OpenBLAS 支持用环境变量限定最大线程数优先级从高到低export OPENBLAS_NUM_THREADS4 export GOTO_NUM_THREADS4 # 兼容旧名等价于 OPENBLAS_NUM_THREADS export OMP_NUM_THREADS4优先级为OPENBLAS_NUM_THREADSGOTO_NUM_THREADSOMP_NUM_THREADS。这一点可以从源码得到验证driver/others/openblas_env.c 中按此顺序依次读取这三个变量。注意如果以USE_OPENMP1编译则应设置OMP_NUM_THREADS此时 OpenBLAS 会忽略前两个变量因为它们会影响 OpenMP 运行时自身的线程数见 docs/runtime_variables.md 的说明。运行时环境变量还有OPENBLAS_DEFAULT_NUM_THREADS无论 OpenMP 还是 pthreads 构建都生效的线程数OPENBLAS_MAIN_FREE1禁用默认开启亲和性的构建中的 CPU 亲和自动分配OPENBLAS_THREAD_TIMEOUT空闲线程退出前的等待时长OMP_ADAPTIVE1OpenMP 构建中线程数减少时真正回收多余线程DYNAMIC_ARCH 构建还支持OPENBLAS_VERBOSE1 输出未精确匹配警告2 打印自动检测到的 CPU 名、OPENBLAS_CORETYPE覆盖自动检测如OPENBLAS_CORETYPEHASWELL、OPENBLAS_L2_SIZE虚拟环境中覆盖自动检测错误的 L2 缓存大小兼容性旧变量GOTOBLAS_MAIN_FREE、OPENBLAS_BLOCK_FACTOR对 GEMM 分块参数 P 施加比例因子见 driver/others/parameter.c。在运行时用 API 设置线程数OpenBLAS 提供两个运行时线程控制函数由 driver/others/openblas_set_num_threads.c 等实现声明于 exports.hvoid goto_set_num_threads(int num_threads); void openblas_set_num_threads(int num_threads);需要明确的是这两个函数只在库初始化时生效一次并不适合在单个 BLAS 调用级别做细粒度线程调节。相关工具函数还有openblas_get_num_threads、openblas_get_num_procs返回系统处理器数可能含超线程、openblas_get_parallel0 顺序执行 / 1 平台线程 / 2 OpenMP等详见 docs/extensions.md。线程池的初始化逻辑位于 driver/others/blas_server.c当请求的线程数超过实际可用资源时会给出提示如 “or set a smaller OPENBLAS_NUM_THREADS”。多线程构建相关选项NUM_THREADS编译期定义支持的最大线程数不指定时由构建系统自动检测。注意包维护者可用较大值如 32–256但因内部结构按此值分配内存即使运行时用不满线程也会带来内存开销GEMM_MULTITHREAD_THRESHOLD默认 4当 GEMM 的 m/n/k 任一维度小于该阈值时单线程执行近期版本实际是按问题规模的浮点运算量比例计算用于避免小矩阵的多线程开销NO_AFFINITY1OpenBLAS 默认不设置处理器亲和性README 与 Makefile.rule 均明确说明在 Linux 上注释掉该行可启用亲和性这有助于 NUMA 系统性能但可能与同样管理亲和性的应用如 R 的 parallel冲突BIGNUMA1支持核数大于 256 或 NUMA 节点大于 16 的机器Linux x86_64 下实验性支持至 1024 核/128 节点USE_LOCKING1构建单线程库但预期被程序内多个并发线程调用时用于保证线程安全USE_THREAD1时自动开启USE_OPENMP1时通常不需要。故障排查要点README 的 Troubleshooting 一节与 docs/user_manual.md 给出的常见问题及对策编译 Sandy Bridge AVX 内核需GCC 4.6Linux/MinGW/BSDClang 编译 Sandy Bridge 微架构需3.1Clang 3.0 会生成错误的 AVX 二进制Skylake/CooperLake 的 AVX512 内核需GCC 6 或 LLVM 6使用新的 flang Fortran 编译器需LLVM 18Windows 上 19POWER 架构需GCC 11默认支持 CPU/核心数 ≤ 256超大规模场景用BIGNUMA1OpenBLAS 默认不设处理器亲和性启用方式见上文启用后可能造成与 R parallel 的冲突在 Loongson 3A 上make test可能报pthread_create的EAGAIN错误但在 shell 中直接运行同一测试用例则正常构建时确保使用了足够新、足以支持目标 CPU 特性的编译器这是绝大多数“非法指令”类崩溃的根源。结语与延伸阅读本文从 README 出发完整覆盖了 OpenBLAS 的获取、编译、交叉编译、目标选择、多线程控制与链接使用。如需进一步深入可继续阅读仓库内以下文档docs/install.md各平台Windows/Visual Studio、MinGW、Android、iOS、HarmonyOS、MIPS、RISC-V、FreeBSD、Cortex-M的详细构建步骤与导入库生成docs/user_manual.md编译、链接与 CBLAS/Fortran 接口完整代码示例docs/runtime_variables.md全部运行时环境变量及其优先级docs/extensions.mdOpenBLAS 非标准扩展 API批处理 GEMM、bf16/fp16、线程工具函数docs/faq.md 与 Changelog.txt常见问题与版本变更记录。实际动手时建议先在目标机器上运行不带参数的make观察自动检测结果再根据上文的选项表定制构建最后用make install PREFIX...将库安装到便于链接的位置即可在自己的项目中稳定使用 OpenBLAS。赞分享高性能计算科学计算【免费下载链接】OpenBLASOpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.项目地址https://gitcode.com/gh_mirrors/op/OpenBLAS点击查看免费下载相关推荐解决Windows多线程下OpenBLAS的sgemm调用异常从编译到调优全指南解决Windows多线程下OpenBLAS的sgemm调用异常从编译到调优全指南 问题背景Windows平台的线程安全挑战 你是否在Windows系统中遇到高性能计算科学计算COLMAP 安装与源码构建完全指南从预编译二进制到跨平台编译、库链接与 PyCOLMAPCOLMAP 安装与源码构建完全指南从预编译二进制到跨平台编译、库链接与 PyCOLMAP COLMAP 是通用的 Structure from Motion计算机视觉图形学图像处理psutil 安装完全指南从预编译 Wheel 到多平台源码构建psutil 安装完全指南从预编译 Wheel 到多平台源码构建 psutil 是跨平台的进程与系统监控库其安装方式因平台而异Linux、Windows、可观测性系统编程上一篇Sebastian/Environment终极指南如何为PHP项目贡献专业文档下一篇深度解析DeepPavlov组件化架构构建智能AI系统的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
