OpenMP 因大型数组而崩溃

2024-04-17

我正在使用 Fortran 和 OpenMP,但当我尝试在存在大型数组时使用 OpenMP 并行化循环时,我不断遇到问题。例如,以下代码:

PROGRAM main
IMPLICIT NONE   
INTEGER, PARAMETER :: NUMLOOPS = 300000
REAL(8) :: TESTMAT(NUMLOOPS)
INTEGER :: i,j

!$OMP PARALLEL SHARED(TESTMAT)
!$OMP DO
DO i=1,NUMLOOPS         
    TESTMAT(i) = i
END DO
!$OMP END DO
!$OMP END PARALLEL

write(*,*) SUM(TESTMAT)/(NUMLOOPS)

END PROGRAM main

使用此 Makefile 编译:

.SUFFIXES: .f90

F90 = gfortran
FFLAGS_PFM = -ffree-form -ffree-line-length-none -fopenmp
LIB = -llapack
OBJ90 = main.o 

main: $(OBJ90)
    $(F90) $(FFLAGS_PFM) -o $@ $(LIB) $(OBJ90)

${OBJ90}: %.o: %.f90
    $(F90) $(FFLAGS_PFM) $(LIB) -c -o $@ $<

在 Windows 机器上使用 gfortran 编译时崩溃。但是,如果我将 NUMLOOPS 值更改为小于 260000 左右,则程序运行得很好。同样,大约 1000x1000 的矩阵会崩溃(事实上,任何高于 500x500 左右的矩阵都不起作用)。因此,使用 OpenMP 时似乎存在允许的最大数组大小?不过我还没有遇到过这样的事情。我在多台 Windows 机器上尝试过,结果相同,但都使用相同的配置,例如带 gfortran 编译器的 Windows 7。代码总是编译没有问题,但运行时崩溃。


指定-fopenmp在 GNU Fortran 中意味着-frecursive这意味着所有局部变量(甚至是大数组)都是自动的(即在堆栈上分配)。在 Windows 上,堆栈大小在 PE 可执行头文件中是固定的,并且必须在链接阶段指定,这与 Unix 系统上的堆栈大小非常不同,在 Unix 系统上堆栈大小可以通过限制机制动态控制。

要增加 Windows 可执行文件的堆栈大小,您可以使用editbin.exe来自 Microsoft 的命令行如下:

editbin /STACK:<size> yourexe.exe

或者向 GCC 提供以下选项:-Wl,--stack,<size in bytes>, where <size in bytes>是所需的堆栈大小(以字节为单位)。您应该将堆栈大小设置为至少足够大以适合整个数组(即8*NUMLOOPS)以及局部变量之类的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenMP 因大型数组而崩溃 的相关文章

  • 将派生类型中的指针分配给 Fortran 中相同类型中的目标

    我想在包含在同一派生类型中的派生类型中分配一个指针 下面的代码给了我下面的错误 这是怎么回事 我该如何解决这个问题 24 zoos i tigers 1 gt zoos i animals 1 1 1 Error Expected boun
  • 在 Fortran 90 中,是否必须事先声明数组维度?

    是否有必要在任何其他代码之前声明数组维度 例如 我编写了以下简化的示例代码 PROGRAM mytest IMPLICIT NONE INTEGER i j k mysum Let array c be a k by k 2 array D
  • Fortran 读取混合字符串和数字数据

    我在读取语句时遇到问题 我更喜欢 Fortran90 尽管如果有帮助的话其他版本也是可能的 我的文件中有一堆数据行 可以描述为 以空格分隔 没有固定的格式 包含一个字符串 后跟 7 个数字 字符串包含正斜杠 这是一个例子 maxele OS
  • 在 Fortran 中读取行数已知但每行条目数未知的数据文件

    如何读取包含已知行数但每行中的条目数未知的数据文件 例如如果我的数据文件包含类似的内容 1 3 4 5 6 7 8 9 1 3 5 6 4 5 6 7 8 3 5 6 7 8 4 5 7 8 即三行 但每行中的数据未知 有一次我需要来自一行
  • 使用 Visual Studio 2013 和 Intel Fortran 编译混合 C++/C 代码

    我正在尝试编译一个简单的 C Fortran 混合程序 但存在链接问题 我使用的是Visual Studio 2013 Ultimate和Intel Visual Fortran Compiler XE 14 该程序非常简单 是从网上的某个
  • 使用 Fortran (CLFORTRAN) 在 OpenCL 中将两个选项作为参数传递

    当我的主机程序采用 C 语言时 我可以传递两个选项作为 OpenCL 函数的参数 例如 我可以通过两个 标志到clCreateBuffer像这样的函数 clCreateBuffer context CL MEM READ ONLY CL M
  • 将 C 字符串数组传递给 Fortran (iso_c_binding)

    如何传递 C 字符串数组 char cstrings 到 Fortran 子程序 问题使用 iso c binding 的 fortran C 桥接器中的字符串数组 https stackoverflow com questions 968
  • Fortran:向文件添加列(即跳过不同数量的水平空格)

    我是 Fortran f90 的初学者 一些看似简单的问题结果却导致严重头痛 感谢您帮助我解决这个问题 我的代码运行一个循环 处理数据并将它们写入文件 我希望将这些数据写入同一文件的列中 直到循环完成 OPEN unit 11 file f
  • Fortran90 数组将空白值读取为 null

    我正在读取外部文本文件的数据 30 行 7 列 每行用 分隔 我缺少表示为 的值 当我将数据读入二维数组时 缺失值被 0 00 替换 但数据中也有 0 00 值 当我计算平均值时 计数 项目数 n 显示为计数 缺失值的数量 我如何动态选择缺
  • 我可以将多个线程分配给 OpenMP 中的代码段吗?

    我正在寻找一种方法来并行执行代码部分 每个部分使用多个线程 例如 如果我有 16 个线程和两个任务 我希望每个线程有 8 个线程同时执行这两个任务 OpenMP 有多种构造 section task 并行执行一般代码 但它们是单线程的 在我
  • Fortran 2003,选择类型以区分“实数”和“实数数组”

    我的问题是 可以select type用块来区分real realInput from real realArrayInput 很清楚如何select type可以用于区分派生类型 但对我来说不太清楚它如何 或是否 可以用于内在类型 在 M
  • fortran中双引号和单引号的区别?

    我刚刚开始使用 Fortran 对双引号和单引号的使用感到困惑 它们是等价的 它们的用法没有区别 您可以使用它来打印引号字符之一 print print 首先打印 进而 注意 您还可以在一行中使用两个引号字符来打印一个 print prin
  • 从 Fortran 字符串中提取单个字符

    我需要一个程序将基数 a 转换为基数 b 其中基数 a 和 b 可以是从 2 到 36 我的想法是使用字符串作为数字 作为中介转换为基数 10 然后从基数 10 转换为基数 b 由于我是 Fortran 新手 我不太理解函数和子字符串 现在
  • 如何包装 fortran write 语句

    我想包装 fortran写语句 http software intel com sites products documentation doclib stdxe 2013 composerxe compiler fortran lin 在
  • OpenMP 线程映射到物理内核

    于是我在网上查了一段时间没有结果 我是 OpenMP 的新手 所以不确定这里的术语 但是有没有办法从 OMPThread 由 omp get thread num 给出 和线程将运行的物理核心找出特定机器的映射 我还对 OMP 分配线程的精
  • Fortran 中的数组第一个索引

    我认为 Fortran 中数组的第一个索引是 1 但是为什么这段代码可以工作呢 代码是 Wavewatch 的修改部分 http polar ncep noaa gov waves wavewatch http polar ncep noa
  • 如何将mortran代码转换为fortran代码

    我有一些 Mortran 代码 来自 glmnet 我想阅读和编译 我知道在编译时 Mortran首先转换为Fortran 然后编译 如果有预处理器的话 如何安装 Mortran 预处理器 特别是 OS X 上的 Mortran3 我在以下
  • 将数组从 .npy 文件读入 Fortran 90

    我使用 Python 以二维数组 例如 X 的形式生成一些初始数据 然后使用 Fortran 对它们进行一些计算 最初 当数组大小约为 10 000 x 10 000 时 np savetxt 在速度方面表现良好 但是一旦我开始增加数组的维
  • 如何在Fortran代码中将二维数组转换为一维数组?

    如何将 r i j 转换为一维数组以便可以轻松地对数字进行排序 program sort implicit none character CN 8 O 7 integer j iconf nconf integer i nbins t in
  • OpenMP:无法并行化嵌套 for 循环

    我想将循环与其中的内循环并行化 我的代码如下所示 pragma omp parallel for private jb ib shared n Nb lb lastBlock jj W WT schedule dynamic private

随机推荐

  • Jfreechart垂直线模糊

    I am using JFreechart to generate some plots and I found the lines in my plot is blurry but the demo shows that all the
  • 我的朋友可以使用我的本地 git 存储库作为他的远程存储库吗?

    我的计算机上有一个本地 git 存储库 有没有可能我的朋友将他的上游设置为我计算机上的本地存储库 而我的本地存储库成为他的远程存储库 所以他将能够从我的本地存储库获取最新的更改并推送到我的本地存储库 我不想使用类似的工具github or
  • Google 地图 v3 创建两点之间的路线

    我正在使用 Google Maps API 开发网络应用程序 我正在尝试在两点之间创建一条路线 但由于某种原因我还没有弄清楚如何创建它 以下是我的代码 如果我缺少什么 请告诉我 谢谢
  • Android viewpager自动滑动

    如何处理 viewpager 页面的自动滑动和手动滑动 即 viewpager 中有一组 10 个页面 每个页面在 3 秒后滑动 但问题是当用户滑动页面时 它会移回到我需要的序列页面 1 gt 如果用户连续滑动两个页面 则不应返回 2 gt
  • 子串超出范围

    我正在尝试从字符串的最后部分中提取数字 我已经编写了一个函数来执行此操作 但遇到索引超出范围的问题 这是字符串 type value cat 1 3 6 1 4 1 26928 1 1 1 2 1 2 1 1 descCat 1 3 6 1
  • 内部类和局部变量

    为什么我需要声明local variable as final if my Inner class需要使用内部定义的方法吗 例子 class MyOuter2 private String x Outer2 void doStuff fin
  • 如何在 iPhone 上进行实时声音/信号处理?

    我可能正在开发一个基于 iPhone 的应用程序 进行近乎实时的声音处理 过滤等 我想知道开始的最佳方式 我想创建一个用于录制和处理声音的音频提示吗 如上所述here http developer apple com iphone libr
  • 在 Android Flash 10.1 上打开软件键盘

    我正在开发在浏览器中运行的移动 Flash 应用程序 不是 AIR 应用程序 根据 Adob e 的说法 Flash Player 10 1 提供支持 使用本机设备虚拟键盘 如果没有物理支持 则使用 TextField 支持 检测到键盘 一
  • jquery-ui 滑块手柄完成位置为 100% 左侧 - 将其放置在滑块之外

    我第一次使用 jQuery ui 滑块 并对一个相当基本的问题感到困惑 设置滑块时 我希望不使用主题 当我从左向右滑动时 滑块手柄的右手位置会跨过滑块 1 个手柄宽度 这是由于滑块 css 将手柄定位为 left 100 我注意到许多其他人
  • 如何从 teamcity 以管理员身份运行 Visual Studio 或 nunit

    我目前正在使用 teamcity 运行我的测试 给出以下错误 设置方法失败 System UnauthorizedAccessException 检索 CLSID 为 0002DF01 0000 0000 C000 的组件的 COM 类工厂
  • AttributeError:“NoneType”对象没有属性“attname”(Django)

    我有一个相当复杂的模型 第一次调用MyModel objects create kwargs 失败了 AttributeError NoneType 对象没有属性 attname 堆栈跟踪如下所示 在 Django 1 11 中 djang
  • 将 onclick 事件添加到动态创建的链接按钮

    我想要完成的是使用 onClick 命令设置动态创建的链接按钮 以便在单击时它将运行后面代码中的方法 这是我的代码 protected void Page Init object sender EventArgs e LoadLeftSid
  • ODP.NET 集成安全性无效连接字符串参数

    我缺少什么
  • C# 中的 SQLite 使用 .GetBytes 抛出“InvalidCastException”

    我正在尝试访问 SQLite DB 中的 Blob 列 该列最终将成为指向文件或内存中记录的指针 我正在尝试使用 SQLite 中的 GetBytes 方法来获取代表我的数据的字节数组 使用此方法时 我不断收到 InvalidCastExc
  • 如何将字符串注入服务工厂?

    我正在尝试将字符串注入服务工厂 但遇到错误TS1206 Decorators are not valid here 我正在使用以下代码 export let serviceFactory http Http Inject TEMPLATE
  • 是否可以刷新控制台(使其立即打印)?

    我使用 Firefox Firebug 来编写一些 Javascript 我尝试记录的文本console log不会立即出现在 Firebug 的控制台中 看起来它堆积在某个缓冲区中 然后分块刷新到控制台 我有一个函数可以生成一些log来电
  • 如何在 C# 中使用 Lambda 中的 AWS Elasticache

    我搜索了又搜索 但无法找到包含上述所有内容的教程 示例 演练 我正在尝试用 C 编写一个 Lambda 函数 该函数使用一些 ElastiCache 存储 我可以找到从 C 访问 ElastiCache 的示例 但我发现引用的每个库都无法与
  • 如何使用javascript在运行时更改滚动条CSS?

    是否可以通过单击按钮在运行时更改滚动条的 css 例如颜色 这只需要在 Google Chrome 中工作 所以我使用 webkit scrollbar width 15px webkit scrollbar thumb backgroun
  • 在 Visual Studio Code 中自定义链接/URL 语法突出显示颜色?

    我正在创建自己的 Visual Studio Code 主题 我希望链接 URL 在 HTML 和 CSS 中拥有自己独立的颜色 从我读到的内容看来 这曾经是通过检测到的链接完成的 但现在应该使用 linkForeground 我在创建的
  • OpenMP 因大型数组而崩溃

    我正在使用 Fortran 和 OpenMP 但当我尝试在存在大型数组时使用 OpenMP 并行化循环时 我不断遇到问题 例如 以下代码 PROGRAM main IMPLICIT NONE INTEGER PARAMETER NUMLOO