Новичок в 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;
}
}
}
1 ответ
Все ваши переменные объявлены в верхней части функции, поэтому каждый поток будет совместно использовать их, что приведет к небольшой или нулевой пользе от многопоточности.
Вы должны объявлять переменные как можно ближе к тому месту, где вы их используете. В частности, sum
и k
используются в самых внутренних циклах и должны быть объявлены прямо там (чтобы у каждого потока была своя копия этих переменных). Это также может быть расширено до i
и dum
. Кроме того, это последнее условие if (поиск наибольшего значения) может/должно быть помещено в отдельный цикл и либо выполняться в однопоточном режиме, либо с соответствующими директивами OpenMP для обработки big
и imax
.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
a[i][k]*a[k][j]
. Таким образом, у вас остается самый внутренний цикл, который требует сокращения