gsl_integration_qag因gsl openmp失败

时间:2018-11-13 09:54:37

标签: openmp integration gsl

gsl_integration_qag可使用1个内核(带有/不带有openMP),但不能用于多线程(即> 1)。

一些可能有用的信息...

  1. gsl-2.5

  2. #define _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 integration)是相同的问题,但是我在这篇文章中找不到解决方案。

1 个答案:

答案 0 :(得分:1)

问题已解决...

这实际上是由于func_integrand还具有使用gsl_integration_qag估计的项。在此计算中采用了一些全局变量,我之前没有捕获过。