gsl_integration_qag работает с 1 ядром (с / без openMP), но не работает с многопоточностью (т. Е.> 1).
Некоторая информация, которая может помочь ...
GSL-2,5
# определить _OPENMP 201107
В зависимости от количества ядер я могу получать сообщения об ошибках:
gsl: qag.c:248: ERROR: roundoff error prevents tolerance from being achieved (comment: usually with a small number of cores)
gsl: qag.c:257: ERROR: maximum number of subdivisions reached (comment: usually with a large number of cores)
Большой максимальный номер итерации, данный gsl_integration_qag, только задерживает код на сбой.
Функция интеграции (при необходимости может быть более конкретной):
double Func(double Param1, ..., double ParamN){
double result, error;
gsl_function F;
gsl_integration_workspace * w
= gsl_integration_workspace_alloc (1000);
struct parameters_gsl_int_ parameters_gsl = {
.Param1 = Param1,
...
.ParamN = ParamN,};
F.function = &func_integrand;
F.params = ¶meters_gsl;
gsl_integration_qag (&F, LOWER_LIMIT, UPPER_LIMIT, 0, 0.001,
1000, GSL_INTEG_GAUSS61, w, &result, &error);
gsl_integration_workspace_free (w);
return result;
}
Часть OpenMP, которая вызывает интеграцию:
void call_Func(int Nbin, double array[], double Param1[], double Param2, ... double ParamN){
int i;
...
#pragma omp parallel shared(Nbin, array, Param1, ..., ParamN) private(i)
{
#pragma omp for
for (i=0; i<Nbin; i++)
array[i] = Func(Param1[i], Param2, ..., ParamN);
}
...
}
Я новичок в GSL и openMP. Я надеюсь, что я правильно использую gsl_integration_qag, и определение общих или частных переменных имеет смысл.
Кстати, это тот же вопрос, что и в 2014 году ( gsl openmp failed интеграции ), но я не смог найти решение в этом посте.