OpenMP并行矩阵处理代码仅输出单线程迭代信息问题求助
问题分析与修复方案
核心问题
你的代码存在两个关键错误,导致无法正确输出多线程的迭代信息:
- OpenMP并行循环绑定错误:
#pragma omp parallel for没有直接作用在目标循环上,而是包裹了整个代码块。这使得每个线程都完整执行了一遍for (int i = 0; i < n; i++)循环,而非将循环迭代分配给不同线程执行。最终要么输出大量重复内容,要么因输出同步问题看起来像仅单个线程输出。 - 计时逻辑不合理:当前计时代码在并行区域内,每个线程都会单独计算并输出耗时,这不符合并行任务整体计时的需求。
修复后的代码
#include <iostream> #include <chrono> #include <cstdio> #include <cstdlib> using namespace std; int main() { int n; cout << "Enter matrix range: "; cin >> n; int** A = new int* [n]; int** B = new int* [n]; int* C = new int[n]; int* D = new int[n]; for (int i = 0; i < n; i++) { A[i] = new int[n]; B[i] = new int[n]; } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { A[i][j] = rand() % 100; B[i][j] = rand() % 100; } } auto start_time = chrono::high_resolution_clock::now(); #pragma omp parallel for schedule(static, 4) num_threads(4) for (int i = 0; i < n; i++) { int it_num = 0; int minA = A[i][0]; it_num++; for (int j = 1; j < n; j++) { if (A[i][j] < minA) { minA = A[i][j]; ++it_num; } } printf("thread %d processed row %d with %d iterations\n", omp_get_thread_num(), i, it_num); C[i] = minA; } auto end_time = chrono::high_resolution_clock::now(); auto duration = chrono::duration_cast<chrono::microseconds>(end_time - start_time).count(); cout << "Time taken for schedule(static, 4): " << duration << " microseconds" << endl; // 释放内存,避免内存泄漏 for (int i = 0; i < n; i++) { delete[] A[i]; delete[] B[i]; } delete[] A; delete[] B; delete[] C; delete[] D; return 0; }
关键修改说明
- 绑定并行循环:将
#pragma omp parallel for直接放在for (int i = 0; i < n; i++)循环前,OpenMP会自动将循环的迭代分配给指定的4个线程执行,每个线程处理一部分行,这样就能正确输出每个线程的处理信息。 - 调整计时位置:将计时的
start_time和end_time移到并行区域外,确保计算的是整个并行任务的总耗时,而非单个线程的耗时。 - 内存泄漏修复:添加了内存释放代码,避免程序结束后残留内存泄漏问题。
- 优化输出信息:在printf中增加了
row %d,方便你更清晰地看到每个线程处理的具体行号。
内容的提问来源于stack exchange,提问作者user20743167
相关产品推荐
相关产品推荐

