【问题标题】:parallelizing dynamic arrays并行化动态数组
【发布时间】:2012-06-03 14:15:07
【问题描述】:

这是神经网络上反向传播算法代码的一部分。

在我们的例子中,我们想要并行化 for( pt=0; pt

initialize W1[ ] [ ] and W2[ ][ ] with random values
for(epoch=0; epoch<MaxEpoch; epoch++)
     dW1[ ][ ]=0.0; dW2[ ][ ]=0.0; //sum of weight corrections
     sse = 0; // Sum of square of errors
     for( pt=0; pt<N_PT_pair; pt++)
          input = pattern[pt];
          compute output  // procedure as above
          compare target[pt] and output and
          compute dW2[ ][ ] += ... // procedure to be described
          compute dW1[ ][ ] += ... // procedure to be described
          for(k=1; k<=Noutput; k++) 
              sse+=pow((target[pt][k]-output[k]),2);
     end pt for loop   
     cout << "mean square error" << sse/N_PT_pair;
     W1[ ][ ] += rate*dW1[ ][ ]
     W2[ ][ ] += rate*dW2[ ][ ]
end epoch for loop

这些是分配和释放数组的代码

double** allocate_matrix(int rows,int cols) 
{    
    double **a;

    a = new double*[rows];    
    if(a==NULL){cout<<"matrix allocation failed"<<endl;exit(-1);}

    for (int j=0;j<rows;j++){   
       a[j] =  new double[cols];
       if(a[j]==NULL) {cout<<"matrix allocation failed"<<endl;exit(-1);}    
    }

    return a;
}

int deallocate_matrix(double**a,int rows)    
{
    for(int i=0;i<rows;i++)
       delete [] a[i];
    delete [ ] a;    
    return 0;
}

您能帮我们并行化代码吗?

【问题讨论】:

  • new 不返回 NULL。它抛出std::bad_alloc。更重要的是,您使用的是什么并行处理库?

标签: c++ parallel-processing neural-network dynamic-arrays backpropagation


【解决方案1】:

如果内部循环中的迭代相互独立,那么您可以简单地从一个 OpenMP 构造开始:

#pragma omp parallel for private(input,k) reduction(+:sse)
for( pt=0; pt<N_PT_pair; pt++)
     input = pattern[pt];
     compute output  // procedure as above
     compare target[pt] and output and
     compute dW2[ ][ ] += ... // procedure to be described
     compute dW1[ ][ ] += ... // procedure to be described
     for(k=1; k<=Noutput; k++) 
         sse+=pow((target[pt][k]-output[k]),2);
end pt for loop

如果dW1dW2 的元素在一次以上迭代中没有更新,这将非常有用,否则将需要原子访问,这会降低性能(OpenMP 仍然不支持减少 C/ C++)。

如果您有大量的网络权重,您也可以以相同的方式并行化乘法。

为了减少 OpenMP 开销,可以进一步将并行区域移到外部循环之外,并且可以使用 singlemaster OpenMP 指令来隔离应该只在单个线程中运行的代码。

为了让编译器理解#pragma omp 指令,您必须启用 OpenMP 支持。具体如何完成取决于编译器:

  • -fopenmp 为 GCC
  • -openmp 用于英特尔 C/C++ 编译器
  • -xopenmp 用于 Oracle Solaris Studio
  • 项目属性 -> 等 MS Visual Studio

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多