У меня есть простой for
-петл, который вычисляет array[n]
в зависимости от соответствующей строки в массиве X[n][d]
.
array *function(X, n, d){
double *array = calloc(n,sizeof(double));
//#pragma omp parallel
{
//#pragma omp parallel for if(n>15000)
for( i=0 ; i<n-1; i++)
{
//#pragma omp parallel for shared(X,j, i) reduction(+: sum)
//#pragma omp parallel for if(d>100) reduction(+:distances[:n]) private(j)
for ( j=0; j< d; j++)
{
array[i] += (pow(X[(j+1)*n-1]-X[j*n+i], 2));
}
array[i] = sqrt(array[i]);
}
}
return array;
}
Считайте n
равным n=100000
и d
могут иметь предопределенное значение от d=2
до d=100
. function()
вызывается несколько раз (2^k
) на каждой k
-й итерации. Таким образом, шаблон таков: на первой итерации он вызывается один раз, на второй итерации он вызывается дважды, на третьей итерации - четыре раза и т. Д. Также n
уменьшается на единицу в каждой итерации (n-=1
).
Я пробовал разные комбинации директив openmp
, которые я добавил в качестве примера в пример кода, но независимо от того, что я пробовал, код работает одинаково или лучше без директив openmp
.
Какими хорошими способами / методами можно улучшить временную производительность вышеуказанного цикла, используя openmp
?