gpt4 book ai didi

c++ - 并行化动态数组

转载 作者:行者123 更新时间:2023-11-28 08:03:22 26 4
gpt4 key购买 nike

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

在我们的例子中,我们想要并行化 for(pt=0; pt< N_PT_pair; pt++) 循环,for(epoch=0; epoch< MaxEpoch; epoch++) 不能并行化。

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;
}

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

最佳答案

如果内部循环中的迭代相互独立,那么您可以简单地从一个 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 的项目属性 -> 等

关于c++ - 并行化动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10797745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com