You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenMP并行矩阵处理代码仅输出单线程迭代信息问题求助

问题分析与修复方案

核心问题

你的代码存在两个关键错误,导致无法正确输出多线程的迭代信息:

  1. OpenMP并行循环绑定错误:#pragma omp parallel for没有直接作用在目标循环上,而是包裹了整个代码块。这使得每个线程都完整执行了一遍for (int i = 0; i < n; i++)循环,而非将循环迭代分配给不同线程执行。最终要么输出大量重复内容,要么因输出同步问题看起来像仅单个线程输出。
  2. 计时逻辑不合理:当前计时代码在并行区域内,每个线程都会单独计算并输出耗时,这不符合并行任务整体计时的需求。

修复后的代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:35:19