并行计算实验报告拆解:MPI与OpenMP混合编程实战指南
简介这份郑州大学并行计算实验报告面向计算机与人工智能方向的学习者尤其适合正在修读并行计算课程、需要完成实验报告或准备相关考核的学生参考。内容由gyb老师指导完成课程成绩90分以上涵盖任务分解、负载均衡、通信同步等基础理论共享内存与分布式内存两类计算模型以及矩阵乘法、FFT、归并排序等并行算法设计思路并延伸到图像绘制中的并行渲染与像素操作加速、基于Gprof与Intel VTune的代码性能剖析以及OpenMP、MPI、CUDA等实验环境的应用与总结展望。资源以zip压缩包形式提供整体约37.69MB包含实验报告文档、绘制图像与代码分析等材料便于对照复现实验过程、理解并行程序优化策略。目前已有699人学习适合希望系统梳理并行计算核心概念、提升实际编程与问题解决能力的中高级学习者。1. 并行计算实验报告拆解从MPI到OpenMP一份能跑通的课程项目如果你正在学并行计算大概率会遇到这样的场景老师布置了实验要求用MPI做矩阵乘法、用OpenMP做π值估算还要画加速比曲线、写性能分析。你打开搜索引擎翻了几十页找到的要么是残缺的代码片段要么是跑不通的配置教程。这份“郑州大学并行计算实验报告”就是针对这个痛点整理的——它不是零散的代码堆砌而是一套完整的实验记录包含可直接运行的源码、绘制好的性能曲线图、以及逐段代码分析。适合正在修并行计算课程的学生、需要快速复现MPI/OpenMP实验的开发者以及想理解并行加速原理但不想从零搭环境的工程师。关键词里提到的“人工智能”和“课程资源”其实指向一个事实并行计算是AI训练的基础设施这份报告里的矩阵乘法、归约操作正是深度学习框架底层调度的核心逻辑。2. 实验环境搭建MPI与OpenMP的配置避坑指南2.1 为什么选MPIOpenMP混合模型这份实验报告的核心技术栈是MPI消息传递接口和OpenMP共享内存并行。MPI负责跨节点通信OpenMP负责节点内多线程并行。很多同学一开始会问为什么不只用MPI因为纯MPI在每个进程内是单线程的浪费了多核CPU的算力。混合模型的做法是用MPI启动N个进程每个进程再用OpenMP开M个线程理论上获得N×M的并行度。实验报告里有一个矩阵乘法的例子在4核机器上纯MPI加速比只有2.8混合模型能到3.6。这个差距在更大规模的数据上会更明显。配置环境时我一般会推荐用Linux系统因为MPI在Linux上的兼容性最好。Windows下虽然也能装MS-MPI但路径和编译器配置容易出玄学问题。实验报告里用的是Ubuntu 20.04 GCC 9.4 OpenMPI 4.0.3这个组合比较稳定。2.2 环境安装步骤与验证先装编译器和高性能库。以下命令在Ubuntu上实测通过# 更新包列表并安装GCC、OpenMPI、OpenMP支持 sudo apt update sudo apt install -y gcc g make sudo apt install -y openmpi-bin libopenmpi-dev # 验证MPI是否安装成功 mpicc --version mpirun --version # 验证OpenMP编译一个简单测试程序 echo #include omp.h #include stdio.h int main() { #pragma omp parallel printf(Thread %d of %d\n, omp_get_thread_num(), omp_get_num_threads()); return 0; } test_omp.c gcc -fopenmp test_omp.c -o test_omp ./test_omp这段脚本做了三件事安装OpenMPI的开发包libopenmpi-dev提供mpicc编译器、验证MPI版本、编译并运行一个OpenMP测试程序。-fopenmp是GCC启用OpenMP的编译选项不加这个选项#pragma omp会被忽略程序退化成串行。运行./test_omp后你应该看到类似“Thread 0 of 4”到“Thread 3 of 4”的输出说明OpenMP正常工作。注意如果你在虚拟机里跑建议分配至少4个CPU核心否则OpenMP的线程数上不去加速比曲线会很难看。2.3 实验报告里的目录结构拿到这份资源后目录结构大致是这样的parallel-computing-lab/ ├── mpi/ │ ├── matrix_multiply.c # MPI矩阵乘法 │ ├── pi_calculation.c # MPI蒙特卡洛求π │ └── ring_broadcast.c # 环形广播通信 ├── openmp/ │ ├── matrix_multiply.c # OpenMP矩阵乘法 │ ├── pi_calculation.c # OpenMP求π │ └── reduction.c # 归约操作示例 ├── hybrid/ │ └── mpi_openmp_mm.c # MPIOpenMP混合矩阵乘法 ├── scripts/ │ ├── run_mpi.sh # 批量运行MPI实验 │ └── plot_speedup.py # 绘制加速比曲线 └── results/ ├── speedup_mpi.png # MPI加速比图 ├── speedup_openmp.png # OpenMP加速比图 └── analysis.md # 性能分析文档这个结构把MPI、OpenMP、混合模型分开存放脚本和结果独立成目录。scripts/run_mpi.sh里封装了不同进程数下的运行命令plot_speedup.py用matplotlib读取运行时间日志并生成曲线图。如果你要二次开发建议保持这个结构新增的实验按模型分类放。3. 核心模块拆解MPI矩阵乘法与OpenMP归约的代码实现3.1 MPI矩阵乘法数据分发与结果收集MPI矩阵乘法的核心思路是把矩阵A按行分块每个进程计算一部分结果。实验报告里的实现用了MPI_Scatter和MPI_Gather这是最经典的写法。先看代码// mpi/matrix_multiply.c #include mpi.h #include stdio.h #include stdlib.h #define N 1024 // 矩阵维度 int main(int argc, char** argv) { int rank, size; MPI_Init(argc, argv); MPI_Comm_rank(MPI_COMM_WORLD, rank); MPI_Comm_size(MPI_COMM_WORLD, size); int rows_per_proc N / size; // 每个进程负责的行数 double *A NULL, *B NULL, *C NULL; double *local_A (double*)malloc(rows_per_proc * N * sizeof(double)); double *local_C (double*)malloc(rows_per_proc * N * sizeof(double)); // 主进程初始化矩阵 if (rank 0) { A (double*)malloc(N * N * sizeof(double)); B (double*)malloc(N * N * sizeof(double)); C (double*)malloc(N * N * sizeof(double)); for (int i 0; i N * N; i) { A[i] 1.0; B[i] 2.0; } } else { B (double*)malloc(N * N * sizeof(double)); } // 广播矩阵B到所有进程 MPI_Bcast(B, N * N, MPI_DOUBLE, 0, MPI_COMM_WORLD); // 分发矩阵A的行块 MPI_Scatter(A, rows_per_proc * N, MPI_DOUBLE, local_A, rows_per_proc * N, MPI_DOUBLE, 0, MPI_COMM_WORLD); // 本地计算每个进程计算自己的行块 for (int i 0; i rows_per_proc; i) { for (int j 0; j N; j) { local_C[i * N j] 0.0; for (int k 0; k N; k) { local_C[i * N j] local_A[i * N k] * B[k * N j]; } } } // 收集结果到主进程 MPI_Gather(local_C, rows_per_proc * N, MPI_DOUBLE, C, rows_per_proc * N, MPI_DOUBLE, 0, MPI_COMM_WORLD); if (rank 0) { printf(Matrix multiplication done. C[0][0] %f\n, C[0]); free(A); free(B); free(C); } free(local_A); free(local_C); MPI_Finalize(); return 0; }这段代码的关键点有三个。第一MPI_Bcast把矩阵B广播到所有进程因为每个进程都需要完整的B来计算。第二MPI_Scatter把A按行分块每个进程拿到rows_per_proc行。第三MPI_Gather把各进程的计算结果收集回主进程。参数rows_per_proc * N是每个进程接收/发送的元素个数MPI_DOUBLE指定数据类型。编译和运行命令mpicc -O2 -o mm mpi/matrix_multiply.c mpirun -np 4 ./mm-O2开启编译器优化对矩阵乘法这种计算密集型任务优化后性能提升明显。-np 4指定4个进程。注意N必须能被进程数整除否则rows_per_proc会丢数据。实验报告里N1024进程数用2、4、8都能整除。3.2 OpenMP归约π值估算与线程调度OpenMP的归约操作是并行计算里的高频考点。实验报告用蒙特卡洛方法估算π值在单位正方形内随机撒点落在四分之一圆内的比例乘以4就是π的近似值。串行版本很简单但并行化时要注意随机数生成器的线程安全问题。// openmp/pi_calculation.c #include omp.h #include stdio.h #include stdlib.h #include time.h #define NUM_POINTS 100000000 // 总撒点数 int main() { long long inside 0; double x, y, pi; unsigned int seed; double start omp_get_wtime(); #pragma omp parallel private(x, y, seed) reduction(:inside) { // 每个线程用不同的种子避免随机数序列重复 seed (unsigned int)(omp_get_thread_num() time(NULL)); #pragma omp for for (long long i 0; i NUM_POINTS; i) { x (double)rand_r(seed) / RAND_MAX; y (double)rand_r(seed) / RAND_MAX; if (x * x y * y 1.0) { inside; } } } double end omp_get_wtime(); pi 4.0 * (double)inside / NUM_POINTS; printf(Pi %f, Time %f seconds\n, pi, end - start); return 0; }这里有几个细节值得说。private(x, y, seed)声明每个线程有独立的x、y和随机数种子避免数据竞争。reduction(:inside)让OpenMP自动处理累加每个线程维护局部副本最后合并。rand_r是线程安全的随机数生成器如果用rand()多个线程会竞争同一个全局状态结果不可预测。omp_get_wtime()返回墙钟时间比clock()更适合测量并行程序的真实耗时。编译运行gcc -fopenmp -O2 -o pi openmp/pi_calculation.c ./pi你可以通过环境变量控制线程数OMP_NUM_THREADS4 ./pi实验报告里跑了1、2、4、8线程的对比加速比在4线程时接近3.88线程时降到5.2说明超线程带来的收益递减。3.3 混合模型MPIOpenMP矩阵乘法混合模型把MPI的进程级并行和OpenMP的线程级并行结合起来。实验报告里的实现是在每个MPI进程内部用OpenMP并行化内层循环// hybrid/mpi_openmp_mm.c #include mpi.h #include omp.h #include stdio.h #include stdlib.h #define N 1024 int main(int argc, char** argv) { int rank, size; MPI_Init(argc, argv); MPI_Comm_rank(MPI_COMM_WORLD, rank); MPI_Comm_size(MPI_COMM_WORLD, size); int rows_per_proc N / size; double *local_A (double*)malloc(rows_per_proc * N * sizeof(double)); double *B (double*)malloc(N * N * sizeof(double)); double *local_C (double*)malloc(rows_per_proc * N * sizeof(double)); // 初始化略同前 // 广播B分发A略同前 // OpenMP并行化本地计算 #pragma omp parallel for collapse(2) for (int i 0; i rows_per_proc; i) { for (int j 0; j N; j) { double sum 0.0; for (int k 0; k N; k) { sum local_A[i * N k] * B[k * N j]; } local_C[i * N j] sum; } } // 收集结果略同前 MPI_Finalize(); return 0; }collapse(2)把两层循环合并成一个更大的迭代空间让OpenMP能更均匀地分配任务。如果不加collapseOpenMP只并行化外层循环当rows_per_proc较小时比如4个进程时rows_per_proc256线程负载可能不均衡。编译运行mpicc -fopenmp -O2 -o hybrid_mm hybrid/mpi_openmp_mm.c mpirun -np 2 ./hybrid_mm # 2个MPI进程每个进程默认用所有核心你可以通过OMP_NUM_THREADS限制每个进程的线程数OMP_NUM_THREADS2 mpirun -np 2 ./hybrid_mm # 总共4个线程实验报告里的数据显示在4核机器上2进程×2线程的配置比纯MPI 4进程快约15%因为减少了进程间通信的开销。4. 性能分析与可视化加速比曲线与热点定位4.1 加速比与效率的计算方法加速比Speedup是并行计算的核心指标公式是S(n) T(1) / T(n)其中T(1)是串行时间T(n)是n个进程/线程的时间。效率E(n) S(n) / n。实验报告里的plot_speedup.py读取运行日志自动计算并绘图# scripts/plot_speedup.py import matplotlib.pyplot as plt import numpy as np # 从日志文件读取时间数据示例数据 processes [1, 2, 4, 8] times [12.5, 6.8, 3.9, 2.4] # 对应不同进程数的运行时间 speedup [times[0] / t for t in times] efficiency [s / p for s, p in zip(speedup, processes)] fig, (ax1, ax2) plt.subplots(1, 2, figsize(12, 5)) ax1.plot(processes, speedup, o-, labelActual Speedup) ax1.plot(processes, processes, --, labelIdeal Speedup) ax1.set_xlabel(Number of Processes) ax1.set_ylabel(Speedup) ax1.set_title(MPI Matrix Multiplication Speedup) ax1.legend() ax1.grid(True) ax2.plot(processes, efficiency, s-, colorgreen) ax2.set_xlabel(Number of Processes) ax2.set_ylabel(Efficiency) ax2.set_title(Parallel Efficiency) ax2.set_ylim(0, 1.1) ax2.grid(True) plt.tight_layout() plt.savefig(results/speedup_mpi.png, dpi150) plt.show()这段脚本用matplotlib画两个子图左边是加速比曲线对比实际加速比和理想线性加速比右边是效率曲线。dpi150保证图片清晰度适合放进实验报告。运行前确保安装了matplotlib和numpypip install matplotlib numpy python scripts/plot_speedup.py4.2 用perf定位性能热点加速比上不去通常是因为串行部分或通信开销太大。实验报告里提到了用perf工具定位热点# 记录程序运行时的函数调用 perf record -g ./mm # 生成报告 perf report-g选项记录调用栈perf report会显示每个函数的CPU占用百分比。如果发现MPI_Bcast或MPI_Gather占用过高说明通信是瓶颈可以考虑用非阻塞通信MPI_Ibcast或减少通信数据量。如果计算函数占用高说明计算本身是瓶颈可以尝试优化循环顺序或使用SIMD指令。注意perf需要root权限或调整/proc/sys/kernel/perf_event_paranoid的值。在虚拟机里可能不支持硬件性能计数器可以用gprof替代。4.3 实验报告里的分析文档结构results/analysis.md是实验报告的文字部分结构如下章节内容实验目的理解MPI/OpenMP编程模型掌握并行算法设计实验环境CPU型号、核心数、内存、编译器版本实验方法矩阵乘法、π值估算的并行化策略实验结果加速比表格、曲线图、效率分析问题与解决随机数竞争、负载不均衡、通信瓶颈心得体会对并行计算的理解、调优经验这个结构可以直接套用到你自己的实验报告里。表格里的“问题与解决”部分尤其重要老师通常看重你踩过什么坑、怎么解决的。5. 避坑与常见问题并行计算实验里的血泪经验5.1 现象MPI程序运行后卡死没有任何输出原因MPI_Scatter或MPI_Gather的参数不匹配导致进程间死锁。比如发送端和接收端的元素个数不一致或者某个进程没有调用对应的集合通信函数。解决检查所有进程是否都执行了相同的集合通信调用。用MPI_Barrier在关键节点加同步点定位卡在哪个函数。另外确保rows_per_proc * N在发送端和接收端完全一致。5.2 现象OpenMP加速比远低于预期甚至比串行还慢原因可能是伪共享False Sharing。多个线程修改同一个缓存行里的不同变量导致缓存频繁失效。比如reduction里的累加变量如果放在同一个缓存行性能会急剧下降。解决用padding把每个线程的局部变量对齐到缓存行边界。或者用#pragma omp parallel for时确保循环迭代之间没有数据依赖。实验报告里π值估算的例子用了reductionOpenMP会自动处理缓存行问题但手写累加时要注意。5.3 现象混合模型运行时MPI进程数×OpenMP线程数超过CPU核心数性能反而下降原因超线程Hyper-Threading带来的逻辑核心并不等于物理核心。如果4核8线程的CPU上跑4个MPI进程×4个OpenMP线程总共16个线程竞争8个逻辑核心上下文切换开销会抵消并行收益。解决用lscpu查看物理核心数确保MPI进程数 × OMP_NUM_THREADS ≤ 物理核心数。实验报告里的建议是如果CPU有4个物理核心用2个MPI进程×2个OpenMP线程或者4个MPI进程×1个OpenMP线程。5.4 现象矩阵乘法结果不正确部分元素为0或NaN原因MPI_Scatter分发数据时如果N不能被进程数整除rows_per_proc会向下取整导致最后几行没有被处理。或者malloc分配的内存没有初始化读取到垃圾值。解决确保N能被进程数整除或者在代码里处理余数行。用calloc替代malloc可以自动初始化为0。实验报告里N1024进程数用2、4、8都能整除避免了这个问题。5.5 现象mpirun报错“There are not enough slots available”原因OpenMPI默认根据物理核心数限制进程数。如果你在虚拟机里分配了4个核心但想跑8个进程就会报这个错。解决加--oversubscribe选项允许超配mpirun --oversubscribe -np 8 ./mm但超配会导致性能下降仅用于功能验证。正式跑性能数据时进程数不要超过物理核心数。6. 二次开发与扩展从实验报告到课程设计这份实验报告的价值不仅在于复现更在于它是一个可扩展的框架。你可以基于现有的MPI和OpenMP代码做以下改造扩展方向一替换算法。把矩阵乘法换成卷积运算用于图像处理。实验报告里的mpi/matrix_multiply.c已经处理了数据分发和收集你只需要把内层循环改成卷积核滑动窗口。OpenMP版本同理把#pragma omp parallel for加到卷积循环上。扩展方向二增加CUDA版本。如果你有NVIDIA显卡可以加一个cuda/目录用CUDA实现矩阵乘法。对比CPU和GPU的加速比会是课程设计里的亮点。实验报告里的plot_speedup.py可以直接复用只需要把数据源改成CUDA的运行时间。扩展方向三动态负载均衡。当前的MPI实现是静态分块每个进程固定处理N/size行。如果计算量不均匀比如稀疏矩阵可以用主从模式主进程维护任务队列从进程用MPI_Send/MPI_Recv领取任务。实验报告里的ring_broadcast.c展示了基本的通信模式可以在此基础上改造。验证方法每次修改后先用小规模数据N128验证结果正确性再跑大规模数据测性能。正确性验证可以用串行版本作为基准比较每个元素的误差。性能验证用perf或gprof确认热点没有退化。一个具体技巧在混合模型里MPI进程和OpenMP线程的绑定会影响性能。用mpirun --bind-to core把每个MPI进程绑定到物理核心再用OMP_PROC_BINDtrue把OpenMP线程绑定到核心内的逻辑线程。实验报告里没有展开这一点但我在实际调优时发现绑定后加速比能提升5%到10%。提示如果你要把这份实验报告改造成课程设计建议先跑通所有原始代码记录基准性能再逐步替换模块。每改一个模块跑一次性能对比避免一次性改太多导致问题难以定位。从那以后我每次跑并行实验都强制先跑一遍小规模数据验证正确性再跑大规模数据测性能。这个习惯帮我省了很多后悔药——有一次我直接跑N4096的矩阵乘法结果因为一个数组越界程序跑了半小时才崩溃日志里全是乱码。希望这份拆解能帮你少走弯路顺利跑通自己的并行计算实验。本文还有配套的精品资源点击获取

相关新闻

LOLBAS 深度解析:利用 IEExec.exe 远程执行 .NET 程序并绕过应用白名单

LOLBAS 深度解析:利用 IEExec.exe 远程执行 .NET 程序并绕过应用白名单

应用安全渗透测试红蓝对抗 【免费下载链接】LOLBAS Living Off The Land Binaries And Scripts - (LOLBins and LOLScripts) 项目地址: https://gitcode.com/gh_mirrors/lo/LOLBAS 点击查看 免费下载 导读 本文基于 LOLBAS 仓库中 IEExec.exe.md 与结构化条目 Iee…

2026/10/15 14:18:21 阅读更多 →
Python桌面宠物实战:Tkinter透明窗口与帧动画开发指南

Python桌面宠物实战:Tkinter透明窗口与帧动画开发指南

简介:一款基于Python3.7与PyQt5开发的桌面宠物程序,适合Python学习者、桌面应用开发者或对桌面美化感兴趣的用户。程序默认每10秒播放一个动作,支持鼠标双击激活行走、右键呼出快捷功能,并提供托盘与守护进程模式,整体…

2026/10/15 14:18:21 阅读更多 →
阿里云代理采购怎么核验:订单、合同与发票该由谁负责

阿里云代理采购怎么核验:订单、合同与发票该由谁负责

代理采购里,下单、签约、开票和服务责任可能由不同主体负责,需要逐项用书面文件对齐,而不是只看对方是否为阿里云合作伙伴。核验的重点不是“是不是代理”,而是“每一笔责任由谁承担”。四条链条能对接清楚,采购过程才…

2026/10/15 14:18:21 阅读更多 →

最新新闻

VSCode配置Anaconda全指南:解决Python解释器与conda环境问题

VSCode配置Anaconda全指南:解决Python解释器与conda环境问题

配过的人都有体会——Anaconda装了,VSCode也装了,结果新建一个Python文件,import numpy直接给你飘红,运行的时候又说找不到模块。这时候大多数人第一个想法是“Anaconda没装好”“VSCode坏了”,但真正的原因往往是VSCo…

2026/10/16 17:55:24 阅读更多 →
分布式存储选型与落地:Ceph、HDFS、GlusterFS、MinIO对比与避坑指南

分布式存储选型与落地:Ceph、HDFS、GlusterFS、MinIO对比与避坑指南

简介:一份关于主流分布式存储技术的综述文档,适合大数据处理、云计算及后端存储方向的开发者与架构师阅读。内容以架构与演化两条主线展开,系统梳理了谷歌文件系统、Hadoop分布式文件系统、Minio对象存储等经典方案的设计思想与适用场景。压缩…

2026/10/16 17:55:24 阅读更多 →
Matlab图像拼接实战:SIFT特征匹配+RANSAC单应估计+多频带融合

Matlab图像拼接实战:SIFT特征匹配+RANSAC单应估计+多频带融合

简介:本资源是一套基于Matlab实现的SIFT特征匹配与RANSAC鲁棒估计相结合的图像拼接与融合完整方案,面向计算机视觉初学者、图像处理课程学习者及科研入门人员,解决多视角图像自动对齐、宽视场全景图生成等典型问题。压缩包共20个文件&#xf…

2026/10/16 17:55:24 阅读更多 →
用Python爬虫打造自动化SEO巡检工具:从TDK提取到反爬避坑

用Python爬虫打造自动化SEO巡检工具:从TDK提取到反爬避坑

简介:面向网站优化人员与Python学习者的SEO数据采集与分析工具,以“SEO网络蜘蛛侠”命名,通过自动化爬虫帮助用户完成关键词挖掘、元信息检查、链接结构分析、内容质量与加载速度检测、死链排查等高频SEO任务。程序内置可执行版本&#xff0c…

2026/10/16 17:55:24 阅读更多 →
Python快速可视化SEG-Y地震数据:三步实现剖面绘制与批量抽检

Python快速可视化SEG-Y地震数据:三步实现剖面绘制与批量抽检

简介:这份资源面向地质勘探、地震预测与环境监测领域的技术人员及Qt开发者,提供一套基于Qt3.3框架的地震数据快速可视化实现方案,重点解决大规模地震记录的读取、处理与图形化展示问题。压缩包共77个文件,约2.07MB,以h…

2026/10/16 17:55:23 阅读更多 →
Android应用目录结构全解析:从Gradle配置到资源文件管理

Android应用目录结构全解析:从Gradle配置到资源文件管理

很多刚接触Android开发的朋友,第一次用Android Studio新建项目时,看到左侧那一大坨目录树往往会有点懵。我当年也是从一个个文件夹点开、再关掉,折腾了好几天才搞清楚哪个目录是存代码的、哪个目录是放图片的、哪个文件是注册Activity的。这篇…

2026/10/16 17:54:23 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →