3

我正在尝试使用 iso_c_bindings 模块将 Fortran 2003 绑定编写到 CUFFT 库,但我遇到了cufftPlanMany子例程问题(类似于sfftw_plan_many_dftFFTW 库中的问题)。

绑定本身如下所示:


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! cufftResult cufftPlanMany(cufftHandle *plan, int rank, int *n,
!                           int *inembed, int istride, int idist,
!                           int *onembed, int ostride, int odist,
!                           cufftType type, int batch)
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

interface cufftPlanMany
subroutine cufftPlanMany(plan, rank, n, &
                         inembed, istride, idist, &
                         onembed, ostride, odist, &
                         type, batch) &
& bind(C,name='cufftPlanMany')
use iso_c_binding
integer(c_int):: plan
integer(c_int),value:: rank, type, batch
integer(c_int):: n(*)
integer(c_int),value:: istride, idist, ostride, odist
integer(c_int):: inembed(*), onembed(*)
end subroutine cufftPlanMany
end interface cufftPlanMany

调用部分如下所示:


  integer(c_int):: plan
  integer(c_int):: batch
  integer(c_size_t):: size

! ...

    call cufftPlanMany(plan, 1, size,&
                       0, 1, size,&
                       0, 1, size,&
                       CUFFT_C2C, batch)

不幸的是,试图编译这个结果

错误:在 (1) 处没有通用“cufftplanmany”的特定子程序

编译错误。尝试使用变量代替常量也无济于事。你能帮忙调试一下吗?

使用的编译器是gfortran:GNU Fortran (Gentoo 4.4.5 p1.2, pie-0.4.5) 4.4.5

4

2 回答 2

8

您有一个通用(命名)接口。

错误消息通常意味着您的某些论点是错误的。

一般来说,当你知道要调用泛型接口的具体过程时,尽量直接调用,而不是通过泛型名称。您将收到另一条错误消息,它会告诉您哪个参数是错误的。为此,您需要区分通用名称和特定名称。


您的具体情况:

你为什么要声明n, inembed, onembed为数组,什么时候应该是int*,例如。刚刚integer从 Fortran 传递过来?此外,您不应该互换intsize_tsize_t通常是 64 位和int32 位,但它们在一般情况下根本不一样,应该加以区分。

于 2011-11-08T08:34:12.327 回答
4

尝试给接口和子程序不同的名称,即重命名接口。

于 2011-11-08T07:01:02.773 回答