Ошибка gsl_integration_qag с gsl openmp - PullRequest
0 голосов
/ 13 ноября 2018

gsl_integration_qag работает с 1 ядром (с / без openMP), но не работает с многопоточностью (т. Е.> 1).

Некоторая информация, которая может помочь ...

  1. GSL-2,5

  2. # определить _OPENMP 201107

  3. В зависимости от количества ядер я могу получать сообщения об ошибках:

    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)
    
  4. Большой максимальный номер итерации, данный gsl_integration_qag, только задерживает код на сбой.

  5. Функция интеграции (при необходимости может быть более конкретной):

    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 = &parameters_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;
    }
    
  6. Часть 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 интеграции ), но я не смог найти решение в этом посте.

1 Ответ

0 голосов
/ 19 ноября 2018

Проблема решена ...

Это на самом деле связано с тем, что func_integrand имеет также термин, который оценивается с помощью gsl_integration_qag. В этом расчете были приняты некоторые глобальные переменные, которые я раньше не фиксировал.

...