【问题标题】:OMP Optimal way to copy matrixOMP 复制矩阵的最佳方式
【发布时间】:2025-11-29 06:50:01
【问题描述】:

我需要使用 OpenMP 优化此 C 代码。最优解是什么?

#define accessMat( arr, exp1, exp2 )    arr[ (int)(exp1) * columns + (int)(exp2) ]

for( i=0; i<iter && i<rows; i++ ) 
        for( j=0; j<columns; j++ )
            accessMat( flow_copy, i, j ) = accessMat( flow, i, j );

【问题讨论】:

  • 你的矩阵有多大?复制数据通常受内存层次结构(缓存和 RAM)的速度限制,而不是计算核心本身。对于小型矩阵,内核之间的隐式通信比仅按顺序移动数据的成本要高得多。如果要高效移动数据,可以使用优化的memcpy函数。

标签: c multithreading matrix parallel-processing openmp


【解决方案1】:

您只需将副本并行化即可尝试

#pragma omp parallel for private(j)
for( i=0; i<iter && i<rows; i++ ) 
    for( j=0; j<columns; j++ )
        accessMat( flow_copy, i, j ) = accessMat( flow, i, j );

您也可以使用 collapse 进行测试(即#pragma omp parallel for(2)),但我认为并行任务没有足够的粒度来克服崩溃子句的开销。

您也可以使用 OpenMP simd,即:

#pragma omp for simd collapse(2) 
for( i=0; i<iter && i<rows; i++ ) 
    for( j=0; j<columns; j++ )
        accessMat( flow_copy, i, j ) = accessMat( flow, i, j );

等等。测试并检查您是否获得任何好处。

【讨论】:

    最近更新 更多