【问题标题】:Change in a Fortran array results in change of another when using C pointers使用 C 指针时,Fortran 数组的更改会导致另一个数组的更改
【发布时间】:2018-07-15 10:46:32
【问题描述】:

我有使用相同计划的两个数组fg 的 FFTW3 进行 C 型 SIMD 分配。我只是将f 设置为1,然后将g 设置为f,然后将f 归零。这也会归零g

为什么会出现这种情况以及我可以通过哪些方法来确保任何通过切片的派生数组都不会被修改。

我希望fg 指向两个不同的二维双精度内存块。我没有使用通常的显式形状 (double precision, dimension(n,n)) 定义,因为 FFTW3 documentation 声明以这种方式分配的数组处理起来更快。

program main

use,intrinsic::iso_c_binding
implicit none
include 'fftw3.f03'

integer,parameter::n=16
real(C_DOUBLE),pointer::f(:,:),g(:,:)
type(C_PTR)::p

p=fftw_alloc_real(int(n**2,C_SIZE_T))
!i am thinking of these as FFTW plans that store only the stencil to
!allocate space starting from addresses given by real(C_DOUBLE),pointers above.

call c_f_pointer(p,f,[n,n])
call c_f_pointer(p,g,[n,n])

f=1.0d0
print*,sum(f)
g=f

f=0.0d0
print*,sum(g)

call fftw_free(p)
end program

输出是

256.00000000000000     
0.0000000000000000

【问题讨论】:

  • 您已将fg 设置为指向同一事物。你了解它的影响吗(即,Fortran 中的指针如何工作)?
  • 同一个plan p的使用能做到这一点吗?我一直在 fortran 中使用数组声明语句 ALLOCATABLE,DIMENSION()。我确实有指针的一般知识,但不是特定于 Fortran。
  • call c_f_pointer(p,g,[n,n]) 中的错字?
  • c_f_pointer 没有做任何特别的事情(即,它对 FFTW 计划一无所知)。这两个调用只是将fg(在这种情况下)指向与C 指针p 相同的目标。
  • 您能否澄清一下,在问题中(作为edit)您想要发生什么?也就是说,您打算如何使用各种内存方面/指针。事实上,我们可能通过重新使用 FFTW 计划来猜测您的意思(也请考虑下一个遇到相同问题但没有使用 FFTW 而是其他东西的读者)。

标签: arrays fortran fftw


【解决方案1】:

内存分配由fftw_alloc_real完成。您只调用一次,因此只分配了一块内存。 c_f_pointer 不执行任何分配。

c_f_pointer 采用 C 指针,并且指针将 Fortran 指针与 C 指针的目标相关联。当你

call c_f_pointer(p,f,[n,n])
call c_f_pointer(p,g,[n,n])

您将fgp 指向的同一块内存相关联。

只需分配两个不同的部分,两次调用fftw_alloc_real 并将f 指向一个,将g 指向另一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2018-01-02
    • 2016-06-28
    • 2012-09-27
    相关资源
    最近更新 更多