在c++中使用openmp更新2d指针

updating 2d pointer using openmp in c++

本文关键字:更新 2d 指针 openmp c++      更新时间:2023-10-16

代码2的问题是delE由于存在并行区域而无法更新(这是非常明显的(。然而,代码1没有达到要求,并且显示了不明确的结果。如果你们中的任何人能够提供正确的解决方案来并行运行代码1或代码2,我将不胜感激。

这里grad_compute返回一个2d指针,该指针需要为每个并行循环存储或添加。delE和delE分别被声明为3d和2d指针。

#pragma omp parallel for num_threads(8) 
for (int k = 0; k < no_of_sources; k++)
{
    double** gnorm = grad_compute(/*parameters*/);
// code 1   
/*  for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) 
    {
        norm_delE[i][j][k] = gnorm[i][j]; } }    */     
// code 2    
/*  for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) 
    { delE[i][j] += gnorm[i][j]; } }   */
}

如果你需要进一步的信息,我将不胜感激。

编辑和更新:对于代码1,不需要使用直接分配给norm_delE的gnorm和grad_compute的结果,但norm_delE的维度应该更改为[no_of_sources]*[rows]*[cols]。

对于code2,因为多个线程同时写入delE数组,所以每个线程应该被限制为只更新一些行因此,我们为循环创建了两个omp,一个用于代码1,另一个用于编码2

此外,grad_compute获得的内存应该通过free_memory等函数释放,尽管对于内存管理,建议使用std::vector或unique_ptr。

#pragma omp parallel  num_threads(8) 
{
    //code 1
    #pragma omp for 
    for (int k = 0; k < no_of_sources; k++)
    {
        norm_delEk[k] = grad_compute(/*parameters*/);   
    }
    //code 2
    #pragma omp for
    for (int i = 0; i < rows; i++)
     {
        for (int j = 0; j < cols; j++) 
        {
            for (int k = 0; k < no_of_sources; k++)
            {
                delE[i][j] += norm_delE[k][i][j];
            }
        }
    }
}
//memory that acquired should be released
free_memory(norm_delE);