我想将这个功能并行化,但我是开放式mp的新手,如果有人可以帮助我,我将不胜感激:
void my_function(float** A,int nbNeurons,int nbOutput, float* p, float* amp){
float t=0;
for(int r=0;r<nbNeurons;r++){
t+=p[r];
}
for(int i=0;i<nbOutput;i++){
float coef=0;
for(int r=0;r<nbNeurons;r++){
coef+=p[r]*A[r][i];
}
amp[i]=coef/t;
}
}
由于双循环,我不知道如何正确并行化它,目前,我只想做一个:
#pragma omp parallel for reduction(+:t)
但我认为这不是通过openMp加快计算速度的最佳方式。
提前感谢,
答案 0 :(得分:8)
首先:我们需要了解背景。您的探查器在哪里告诉您花费的时间最多?
一般来说,粗粒度并行化效果最好,因为@Alex说:并行外部for循环。
void my_function(float** A,int nbNeurons,int nbOutput, float* p, float* amp)
{
float t=0;
for(int r=0;r<nbNeurons;r++)
t+=p[r];
#pragma parallel omp for
for(int i=0;i<nbOutput;i++){
float coef=0;
for(int r=0;r<nbNeurons;r++){
coef+=p[r]*A[r][i];
}
amp[i]=coef/t;
}
}
根据实际的数量,在后台计算t并将除法移出并行循环可能会很有趣:
void my_function(float** A,int nbNeurons,int nbOutput, float* p, float* amp)
{
float t=0;
#pragma omp parallel shared(amp)
{
#pragma omp single nowait // only a single thread executes this
{
for(int r=0;r<nbNeurons;r++)
t+=p[r];
}
#pragma omp for
for(int i=0;i<nbOutput;i++){
float coef=0;
for(int r=0;r<nbNeurons;r++){
coef+=p[r]*A[r][i];
}
amp[i]=coef;
}
#pragma omp barrier
#pragma omp master // only a single thread executes this
{
for(int i=0; i<nbOutput; i++){
amp[i] /= t;
}
}
}
}
注意未经测试的代码。 OMP有时会有棘手的语义,所以我可能错过了那里的“共享”声明。但是,分析师不会很快通知您。