Новичок в openMP, какие-либо предложения по параллельному использованию следующего кода с openMP?

Я хочу ускорить код с помощью openMP и попытался добавить #pragma omp for в следующие 2 раздела «sum -= a[i][k]*a[k][j]», поскольку анализ горячих точек показывает эти два цикла занимают большие части времени. но похоже, что некоторые условия гонки привели к неправильным результатам. какие-либо предложения?

void ludcmp(float **a, int n, int *indx, float *d)
{
int i,imax,j,k;
float big,dum,sum,temp;
float *vv;
    vv=vector(1,n);
*d=1.0;

for (j=1;j<=n;j++) {

    for (i=1;i<j;i++) {
        sum=a[i][j];
        for (k=1;k<i;k++) sum -= a[i][k]*a[k][j];     //here
        a[i][j]=sum;
    }   
    big=0.0;
    for (i=j;i<=n;i++) {
        sum=a[i][j];
        for (k=1;k<j;k++)
            sum -= a[i][k]*a[k][j];                   //here
        a[i][j]=sum;
        if ( (dum=vv[i]*fabs(sum)) >= big) {
            big=dum;
            imax=i;
        }
    }
}
0
hit_da_key 10 Ноя 2019 в 07:31

1 ответ

Все ваши переменные объявлены в верхней части функции, поэтому каждый поток будет совместно использовать их, что приведет к небольшой или нулевой пользе от многопоточности.

Вы должны объявлять переменные как можно ближе к тому месту, где вы их используете. В частности, sum и k используются в самых внутренних циклах и должны быть объявлены прямо там (чтобы у каждого потока была своя копия этих переменных). Это также может быть расширено до i и dum. Кроме того, это последнее условие if (поиск наибольшего значения) может/должно быть помещено в отдельный цикл и либо выполняться в однопоточном режиме, либо с соответствующими директивами OpenMP для обработки big и imax.

0
1201ProgramAlarm 10 Ноя 2019 в 07:38
Хотя я полностью согласен с тем, что следует объявлять переменные как можно ближе к тому месту, где они используются, в данном случае этого недостаточно. Вы не можете тривиально распараллелить что-либо, кроме самых внутренних циклов, из-за чтения вне индекса a[i][k]*a[k][j]. Таким образом, у вас остается самый внутренний цикл, который требует сокращения
 – 
Zulan
10 Ноя 2019 в 12:47