gsl_integration_qag failed with gsl openmp










0















gsl_integration_qag works with 1 core (with/without openMP), but fails with multi-threads (i.e. >1).



Some information that may help...



  1. gsl-2.5


  2. #define _OPENMP 201107



  3. Depending on the number of cores, I can get error reports of:



    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. A large max iteration number given to gsl_integration_qag only delays the code to crash.



  5. The integration function is (can be more specific if needed):



    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. The OpenMP part that calls the integration is:



    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);

    ...



I'm new to both GSL and openMP. I hope I am using gsl_integration_qag correctly and the definition of shared or private variables makes sense.



btw, it's the same question as this 2014 one (gsl openmp failed integration), but I couldn't find the solution in this post.










share|improve this question






















  • When it comes to parallel code, GSL is far from perfect, unfortunately. However, I saw a repository (probably official or semi-official) where they try to add OMP support.

    – Vladimir
    Nov 13 '18 at 14:51











  • Not very sure but is it possible that NBin*1000 is larger than the upper limit?

    – zmwang
    Nov 14 '18 at 13:31











  • I don't think I understand it, why would Nbin*1000>UPPER_LIMIT be a problem? Or you are not referring to the upper limit as the upper limit of the integral?

    – Yuxiang Qin
    Nov 14 '18 at 14:52















0















gsl_integration_qag works with 1 core (with/without openMP), but fails with multi-threads (i.e. >1).



Some information that may help...



  1. gsl-2.5


  2. #define _OPENMP 201107



  3. Depending on the number of cores, I can get error reports of:



    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. A large max iteration number given to gsl_integration_qag only delays the code to crash.



  5. The integration function is (can be more specific if needed):



    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. The OpenMP part that calls the integration is:



    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);

    ...



I'm new to both GSL and openMP. I hope I am using gsl_integration_qag correctly and the definition of shared or private variables makes sense.



btw, it's the same question as this 2014 one (gsl openmp failed integration), but I couldn't find the solution in this post.










share|improve this question






















  • When it comes to parallel code, GSL is far from perfect, unfortunately. However, I saw a repository (probably official or semi-official) where they try to add OMP support.

    – Vladimir
    Nov 13 '18 at 14:51











  • Not very sure but is it possible that NBin*1000 is larger than the upper limit?

    – zmwang
    Nov 14 '18 at 13:31











  • I don't think I understand it, why would Nbin*1000>UPPER_LIMIT be a problem? Or you are not referring to the upper limit as the upper limit of the integral?

    – Yuxiang Qin
    Nov 14 '18 at 14:52













0












0








0








gsl_integration_qag works with 1 core (with/without openMP), but fails with multi-threads (i.e. >1).



Some information that may help...



  1. gsl-2.5


  2. #define _OPENMP 201107



  3. Depending on the number of cores, I can get error reports of:



    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. A large max iteration number given to gsl_integration_qag only delays the code to crash.



  5. The integration function is (can be more specific if needed):



    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. The OpenMP part that calls the integration is:



    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);

    ...



I'm new to both GSL and openMP. I hope I am using gsl_integration_qag correctly and the definition of shared or private variables makes sense.



btw, it's the same question as this 2014 one (gsl openmp failed integration), but I couldn't find the solution in this post.










share|improve this question














gsl_integration_qag works with 1 core (with/without openMP), but fails with multi-threads (i.e. >1).



Some information that may help...



  1. gsl-2.5


  2. #define _OPENMP 201107



  3. Depending on the number of cores, I can get error reports of:



    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. A large max iteration number given to gsl_integration_qag only delays the code to crash.



  5. The integration function is (can be more specific if needed):



    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. The OpenMP part that calls the integration is:



    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);

    ...



I'm new to both GSL and openMP. I hope I am using gsl_integration_qag correctly and the definition of shared or private variables makes sense.



btw, it's the same question as this 2014 one (gsl openmp failed integration), but I couldn't find the solution in this post.







openmp integration gsl






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 13 '18 at 9:54









Yuxiang QinYuxiang Qin

112




112












  • When it comes to parallel code, GSL is far from perfect, unfortunately. However, I saw a repository (probably official or semi-official) where they try to add OMP support.

    – Vladimir
    Nov 13 '18 at 14:51











  • Not very sure but is it possible that NBin*1000 is larger than the upper limit?

    – zmwang
    Nov 14 '18 at 13:31











  • I don't think I understand it, why would Nbin*1000>UPPER_LIMIT be a problem? Or you are not referring to the upper limit as the upper limit of the integral?

    – Yuxiang Qin
    Nov 14 '18 at 14:52

















  • When it comes to parallel code, GSL is far from perfect, unfortunately. However, I saw a repository (probably official or semi-official) where they try to add OMP support.

    – Vladimir
    Nov 13 '18 at 14:51











  • Not very sure but is it possible that NBin*1000 is larger than the upper limit?

    – zmwang
    Nov 14 '18 at 13:31











  • I don't think I understand it, why would Nbin*1000>UPPER_LIMIT be a problem? Or you are not referring to the upper limit as the upper limit of the integral?

    – Yuxiang Qin
    Nov 14 '18 at 14:52
















When it comes to parallel code, GSL is far from perfect, unfortunately. However, I saw a repository (probably official or semi-official) where they try to add OMP support.

– Vladimir
Nov 13 '18 at 14:51





When it comes to parallel code, GSL is far from perfect, unfortunately. However, I saw a repository (probably official or semi-official) where they try to add OMP support.

– Vladimir
Nov 13 '18 at 14:51













Not very sure but is it possible that NBin*1000 is larger than the upper limit?

– zmwang
Nov 14 '18 at 13:31





Not very sure but is it possible that NBin*1000 is larger than the upper limit?

– zmwang
Nov 14 '18 at 13:31













I don't think I understand it, why would Nbin*1000>UPPER_LIMIT be a problem? Or you are not referring to the upper limit as the upper limit of the integral?

– Yuxiang Qin
Nov 14 '18 at 14:52





I don't think I understand it, why would Nbin*1000>UPPER_LIMIT be a problem? Or you are not referring to the upper limit as the upper limit of the integral?

– Yuxiang Qin
Nov 14 '18 at 14:52












1 Answer
1






active

oldest

votes


















1














Problem solved...



It is actually due to func_integrand having also a term which is estimated using gsl_integration_qag. There were some global variables adopted in this calculation, which I didn't capture before.






share|improve this answer






















    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53278276%2fgsl-integration-qag-failed-with-gsl-openmp%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    Problem solved...



    It is actually due to func_integrand having also a term which is estimated using gsl_integration_qag. There were some global variables adopted in this calculation, which I didn't capture before.






    share|improve this answer



























      1














      Problem solved...



      It is actually due to func_integrand having also a term which is estimated using gsl_integration_qag. There were some global variables adopted in this calculation, which I didn't capture before.






      share|improve this answer

























        1












        1








        1







        Problem solved...



        It is actually due to func_integrand having also a term which is estimated using gsl_integration_qag. There were some global variables adopted in this calculation, which I didn't capture before.






        share|improve this answer













        Problem solved...



        It is actually due to func_integrand having also a term which is estimated using gsl_integration_qag. There were some global variables adopted in this calculation, which I didn't capture before.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 19 '18 at 20:49









        Yuxiang QinYuxiang Qin

        112




        112



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53278276%2fgsl-integration-qag-failed-with-gsl-openmp%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Use pre created SQLite database for Android project in kotlin

            Darth Vader #20

            Ondo