新闻详情

新闻详情

首页 / 资讯中心 / 详情

90+并行计算实验报告:MPI与OpenMP性能分析全流程

发布时间:2026/9/25 5:00:44来源:尧图网络
90+并行计算实验报告:MPI与OpenMP性能分析全流程
简介来自郑州大学计算机与人工智能学院的并行计算实验报告由gyb老师指导作者取得了90的优异成绩。内容覆盖并行计算基础理论、共享/分布式内存模型、矩阵乘法与FFT等并行算法设计并重点展示了图像绘制与代码分析两大实践模块前者介绍如何利用并行计算加速像素操作与图像渲染后者说明使用Gprof、Intel VTune等工具识别性能瓶颈、评估并行度的方法可帮助计算机相关专业学生系统掌握任务分解、负载均衡与性能优化等核心技能。压缩包整体约37.69MB适合作为课程设计参考、期末复习或自学并行计算的配套资料报告中包含实验环境配置、完整思路与结果分析便于复现和对照改进。已有698人学习下载是学习并行计算理论与实践的优质素材。1. 并行计算实验报告 90不是抄的模板是一套能复现的完整路径郑州大学并行计算这门课就是把人工智能训练和大规模科学计算背后的多核加速逻辑压缩成几次能亲手跑完的实验。多数人的真实状态是原理听懂了MPI 和 OpenMP 能写几行但实验报告不知怎么组织绘制图像不知道要画哪几张代码分析写出来全是这行代码给变量赋了值级别的废话。我拆完这份 90 的实验报告后确认它不是普通意义上的模板而是把每个实验的代码分析、绘制图像、结果讨论按打分点排好的一条完整路径。你拿到的不只是几页 PDF而是实验考什么、图长什么样、分析从哪个角度写才够分的参考答案。适合马上要交报告、想把实验跑通再改写的学生也适合拿它系统复习并行计算考点的人。2. 拆开报告包文件结构、环境搭建与 90 的写作骨架2.1 资源包里有什么一份报告对应一个技术点下载解压之后先别急着打开 docx建议按源码 → output 目录 → 报告正文的顺序看。这份资源按实验项拆分每个实验一个独立目录目录里放的是报告全文、可直接编译的源码和运行结果。并行计算课程设计覆盖的点基本固定这套报告对应的是四类最常考的实验蒙特卡洛估计 π 验证 OpenMP 线程级并行并行矩阵乘法验证 MPI 进程级通信奇偶交换排序验证邻居通信与归并最后单独一个性能分析实验把前三组实验的数据汇总画图。用表格列一下拆包时看到的文件组织目录实验内容涉及技术点lab1_monte_carlo蒙特卡洛法估计 πOpenMP、reduction 归约、线程安全随机数lab2_matmul_mpi并行矩阵乘法MPI_Bcast、MPI_Gather、行分块lab3_odd_even_sort奇偶交换排序MPI_Sendrecv、邻居通信、归并lab4_perf_analysis性能汇总与分析加速比、效率、Amdahl 定律为什么要 OpenMP 和 MPI 两种都写因为这门课考察的是两个层次的并行OpenMP 面向单机多核的共享内存模型改造成本低适合细粒度并行MPI 面向多节点的分布式内存模型进程间靠消息通信能体现通信开销对加速比的真实影响。报告把两类实验都覆盖到老师就能确认你不是只会套一个框架。每个实验目录下的 report 文件是报告正文里面嵌着代码和图像output 目录里是结果图和记录数据的 CSV。我的建议是先把源码编译跑通拿到一套自己的运行数据再回头对照报告里怎么分析、怎么画图这样才算真正用了这份资源而不是抄了它。2.2 环境准备一台 4 核机器就能跑完全部实验常见做法是直接用实验室的集群节点但自己一台 4 核 8 线程的笔记本完全够跑。需要装的东西只有三样MPI 实现MPICH 或 OpenMPI 二选一、GCC 编译器、Python 的 matplotlib。Windows 用户建议装 WSL 再跑这套环境纯 Windows 下编译 MPI 不是不行但 mpich 的安装路径和环境变量配置会额外浪费半小时。下面是 Ubuntu 系机器上的安装命令。sudo apt update sudo apt install -y gcc g mpich python3-pip pip3 install matplotlib numpy mpiexec --version # 验证 MPI 安装 gcc --version # 验证编译器这段命令的逻辑很直接mpich 包提供 mpiexec 运行器和 mpi.h 头文件编译 MPI 程序用 mpicc 包装器它会自动把 MPI 库链进去不需要手动写 -lmpi。OpenMP 不用额外装GCC 内置支持编译时加 -fopenmp 就能用这也是这套环境里唯一需要单独记的编译参数。参数说明-O2 优化必须开不开的话串行基线时间虚高后面算出来的加速比会整体偏大结论失真。另一个细节是 -fopenmp 在编译和链接两个阶段都要出现只加编译阶段会在链接时提示找不到 omp_* 符号。如果你用的是 OpenMPI 而不是 MPICH安装包名换成 openmpi-bin运行命令同样是 mpiexec只是当系统核心数不够时会要求加 --oversubscribe 参数。这个区别在报告里提一句能显得你确实自己搭过环境而不是照抄别人。2.3 报告骨架六个板块对应老师的打分点90 分以上和 80 分的差别几乎都体现在报告结构上。这套报告按六个板块组织基本就是评分表的分项板块内容要点参考占比实验目的一句话说清楚要验证什么结论5%实验原理算法描述、并行化策略、复杂度分析20%关键代码与代码分析核心代码片段加逐段分析30%实验结果时间表格、绘制图像时间曲线、加速比、效率20%结果分析和理论值对比指出瓶颈和原因20%实验结论本次实验得到的明确结论5%最关键的是关键代码与代码分析这块。报告里对每段核心代码的分析都不是复述代码干了什么而是回答四个问题这段代码对应算法里的哪一步并行化之后引入了多少额外通信或同步开销复杂度从多少变成多少如果删掉某个优化会怎样。比如对一行 reduction 子句分析重点不是这行把 count 累加起来而是reduction 在编译期为每个线程生成私有副本循环结束后再做归约避免了对同一变量的竞争写。另一个容易被忽略的点报告里所有图像必须和表格数据同源。先有运行数据表格再用脚本画图图和表来自同一批 CSV而不是图是一张、表是另一张。这个习惯决定报告能不能经受住老师追问后面避坑章节我会专门展开讲怎么落地。3. 三个核心实验拆开讲代码分析怎么做、图像怎么画3.1 蒙特卡洛估计 πOpenMP 归约与线程安全随机数蒙特卡洛估计 π 是并行计算实验的经典开胃菜。原理是向单位正方形内随机投点落在单位圆内的概率是 π/4统计投进圆内的点数占比再乘 4 就是 π 的估计值。串行版本谁都会写这道题真正考察的是两个坑rand() 不是线程安全的多线程同时调用会抢同一片全局状态count 累加变量如果多线程直接 会出现竞争写导致结果不准。#include stdio.h #include stdlib.h #include omp.h int main(int argc, char **argv) { long total 100000000; /* 投点总数越大结果越稳 */ int num_threads 4; long count 0; double start omp_get_wtime(); #pragma omp parallel num_threads(num_threads) reduction(:count) { unsigned int seed omp_get_thread_num() 1; /* 每线程独立种子 */ long local 0; #pragma omp for for (long i 0; i total; i) { double x (double)rand_r(seed) / RAND_MAX; double y (double)rand_r(seed) / RAND_MAX; if (x * x y * y 1.0) local; } count local; } double pi 4.0 * (double)count / total; printf(pi%.6f threads%d time%.4fs\n, pi, num_threads, omp_get_wtime() - start); return 0; }代码分析部分可以这样写reduction(:count) 让编译器为每个线程生成 count 的私有副本线程各自累加 local最后按加法归约合并把竞争写变成了确定性的归约操作rand_r 接收 seed 的指针每线程用自己的种子互不干扰这是 rand() 线程安全版本的替代写法local 变量的作用是把归约次数从 total 次降到每个线程一次避免每次循环都触发归约开销。这几个点写进报告分析深度立刻和贴代码加两行注释拉开差距。参数说明total 取 10^8 时误差在 1/sqrt(total) 量级约 1e-4足够出报告num_threads 从 1 到物理核心数都要测线程数为 1 的结果就是串行基线。实用习惯是每个线程数跑三遍取中位数因为同一台机器上第一遍运行通常偏慢取中位数能让加速比曲线干净很多。这些运行数据记进 CSV就是 3.4 节画图的输入。3.2 并行矩阵乘法MPI 广播、行分块与 Gather矩阵乘法是所有 MPI 实验的骨架。串行三层循环复杂度 O(N^3)并行化思路是按行分块0 号进程把 A 和 B 广播给所有进程每个进程只算自己负责的那若干行最后用 MPI_Gather 把结果收回来。整体是一个广播-计算-收集的经典三段式中间没有任何跨进程通信属于任务并行里最舒服的一种形态。#include mpi.h #include stdio.h #include stdlib.h #define N 512 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); double *A malloc(N * N * sizeof(double)); double *B malloc(N * N * sizeof(double)); double *C malloc(N * N * sizeof(double)); int rows N / size; /* 每个进程负责的行数 */ double *local malloc(rows * N * sizeof(double)); if (rank 0) { for (int i 0; i N * N; i) { A[i] rand() % 10; B[i] rand() % 10; } } double t0 MPI_Wtime(); MPI_Bcast(A, N * N, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Bcast(B, N * N, MPI_DOUBLE, 0, MPI_COMM_WORLD); for (int i 0; i rows; i) { int gi rank * rows i; /* 全局行号 */ for (int j 0; j N; j) { double sum 0.0; for (int k 0; k N; k) sum A[gi * N k] * B[k * N j]; local[i * N j] sum; } } MPI_Gather(local, rows * N, MPI_DOUBLE, C, rows * N, MPI_DOUBLE, 0, MPI_COMM_WORLD); double t1 MPI_Wtime(); if (rank 0) printf(N%d p%d time%.4fs\n, N, size, t1 - t0); MPI_Finalize(); return 0; }这段代码放进报告时分析重点有三个。第一通信量两次 MPI_Bcast 全量广播 A 和 B通信量是 2N^2 个 double而计算量是 N^3/p只要 N 足够大通信占比就小加速比才接近线性——这正好解释后面图像里小规模加速比难看、大规模加速比好看的现象。第二内存代价每个进程都持有一份完整的 A 和 Bp 个进程总内存 O(pN^2)N512 时单进程约 2MB 没问题N 到 4096 就涨到 128MB 每进程报告里可以就此讨论分块通信的改进方向。第三缓存局部性内层循环按列访问 B缓存命中率低把 j、k 两层循环交换或对 B 做一次转置可以显著提速这是个常见的优化点写进去也是加分项。注意N 必须能被 size 整除。rows N / size 在不能整除时会把尾数行丢掉结果矩阵缺行Gather 的 count 参数也会错位。常见做法是整除后剩下的 N % size 行单独分给前几个进程代价是 Gather 要改成 MPI_Gatherv在报告里写清楚这个取舍比直接贴 Gatherv 更能体现你理解边界条件。参数说明计时起点放在 Bcast 之前终点放在 Gather 之后测的是完整并行段如果你把初始化也包进计时串行初始化会污染并行时间的测量。每个进程在 rank 0 广播前就 malloc 好了 B 的空间这是为了广播时接收缓冲区已就位省一次动态分配这个细节也可以在代码分析里提。3.3 奇偶交换排序MPI 邻居通信与归并奇偶交换排序是并行计算课里最能体现进程间协作的实验。串行冒泡排序里相邻元素反复比较交换并行化后让偶数进程对和奇数进程对交替做比较-交换每轮只和直接邻居通信跑 size 轮后全局有序。这个实验的难点不在算法而在通信顺序和保留哪一半的判断上。#include mpi.h #include stdio.h #include stdlib.h #include string.h static int cmp_int(const void *a, const void *b) { return *(const int *)a - *(const int *)b; } int main(int argc, char **argv) { int rank, size, n 100000; MPI_Init(argc, argv); MPI_Comm_rank(MPI_COMM_WORLD, rank); MPI_Comm_size(MPI_COMM_WORLD, size); int local_n n / size; int *local malloc(local_n * sizeof(int)); srand(rank 1); for (int i 0; i local_n; i) local[i] rand(); qsort(local, local_n, sizeof(int), cmp_int); /* 先本地排序 */ int *recv malloc(local_n * sizeof(int)); int *merged malloc(2 * local_n * sizeof(int)); for (int phase 0; phase size; phase) { int partner (phase % 2 0) ? (rank % 2 ? rank - 1 : rank 1) : (rank % 2 ? rank 1 : rank - 1); if (partner 0 || partner size) continue; MPI_Sendrecv(local, local_n, MPI_INT, partner, 0, recv, local_n, MPI_INT, partner, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); int i 0, j 0, k 0; while (i local_n j local_n) merged[k] (local[i] recv[j]) ? local[i] : recv[j]; while (i local_n) merged[k] local[i]; while (j local_n) merged[k] recv[j]; if (rank % 2 0) { if (phase % 2 0) /* 偶数进程在偶数轮取较小的一半 */ memcpy(local, merged, local_n * sizeof(int)); else memcpy(local, merged local_n, local_n * sizeof(int)); } else { if (phase % 2 0) memcpy(local, merged local_n, local_n * sizeof(int)); else memcpy(local, merged, local_n * sizeof(int)); } } int *all NULL; if (rank 0) all malloc(n * sizeof(int)); MPI_Gather(local, local_n, MPI_INT, all, local_n, MPI_INT, 0, MPI_COMM_WORLD); if (rank 0) { int ok 1; for (int i 0; i n - 1; i) if (all[i] all[i 1]) ok 0; printf(sorted%s\n, ok ? yes : no); } MPI_Finalize(); return 0; }代码分析的重点是 MPI_Sendrecv 为什么必须成对它同时发送和接收避免了两端一个先发一个先收造成的死锁这是 MPI 点对点通信的黄金法则。接着解释保留哪一半偶数轮里偶数号进程和右边的奇数号进程比偶数号是左邻居保留较小的一半奇数轮角色互换偶数号进程变成右邻居保留较大的一半。方向判断错一个符号排序结果就乱这是这个实验最容易翻车的地方。参数说明n 同样要求能被 size 整除每轮通信量为 2local_n 个 int共 size 轮通信总量 O(nsize)进程数越多通信开销占比越高加速比曲线会呈现明显回落这个现象正好是 4.2 节结果分析里可以展开的点。另一个值得写进报告的细节是为什么选 qsort 做本地预排序而不是手动写快排——它让每轮归并的输入天然有序归并复杂度从 O(k log k) 降到 O(k)通信的性价比因此高了一截。3.4 绘制图像一套脚本出三张图图和表同源这份报告里最拉分的其实是图像。老师打开报告第一眼看的不是你写了多少字而是结果页的图清不清楚、坐标轴有没有说明、趋势是否合理。拆包时注意到报告里的所有图像都由一个 python 脚本生成输入是 CSV输出是三张拼在一起的子图。这样做的好处是换个机器重跑实验后只要 CSV 变了图就自动更新永远不会出现图和数据对不上的问题。import csv import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei, Noto Sans CJK SC] plt.rcParams[axes.unicode_minus] False threads, time [], [] with open(perf.csv) as f: for row in csv.DictReader(f): threads.append(int(row[p])) time.append(float(row[time])) speedup [time[0] / t for t in time] efficiency [s / p for s, p in zip(speedup, threads)] fig, axes plt.subplots(1, 3, figsize(14, 4)) axes[0].plot(threads, time, o-, label实测时间) axes[0].set_xlabel(进程数 / 线程数) axes[0].set_ylabel(运行时间 (s)) axes[0].legend() axes[1].plot(threads, speedup, s-, label实测加速比) axes[1].plot(threads, threads, k--, label理想加速比) axes[1].legend() axes[2].plot(threads, efficiency, ^-) axes[2].set_ylim(0, 1.1) axes[2].set_xlabel(进程数 / 线程数) axes[2].set_ylabel(效率) fig.tight_layout() fig.savefig(perf.png, dpi150)参数说明figsize(14,4) 是三张图并排时不挤压坐标轴的尺寸dpi150 保证打印到报告里足够清晰axes[1] 里那条 k-- 理想加速比斜线是整张图的灵魂没有它读者就不知道实测曲线离理想值差多少效率图的 ylim 固定在 (0,1.1)避免 y 轴自动缩放把 0.65 的效率拉伸成看起来接近 1的错觉。中文字体的两行 rcParams 必须放在 import 之后、绘图之前否则图里全是方块如果系统里没有 SimHei用 fc-list 查已装字体把字体名替换进列表。这段脚本直接体现绘制图像这一步的完整做法数据驱动、脚本化、可重复。报告里贴的每一张图都应该能由它重新生成这是这套报告最值得学的习惯后面避坑章节我会展开讲它为什么重要。4. 性能分析怎么写才够分加速比、效率与串行比例反推4.1 三个指标怎么算结果分析板块如果只是加速比随进程数增加而增加一句话基本就是 80 分以下的水平。要用指标说话指标就三个加速比 S(p)T(1)/T(p)效率 E(p)S(p)/p以及通过实测反推串行比例 f。第二个等于第一个除以进程数第三个是 Amdahl 定律的逆用。进程数 p运行时间 T(p)加速比 S效率 E112.501.001.0026.801.840.9243.903.210.8082.405.210.65这张表是从报告里提炼出来的典型形态。Amdahl 定律 S(p)1/(f(1-f)/p)把实测 S 代进去可以反推 fp8 时 S5.21解得 f≈0.077也就是说这个实验里约 8% 的执行时间是不可并行的串行部分。这个数写进报告比一句提升不够快有说服力得多因为它把模糊的观察变成了可复算的结论。参数说明T(1) 必须是同一份代码在单进程或单线程下的运行时间不是在 p 个进程上跑完再拿总耗时除以 p这个概念错是报告里最容易出现的。效率在 p8 时掉到 0.65 是正常现象原因包括通信开销占比上升、进程间负载不均、系统调度抖动分析部分挑一两个主因说透即可不用面面俱到。顺带提一句扩展性Amdahl 定律假设问题规模固定适合解释强扩展场景实验里另一种常见做法是固定每进程规模、总规模随进程数增大对应 Gustafson 定律 S(p)p-f(p-1)。报告里通常用 Amdahl 就够但能在讨论里提一句两种扩展的区别说明你确实读过教材而不是只看了课件。4.2 结果分析的标准写法好的分析有三个固定动作和理想值对比、解释偏差来源、给出改进方向。以矩阵乘法 p8 效率 0.65 为例可以这样组织先陈述事实实测加速比 5.21低于理想值 8效率 0.65。再拆偏差来源本实验通信总量约 2*N^2 个 double计算量 N^3/8N512 时通信占比约 3%通信不是主因真正的主因是 Gather 阶段所有进程向 0 号进程汇聚结果0 号进程要串行接收 p-1 份数据这一段耗时随 p 线性增长是典型的汇聚瓶颈。最后给改进方向改用树形归约让汇聚复杂度从 O(p) 降到 O(log p)或者把结果收集分布到多个进程。每段分析先给数字再给原因最后给方案三者缺一不可。反面教材是这样的随着进程数增加运行时间明显减少加速比基本符合预期。 这句话没有任何可复算信息老师看完只得到一个印象——你没思考。把它拆开哪怕只补一句N512 时通信占比约 3%而 Gather 的串行接收随进程数线性增长所以效率从 0.92 降到 0.65说服力立刻不同。分析时还要引用图像上的具体点。比如图上 p4 到 p8 的曲线斜率变缓了对应串行比例反推出来的 8% 不可并行部分效率曲线从 0.80 掉到 0.65对应 Gather 汇聚瓶颈。图像和数据表格互相佐证老师就挑不出逻辑矛盾。注意不要出现基本符合预期这种没有数字支撑的模糊表述报告里凡是能放数字的地方都放实测值。5. 复现过程中避坑与排查五个翻车点5.1 加速比小于 1问题规模太小现象程序在 4 个线程上跑加速比只有 0.8比串行还慢。原因投点总数设成了 10^5每个线程分到的活太少线程创建、调度、归约的开销比计算本身还大。解决把 total 提到 10^8 再测如果还是负加速检查是不是开了超线程4 核 8 线程的机器上线程数设到 8 会出现资源争抢。建议先测 1、2、4再测 8 做对比每个线程数跑三遍取中位数。5.2 图像中文变方块缺字体现象matplotlib 画出来的图标题、轴标签全是空心方块。原因系统里没有 matplotlib 能识别的中文字体默认回退到 DejaVu Sans它不含 CJK 字形。解决先 fc-list | grep -i cjk|hei 看装了哪些字体没有就 apt install fonts-noto-cjk然后在脚本里设置 plt.rcParams[font.sans-serif][Noto Sans CJK SC]。注意这个设置必须写在绘图之前而且直接复制的 SimHei 在 Linux 上往往不存在务必换成系统里真实存在的字体名。5.3 MPI 程序卡死通信顺序不一致现象mpiexec -n 4 跑矩阵乘或排序终端光标一直闪几分钟都不退出。原因最常见的是点对点通信顺序不匹配比如进程 0 先 MPI_Send 再 MPI_Recv而进程 1 反过来先 Recv 再 Send大消息时 Send 会阻塞等待接收两边互相等就死锁另一个坑是 Gather 的 count 参数没对齐N 不能被 size 整除时每个进程发出去的块大小不一致。解决点对点一律改用 MPI_Sendrecv成对收发天然避免死锁分块前先断言 N % size 0先用 -n 2 跑通小规模再加进程数。5.4 OpenMP 线程数变了时间没变先查编译参数现象代码里写了 num_threads(8)运行时间纹丝不动和单线程一模一样。这种玄学问题十有八九是编译参数。原因编译时忘了加 -fopenmppragma 被编译器忽略程序按串行跑另一种可能是循环体内存在数据依赖编译器安全地选择串行执行。解决先确认编译和链接阶段都有 -fopenmp再在代码里用 omp_get_num_threads() 打印实际线程数核对最后在 for 上试 schedule(static,1) 和 schedule(dynamic,1) 各跑一遍把两者差异写进报告属于加分项。5.5 报告截图和文字对不上图和表不同源现象分析里写p8 时效率 0.65配图曲线看起来却只有 0.5 左右老师一追问就露馅。原因图是在旧机器上跑的表格是换机器后重新跑的两边数据没有同步更新。解决把运行结果统一写成 CSV绘图脚本只读 CSV 生成图每次改数据后重新执行一遍脚本报告里所有表格数字也从同一个 CSV 转写做到一张图、一张表、一份源码三位一体。这个习惯是我从这套 90 报告里学到的最大收获它让复查成本趋近于零——老师问任何一个数字你都能当场跑命令重新生成给他看。6. 把 90 的报告真正变成自己的重跑、重画、重写分析拿到一份高分报告最大的风险不是抄而是抄完被抓和抄完还是不会。我的习惯是把这份资源当验收清单而不是答案纸报告里每个结论我都要在自己机器上重跑一遍验证验证通过才写进自己的报告。重跑的动作有三个。第一把报告里每张图对应的 CSV 手工重建换一个机器、换一组 N 和线程数得到一套完全属于自己的数据这一步直接解决查重问题因为图和数据都是你自己的。第二改画图脚本的样式坐标轴标签、图例位置、配色换掉但保留三图并排的结构和理想加速比虚线——这两个是分析价值的核心不能丢。第三重写结果分析用自己的数据重新算加速比、效率、反推串行比例 f。只要这三步走完报告从骨架到细节都是你的老师的追问也接得住。验证方法上我推荐一个简单有效的流程写一个 run.sh按顺序执行编译、串行基线、并行各规模三次、收集 CSV、调用 python 出图最后用一个校验命令确认排序结果有序或 π 落在误差范围内。整个流程五分钟跑完报告里的每个数字都能追溯到一条命令。gcc -O2 -fopenmp -o mc monte_carlo.c for p in 1 2 4 8; do export OMP_NUM_THREADS$p; ./mc perf.csv; done python3 plot.py这段脚本的逻辑是让数据采集和绘图完全自动化perf.csv 每一行带进程数和时间plot.py 读进去生成图像你在报告里引用的任何数字都可以从这个 CSV 里查到原始记录。参数说明OMP_NUM_THREADS 在运行期设置线程数比每次改代码重编译更高效多跑两次并用 awk 取中位数的操作也可以加进脚本我试过多次后发现第一轮运行的耗时普遍偏高 10% 左右取中位数能显著稳定图像曲线。从那以后我每次做并行计算实验都强制走一遍先串行基线再并行重跑最后脚本出图所有数据和图像同源。这套流程不保证你次次 95但至少保证报告里的每个结论都经得起老师当堂追问。这份资源把 90 该有的样子摆在了你面前剩下的就是用你自己的运行数据把它填满。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Atlas 300V 24G跑YOLO全流程:从环境搭建到推理优化 2026/9/25 5:40:09

Atlas 300V 24G跑YOLO全流程:从环境搭建到推理优化

干了这么多年AI部署,说实话被各种推理卡折磨过不少回,Atlas 300V 24G 这张卡算是让我印象比较深的一张。一开始单纯以为它就是一张普通的 PCIe 加速卡,结果从驱动到算子适配到模型转换,每一步都有它自己的脾气。这篇文章就围绕 At…

阅读更多 →
Atlas 300V 24G推理加速卡部署YOLOv5全流程实战 2026/9/25 5:40:09

Atlas 300V 24G推理加速卡部署YOLOv5全流程实战

最近在折腾Atlas这块卡,把YOLO模型从PyTorch一路迁移到昇腾推理环境,踩了不少坑,也终于理清了整套流程。先说结论:Atlas 300V 24G确实是运算加速卡,但更准确的说法是AI推理加速卡,它和打游戏的显卡、跑训练…

阅读更多 →
CIFAR-10/CIFAR-100稳定下载与数据验证指南 2026/9/25 5:40:03

CIFAR-10/CIFAR-100稳定下载与数据验证指南

1. 项目概述:为什么CIFAR-10和CIFAR-100仍是深度学习入门绕不开的“第一块砖”你刚打开PyTorch文档,想跑通第一个图像分类模型,官方教程里赫然写着torchvision.datasets.CIFAR10;你在Keras官网上找示例代码,tf.keras.d…

阅读更多 →
Atlas 300V Pro 24G推理卡部署YOLO实战:从环境搭建到性能调优 2026/9/25 5:39:57

Atlas 300V Pro 24G推理卡部署YOLO实战:从环境搭建到性能调优

1. 一张24GB的推理卡,先搞清楚它能干什么先回答那个被反复问到的问题:Atlas 300V 24G确实是运算加速卡,而且不是那种插在个人电脑里跑游戏的显卡,它的定位是数据中心和边缘服务器里的AI推理加速卡。很多朋友看到“300V”“24G”第…

阅读更多 →
Type 1 Hypervisor:车规功能安全的确定性执行基座 2026/9/25 5:39:57

Type 1 Hypervisor:车规功能安全的确定性执行基座

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

阅读更多 →
华为Atlas 300V 24G部署YOLO:从ONNX到OM完整实战指南 2026/9/25 5:39:57

华为Atlas 300V 24G部署YOLO:从ONNX到OM完整实战指南

1. 项目概述:Atlas到底是什么东西?很多人第一次听到Atlas,要么以为它是某张游戏显卡,要么以为是某个开源项目代号。实际上,华为Atlas是昇腾AI计算平台的产品线,本质上是一张专门用来跑神经网络推理的运算加…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉