Cray 指针和数组的分段错误:我做错了啥?

     2023-02-22     177

关键词:

【中文标题】Cray 指针和数组的分段错误:我做错了啥?【英文标题】:Segmentation fault with cray pointers and arrays: What am I doing wrong?Cray 指针和数组的分段错误:我做错了什么? 【发布时间】:2020-03-13 15:32:44 【问题描述】:

我的代码很复杂,但以下 MWE Fortran 程序显示了该问题并导致 Intel Fortran 18.0.5 中出现分段错误。

     forrtl: severe (174): SIGSEGV, segmentation fault occurred

回溯显示在调用 NN= malloc(nsize) 的 malloc() 期间出现问题

它还会导致 gfortran 出现以下错误

    ./a.out: free(): invalid next size (fast): 0x0000000000603b40 ***

源码为:

      program test
  c         this program tests memory allocation

      read(*,*)k
      call  test_cray(k)
      end

      subroutine test_cray(k)
  #ifdef BIT64
      integer*8 NN, nsize
  #endif
      real x(*)
      real*8 prob(k,k, 128, 128)
      real*8 prob1(k,k, 128, 128)
      real*8 prob2(k,k, 128, 128)
      pointer(NN , x)
      nsize =   k*4*128*128
      nsize =20
      NN= malloc(nsize)
      do i =1, 20
      x(i)=0.1*(i-1)
      end do
      NN =loc(x)
      write(*,*) NN
      !write(*,*) "shape of x=", shape(x)
      call shape_cray(NN)
      write(*,*)"shape_cray returned"
      end
      subroutine shape_cray(NN )
      real y
        pointer(nx , y)

     do i =1, 20
        nx = NN + (i-1)*4
         write(*,*)nx,  y
     end do

      write(*,*) NN
      write(*,*) "shape of y=", shape(y)
      write(*,*) "y=", y
      end

请注意,程序中的空格必须针对降价进行调整。没有分段错误的正确方法是什么?

这是输出:

    prompt> ifort -g -O0 -traceback -DBIT64 -mcmodel=large cray_test1.F
    prompt> ./a.out
      128
      forrtl: severe (174): SIGSEGV, segmentation fault occurred
      Image              PC                Routine            Line   Source 
      libifcoremt.so.5   00007F70F617F49C  for__signal_handl Unknown  Unknown
      libpthread-2.12.s  00000034A2C0F790      Unknown      Unknown  Unknown
      a.out              0000000000400C3B  test_cray_                 19  cray_test1.F
    a.out              000000000040097D  MAIN__          5  cray_test1.F
    a.out              00000000004008CE  Unknown               Unknown  Unknown
    libc-2.12.so       00000034A241ED5D  __libc_start_main     Unknown  Unknown
    a.out              00000000004007D9  Unknown               Unknown  Unknown

我用k=120

【问题讨论】:

有什么理由不能使用标准的 Fortran 来执行此操作吗?可分配数组比您尝试使用的过时的、非标准的东西要容易得多。 那么 complete 输出是什么?它停在哪里?您仍然打印哪些行? NN =loc(x)的目的是什么? @IanBush 我正在尝试改进手动管理内存的旧代码。为了制作 F90,我需要更改太多代码并且之前失败并放弃了 @VladimirF loc(x) 检索 x 的地址。我将添加输出。也许像你这样的专家可以解释发生了什么 尝试使用 -Wall 和 gfortran 编译您的代码。一旦你修复了警告/错误。你可能会有更好的运气得到你想要的结果。作为额外的奖励,您犯了隐式类型的主要罪行。添加IMPLICIT NONE 【参考方案1】:

正确答案是“不要使用 Cray 指针。使用可分配的实体”。但鉴于可能正在使用和更新遗留代码。这修复了您的示例并使代码现代化。注意,我没有使用contains 子程序,也没有提供接口语句。所以,你仍然有隐式接口。

  program test
     implicit none
     integer k
     read(*,*) k
     if (k > 0) call test_cray(k)
  end

  subroutine test_cray(k)

     use iso_c_binding, only : c_intptr_t

     implicit none

     integer, intent(in) :: k

     integer(c_intptr_t) nn
     integer i, nsize
     real x(*)
     pointer(nn, x)

     nsize = k
     nn = malloc(nsize)
     x(1:nsize) = 0.1 * [(i - 1, i = 1, nsize)]
     nn = loc(x)
     write(*,*) nn

     call shape_cray(nn, nsize)

  end subroutine test_cray

  subroutine shape_cray(nn, nsize)

     use iso_c_binding, only : c_intptr_t

     implicit none

     integer(c_intptr_t), intent(in) :: nn
     integer, intent(in) :: nsize

     real y
     integer i
     pointer(nx, y)

     do i = 1, nsize
        nx = nn + (i - 1) * 4  ! Assumes REAL is 4 bytes.
        write(*,*) nx, y
     end do

     write(*,*) nn
     write(*,*) "shape of y = ", shape(y)
     write(*,*) "y = ", y
  end subroutine shape_cray

使用 gfortran 这给出了

gfcx -o z -fcray-pointer a.f
./z
2
671645728
671645728   0.00000000    
671645732  0.100000001    
671645728
shape of y = 
y =   0.100000001    

【讨论】:

Firestore - 我做错了啥?

...是,我在Text(self.data.data.specialty)->应用程序崩溃中遇到错误。在cloudStore中,我有:集合“SpecialtiesData”, 查看详情

所有 KIF 测试步骤都抛出相同的错误,我做错了啥?

】所有KIF测试步骤都抛出相同的错误,我做错了啥?【英文标题】:AllKIFteststepsarethrowingthesameerror,whatamIdoingwrong?所有KIF测试步骤都抛出相同的错误,我做错了什么?【发布时间】:2013-08-3018:04:22【问题描述】:运行我的KIF目标时... 查看详情

React 将受控错误变为不受控制的错误让我发疯,我做错了啥?

】React将受控错误变为不受控制的错误让我发疯,我做错了啥?【英文标题】:React\'schangingcontrolledtouncontrollederrordrivingmecrazy,whatamIdoingwrong?React将受控错误变为不受控制的错误让我发疯,我做错了什么?【发布时间】:2019-05-0800:0... 查看详情

Gmail API 中的 VacationSettings.endTime 转换为错误的日期 - 是错误还是我做错了啥?

】GmailAPI中的VacationSettings.endTime转换为错误的日期-是错误还是我做错了啥?【英文标题】:VacationSettings.endTimeinGmailAPIisconvertingtothewrongdate--isitabugoramIdoingsomethingwrong?GmailAPI中的VacationSettings.endTime转换为错误的日期-是错误还是我做... 查看详情

使用回溯创建给定列表的排列列表:我做错了啥?

...题描述】:我正在尝试解决以下问题:给定一个由不同整数组成的数组,返回所有可能的排列。您可以按任意顺序返回答案。我已经实现了一个使用 查看详情

Java 使用数组比 C++ 中的 std::vector 快 8 倍。我做错了啥?

】Java使用数组比C++中的std::vector快8倍。我做错了啥?【英文标题】:Java8timesfasterwitharraysthanstd::vectorinC++.WhatdidIdowrong?Java使用数组比C++中的std::vector快8倍。我做错了什么?【发布时间】:2015-06-2119:01:53【问题描述】:我有以下Java... 查看详情

JSON.parse,我做错了啥?

...解析一些JSON。这感觉它应该可以工作,但我遇到了一个错误。这是函数调用:JSON.parse("player:\'green\',direction:\'north\'");这是错误VM15 查看详情

sectionName TableView - 我做错了啥?

】sectionNameTableView-我做错了啥?【英文标题】:sectionNameTableView-WhatamIdoingwrong?sectionNameTableView-我做错了什么?【发布时间】:2012-06-2708:19:43【问题描述】:我在更改TableView上的颜色和字体时遇到了一些麻烦,我已将其分成4个部... 查看详情

SQL主键分配错误..不确定我做错了啥? [关闭]

】SQL主键分配错误..不确定我做错了啥?[关闭]【英文标题】:SQLprimarykeyiswrongforassignment..notsurewhatIdidwrong?[closed]SQL主键分配错误..不确定我做错了什么?[关闭]【发布时间】:2022-01-0604:16:42【问题描述】:我从一个网站上复制了这... 查看详情

这个 GraphQL 查询我做错了啥?

】这个GraphQL查询我做错了啥?【英文标题】:WhatamIdoingwrongwiththisGraphQLquery?这个GraphQL查询我做错了什么?【发布时间】:2017-12-2621:27:48【问题描述】:我是GraphQL的新手,我正在尝试进行突变以从我的数据库中删除一篇文章,但... 查看详情

创建这个动态生成的表时我做错了啥?

...布时间】:2022-01-1903:18:47【问题描述】:对于任何简单的错误,我深表歉意,这是我的第一篇StackOverflow帖子,我对编码比较陌生。我正在尝试创建一个使用DOM元素显示动态生成的表格的网站。此表的行和列已使用DO 查看详情

子进程和 Python 我做错了啥? [复制]

】子进程和Python我做错了啥?[复制]【英文标题】:Subprocess&PythonwhatamIdoingwrong?[duplicate]子进程和Python我做错了什么?[复制]【发布时间】:2021-12-0322:13:44【问题描述】:我无法对这个做出正面或反面。尝试在python脚本中使用子... 查看详情

波形写入功能不起作用,我做错了啥?

...读取部分工作正常,直到f.close(),然后wave.write部分导致错误。importwaveimpo 查看详情

在 super.viewDidLoad() 之前和之后不同的 UIImageView.frame.size :我做错了啥?

】在super.viewDidLoad()之前和之后不同的UIImageView.frame.size:我做错了啥?【英文标题】:DifferentUIImageView.frame.sizebeforeandaftersuper.viewDidLoad():whatamIdoingwrong?在super.viewDidLoad()之前和之后不同的UIImageView.frame.size:我做错了什么?【发布时... 查看详情

淘汰赛验证异步验证器:这是一个错误还是我做错了啥?

】淘汰赛验证异步验证器:这是一个错误还是我做错了啥?【英文标题】:KnockoutValidationasyncvalidators:IsthisabugoramIdoingsomethingwrong?淘汰赛验证异步验证器:这是一个错误还是我做错了什么?【发布时间】:2012-09-2504:12:38【问题描述... 查看详情

核心数据多线程——我做错了啥

】核心数据多线程——我做错了啥【英文标题】:CoreDatamultithreading--whatamIdoingwrong核心数据多线程——我做错了什么【发布时间】:2014-02-0621:14:54【问题描述】:我会尽量保持简短,但基本上,我有一个应用程序,在某种模式下... 查看详情

QTreeView 的 QAbstractItemModel:我做错了啥?

】QTreeView的QAbstractItemModel:我做错了啥?【英文标题】:QAbstractItemModelforQTreeView:whatanIdoingwrong?QTreeView的QAbstractItemModel:我做错了什么?【发布时间】:2017-03-0211:18:05【问题描述】:我想创建一个子类QAbstractItemModel以在QTreeView中... 查看详情

Httpservlet错误404,不确定我做错了啥我已经尝试了所有解决方案

】Httpservlet错误404,不确定我做错了啥我已经尝试了所有解决方案【英文标题】:Httpservleterror404,notsurewhatIamdoingwrongIhavetriedallthesolutionsHttpservlet错误404,不确定我做错了什么我已经尝试了所有解决方案【发布时间】:2019-10-1901:24:0... 查看详情