发布于2026-07-09 阅读(0)
扫一扫,手机访问
标准三层循环本身并不关心多核,它只会老老实实按顺序把每个 C[i][j] 算出来。要利用多核,就得把“计算任务”按逻辑切开,每个线程负责一部分独立子任务,最后合并结果。这里面最重要的原则是:避免数据竞争、减少同步开销、保持缓存友好。下面展开讲几种实用的拆分方式。
这是最直观、实现代价最小且效果最稳定的做法。C 是 M×N 矩阵,每个元素 C[i][j] 的计算只依赖 A 的第 i 行和 B 的第 j 列,不同行之间完全独立,互不干扰。
#pragma omp parallel for,编译器自动帮你调度。按行并行能利用多核,但矩阵一大的麻烦就来了:频繁访问 B 的列会导致大量缓存缺失,毕竟 B 是按行存储的,按列访问就是跨步读取。分块技术就是专门解决这个问题的——把 A 和 B 都切成小矩形块,让每个线程在计算过程中反复复用局部数据。
TILE = 16,外层用 m/n 步进循环遍历 C 的每个 TILE×TILE 块。并行不是万灵药,拆得不对反而拖慢速度。下面这几个坑经常遇到:
schedule(dynamic),改用 schedule(static) 或指定 chunk size,防止负载不均导致部分线程闲着、部分线程忙死。假设 A[M][K]、B[K][N]、C[M][N] 已经分配好连续内存,下面这段代码就是最经典的行拆分实现:
#pragma omp parallel for schedule(static)
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
double sum = 0.0;
for (int k = 0; k < K; k++) {
sum += A[i][k] * B[k][j];
}
C[i][j] = sum;
}
}
这段代码在 4 核 CPU 上通常能拿到接近 3.5 倍的加速——前提是矩阵足够大(比如 M=N=K≥2000),而且没有开什么奇怪的优化把自己搞崩掉。一句话总结:用对拆分策略,多核 CPU 的潜力才能真正释放出来。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8