gsl_integration_qag可使用1个内核(带有/不带有openMP),但不能用于多线程(即> 1)。
一些可能有用的信息...
gsl-2.5
#define _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 integration)是相同的问题,但是我在这篇文章中找不到解决方案。
答案 0 :(得分:1)
问题已解决...
这实际上是由于func_integrand还具有使用gsl_integration_qag估计的项。在此计算中采用了一些全局变量,我之前没有捕获过。