OpenMP 并行区域中嵌套函数的内部编译器错误

2024-04-03

我尝试调用GSL库的蒙特卡罗积分子程序来进行一些数值计算。因为我的 for 循环相当简单,这意味着不同运行的结果是独立的,所以我预计使用 OpenMP 进行并行化应该非常简单。然而,当我编译它时,它总是显示“内部编译器错误:分段错误”,并且什么也没生成。这是我的代码:

#include <stdlib.h>
#include <omp.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_monte.h>
#include <gsl/gsl_monte_vegas.h>
#include <math.h>     

 double
 Reg1 (double *x, double t, size_t dim, void *params)
 {
     return sin(x[1])*cos(t*t)*x[0]*x[0]*cos(x[0])*cos(3*x[0]);
 }


 void
 display_results (char *title, double result, double error)
 {
   printf ("%s ==================\n", title);
   printf ("result = % .10f\n", result);
   printf ("sigma  = % .10f\n\n", error);
 }


 void
 VEGAS_integration_routine (double (*function)(double *, size_t, void *), 
                            double xl[], double xu[], size_t calls, gsl_rng * r)
 {
 double res, err;
     gsl_monte_function Function = { function, 2, 0 };   

     gsl_monte_vegas_state *s = gsl_monte_vegas_alloc (2);

     gsl_monte_vegas_integrate (&Function, xl, xu, 2, 20000, r, s, &res, &err);

     display_results ("vegas warm-up", res, err);

     printf ("converging...\n");

     do
       {
         gsl_monte_vegas_integrate (&Function, xl, xu, 2, calls, r, s, &res, &err);

         printf ("result = % .10f; sigma = % .10f; "
                 "chisq/dof = %.2f\n", res, err, gsl_monte_vegas_chisq (s));
       }
     while (fabs (gsl_monte_vegas_chisq (s) - 1.0) > 0.05);

     display_results ("vegas final", res, err);

     gsl_monte_vegas_free (s);
 }


 int
 main (void)
 {   
   int seg = 200;

   double xl[2] = { 195.0, -1000.0 };
   double xu[2] = { 205.0, 1000.0 };

   const gsl_rng_type *T;
   gsl_rng *r;

   size_t calls = 1000000;

   gsl_rng_env_setup ();

   T = gsl_rng_default;
   r = gsl_rng_alloc (T);

   /* Calculate G1 */
   int i;
   double j=0;
   #pragma omp parallel for shared(xl,xu,calls,r,seg) private(i,j)
   for(i=0; i<=seg; i=i+1)
   {
    j=(double)i * 0.05;
    printf("Now it's t = %.2f \n", j);
    printf("Compute Re(G1)...\n");
    double g(double * x, size_t dim, void *params)
    {
        return Reg1(x, j, dim, &params);
        }
        VEGAS_integration_routine (&g, xl, xu, calls, r);
   }
   gsl_rng_free (r);

   return 0;
 }

这段代码基本上是根据示例代码修改的GSL网页 http://www.gnu.org/software/gsl/manual/html_node/Monte-Carlo-Examples.html。在不使用 OpenMP 的情况下,它可以完美运行。但是当我使用 gcc 使用以下命令进行编译时(使用-fopenmp添加),它在我们的服务器上运行,

gcc -c -Wall -ansi -I/usr/include -L/usr/lib/gcc/x86_64-redhat-linux/4.4.4/ -lgomp -fopenmp test2.c -o test2.o
gcc -L/usr/lib64/  test2.o -L/usr/lib/gcc/x86_64-redhat-linux/4.4.4/ -lgomp -fopenmp -lgsl -lgslcblas -lm -o test2.out

我收到以下错误消息:

test2.c: In function 'main':
test2.c:85: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
Preprocessed source stored into /tmp/ccAGFe3v.out file, please attach this to your bugreport.
make: *** [test2.o] Error 1

由于我无法编译它并且上面显示的错误消息非常有限,我真的很想知道出了什么问题,所以我分解了子例程VEGAS_integration_routine我打电话然后逐行运行它。我发现编译停在第二行

gsl_monte_function Function = { function, 2, 0 };

这让我很困惑。使用 OpenMP 展平循环时,我不能在循环中声明 GSL 函数吗? GSL 和 OpenMP 之间是否存在内部冲突?我确实在 Stack Overflow 和 Google 上进行了搜索,但似乎没有相关的帖子存在(太奇怪了!)。如果有人能够解释这里发生的事情,或者指出进行并行计算的替代方法,我将非常感激。我确信我编写 for 循环的方式不是最好和最简洁的......


回归错误 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52547GCC 中词法闭包的实现与 OpenMP 代码转换引擎交互的方式。该错误似乎在 GCC 4.7 分支的更高版本中得到修复。如果您无法用 GCC 4.7.1 或更高版本替换 GCC 4.4.4,那么您应该重写代码以不使用嵌套函数,如您在帖子中引用的 GSL 示例中所示。此外,嵌套函数是非标准 GCC C 扩展,您应该尽可能避免使用它们。

GSL 中的蒙特卡罗积分接口支持通过以下方式将附加参数传递给被积函数void *params论证如所解释的here http://www.gnu.org/software/gsl/manual/html_node/Monte-Carlo-Interface.html。你必须改变Reg1如下:

double
Reg1 (double *x, size_t dim, void *params)
{
    double t = *(double *)params;
    return sin(x[1])*cos(t*t)*x[0]*x[0]*cos(x[0])*cos(3*x[0]);
}

并更新第二行VEGAS_integration_routine读书:

gsl_monte_function Function = { function, 2, &t };

您还必须添加t到虚拟参数列表VEGAS_integration_routine并将其值传递给main。因此相关部分变为:

void
VEGAS_integration_routine (double (*function)(double *, size_t, void *),
                           double t,
                           double xl[], double xu[], size_t calls, gsl_rng * r)
{
   double res, err;
   gsl_monte_function Function = { function, 2, &t };
   ...
}

#pragma omp parallel for
for(i=0; i <= seg; i++)
{
   double t = (double)i * 0.05;
   ...
   VEGAS_integration_routine (Reg1, t, xl, xu, calls, r);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenMP 并行区域中嵌套函数的内部编译器错误 的相关文章

随机推荐

  • 如何将文件拖放到 .MAPIMail 上

    给定一些文件 或 shell 文件对象 我如何调用 MAPIMail向他们注册 shell 扩展处理程序 问题 我的计算机上有一些文件 C Users ian AppData Local Temp Contoso Invoice 14117
  • 如何更改具有深色背景的 ActionBarSherlock 内部搜索视图的自动完成文本颜色?

    我有自己的 ActionBarSherlock 主题 基于Theme Sherlock Light DarkActionBar 这是我的风格
  • Ant Zip 提取的父目录

    我有几个 zip 文件需要在 Ant 目标中解压缩 所有 zip 文件都位于同一目录中 并且具有相同的内部目录和文件结构 因此 我使用以下代码片段来解压缩目录中的所有 zip 文件 但每个 zip 文件在根目录下不包含父文件夹 因此每个连续
  • Mod_rewrite 已启用但不起作用

    我已经阅读了一段时间 但无法让它发挥作用 mod rewrite 在 Apache 中启用 我已将 AllowOverride 更改为 all 我的 htaccess 看起来像这样 Options FollowSymLinks Rewrit
  • 如何更改datagridview中列的颜色?

    我有一个 DataGridview 并且我将某些列设置为只读以用于数据输入目的 当我这样做时 该列保持正常的白色 尽管它不允许进入 如何将列设置为灰色 我看过很多关于如何为行着色的示例 但没有看到列的示例 如何使只读列显示为灰色 尝试设置默
  • 展平数据框

    我有这个嵌套数据框 test lt structure list id c 13 27 seq structure list 1 c 1997 1997 1997 2007 2 c 2007 2007 2007 2007 2007 2007
  • 如何通过innerText获取元素

    如果我知道文本标签包含哪些内容 如何获取 html 页面中的标签 例如 a SearchingText a 您可以使用 xpath 来完成此任务 var xpath a text SearchingText var matchingElem
  • pytesseract找不到指定的文件

    我的代码很简单 如下所示 import pytesseract from PIL import Image img Image open C temp foo jpg img load i pytesseract image to stri
  • castle IOC - 解决循环引用

    关于我的 MVP 实现的简单问题 目前我有下面的代码 其中演示者和视图都是通过容器解析的 然后演示者调用 View Init 将自己传递给视图 然而 我想知道是否有一种方法可以让容器修复我的循环引用 视图 gt 演示者 演示者 gt 视图
  • Codeigniter 会话不会取消设置

    我在一个社区工作 我想让用户注销 但它不会取消设置用户数据 S 你知道为什么吗 这是我的控制器功能 function logOff this gt session gt flashdata reports Du er logget af r
  • 如何使用 MAMP 在 mac 上安装 phpunit 3.5

    我正在尝试使用 MAMP 在 Mac OS X 上安装 PHPUnit 3 5 我确实通过 MAMP 的 PEAR 安装了 PHPUnit 3 5 这一切都是正确的 phpunit 位于 Applications MAMP bin php5
  • 如何将键值对加载到hive表中?

    以下是我的数据集 Jun name balaji id 101 Mar name kumar id 102 创建的表 create table sample month string name string id int row forma
  • ZeroMQ套接字在什么情况下会丢弃或无法传递消息?

    是否有某种规范或其他解释来描述正常情况 对于每种通信类型 您可以预期在 ZeroMQ 套接字上发送的消息不会被 所有 侦听进程接收 例如 我有一个实验程序 它基本上假设所有订阅者PUB套接字接收在该套接字上发送的所有消息 在初始化握手之后
  • Azure AD B2C 审核日志 - 图形 API - 查询选项不起作用

    我正在尝试检索我们租户的 Azure AD 用户登录审核日志 为此 我使用 Microsoft 的图形 API 1 https graph microsoft com v1 0 auditLogs signIns filter create
  • 使用seaborn白色风格没有显示主要刻度线并且无法恢复

    当我使用seaborn 白色 样式生成绘图时 我看到了主要的勾号labels但我没有看到任何重大的问题marks 使用 将主要刻度线设置得更大 matplotlib inline import seaborn as sns import m
  • java.lang.ClassCastException:org.springframework.security.core.userdetails.User无法转换为model.User

    我在我的应用程序中使用 Spring Security 我需要在我的应用程序的控制器中登录用户详细信息 为此 我正在使用这段代码 User loggedInUser User SecurityContextHolder getContext
  • VPC 中的 AWS Lambda 有时无法访问互联网

    我有部署到 VPC 的 Lambda 此部署有以下配置 专有网络 192 168 0 0 16 公共子网 A 192 168 32 0 20 具有 NAT 网关和到 Internet 网关的路由 0 0 0 0 0 私有子网 A 192 1
  • 不明白 Monitor.Pulse() 的必要性

    根据MSDN http msdn microsoft com en us library ateab679 aspx Monitor Wait 释放对象上的锁并阻塞当前线程 直到它 重新获取锁 然而 我读到的有关 Wait 和 Pulse
  • 如何使用脚本更改 Xcode 11 中的构建设置版本控制?

    由于 Xcode 11 已将版本更改为 MARKETING VERSION 并将构建更改为 CURRENT PROJECT VERSION 构建设置中有新字段 由于以下原因 我如何使用脚本更改此值 xcrun agvtool new ver
  • OpenMP 并行区域中嵌套函数的内部编译器错误

    我尝试调用GSL库的蒙特卡罗积分子程序来进行一些数值计算 因为我的 for 循环相当简单 这意味着不同运行的结果是独立的 所以我预计使用 OpenMP 进行并行化应该非常简单 然而 当我编译它时 它总是显示 内部编译器错误 分段错误 并且什