новичок в openMP, какие-либо предложения, чтобы параллельный следующий код с openMP? - PullRequest
0 голосов
/ 10 ноября 2019

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

Я хочу ускорить код с помощью openMP и попытался добавить #pragma omp для следующих двух разделов "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;
        }
    }
}

1 Ответ

0 голосов
/ 10 ноября 2019

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

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

...