Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.

error #6284: There is no matching specific function for this generic function reference. [DFTICOMPUTEFORWARD]

Amy_L_
Beginner
3,172 Views

Hi!

   I have the questions:I want to use the FFT, but now the errors appeared, I don't know how to deal whit them .Can you tell me the reasons of the errors,and tell me how to deal with them.

Thank you !

0 Kudos
1 Solution
Dmitry_B_Intel
Employee
3,172 Views
Amy, Compiler expects that a one-dimensional array is given as the second argument to DftiComputeForward function. It complaints because HzExten is 2D. You can fool the compiler into thinking that HzExten is 1D by the following syntax: status = DftiComputeForward(FFT_handle, HzExten( : , 1 ) ) This will work because a reference to the data is passed to the function anyway. Thanks Dima

View solution in original post

0 Kudos
17 Replies
mecej4
Honored Contributor III
3,172 Views

The arguments that you are trying to pass to the routine do not match any of the correct combinations. In order to give you a specific answer, we need to see the list of actual arguments, their declarations, and information about USE statements/interface blocks in the calling subprogram. If the code is of moderate size, you may post it as-is.

0 Kudos
Amy_L_
Beginner
3,172 Views

Thank you answer my question. My code as followings:

 integer ii,jj
 complex*8:: HzExten(Nx,Ny),ExTenFactHx(Nx,Ny),ExtenFactHy(Nx,Ny),HzExten_X(Nx,Ny),HzExten_Y(Nx,Ny)
  type(DFTI_DESCRIPTOR),pointer:: FFT_handle
  status=DftiCreateDescriptor(FFT_handle,DFTI_DOUBLE,DFTI_COMPLEX,2,L)
  status=DftiCommitDescriptor(FFT_handle)
  status=DftiComputeForward(FFT_handle,HzExten)
  status=DftiFreeDescriptor(FFT_handle)

And then I do the inverse transformation, the same errors appeared.The followings are the errors: 

error #6284: There is no matching specific function for this generic function reference.   [DFTICOMPUTEFORWARD]
error #6284: There is no matching specific function for this generic function reference.   [DFTICOMPUTEBACKWARD]

Look forward your message.
 

0 Kudos
Dmitry_B_Intel
Employee
3,173 Views
Amy, Compiler expects that a one-dimensional array is given as the second argument to DftiComputeForward function. It complaints because HzExten is 2D. You can fool the compiler into thinking that HzExten is 1D by the following syntax: status = DftiComputeForward(FFT_handle, HzExten( : , 1 ) ) This will work because a reference to the data is passed to the function anyway. Thanks Dima
0 Kudos
Dmitry_B_Intel
Employee
3,172 Views
Amy, Compiler expects that a one-dimensional array is given as the second argument to DftiComputeForward function. It complaints because HzExten is 2D. You can fool the compiler into thinking that HzExten is 1D by the following syntax: status = DftiComputeForward(FFT_handle, HzExten( : , 1 ) ) This will work because a reference to the data is passed to the function anyway. Thanks Dima
0 Kudos
Amy_L_
Beginner
3,172 Views

Dima,

Thank you very much,the errors were dealed.

Thanks,

Amy

0 Kudos
Amy_L_
Beginner
3,172 Views

Dear Dima,

When I follow your advice I deal with the errors,but the new questions appeared:

/tmp/ifortboJ6Hx.o: In function `iteration_':
ground.f90:(.text+0x9d45): undefined reference to `dfti_create_descriptor_highd'
ground.f90:(.text+0x9d4f): undefined reference to `dfti_commit_descriptor_external'
ground.f90:(.text+0x9d86): undefined reference to `dfti_compute_forward_c'
ground.f90:(.text+0x9daa): undefined reference to `dfti_free_descriptor_external'
ground.f90:(.text+0x9e45): undefined reference to `dfti_create_descriptor_highd'
ground.f90:(.text+0x9e4f): undefined reference to `dfti_commit_descriptor_external'
ground.f90:(.text+0x9e8b): undefined reference to `dfti_compute_backward_c'
ground.f90:(.text+0x9e99): undefined reference to `dfti_compute_backward_c'
ground.f90:(.text+0x9eb3): undefined reference to `dfti_free_descriptor_external'
/tmp/ifortboJ6Hx.o: In function `continuation_hz2hxhy_mkl_':
ground.f90:(.text+0x18bd1): undefined reference to `dfti_create_descriptor_highd'
ground.f90:(.text+0x18bdb): undefined reference to `dfti_commit_descriptor_external'
ground.f90:(.text+0x18bfd): undefined reference to `dfti_compute_forward_c'
ground.f90:(.text+0x18c13): undefined reference to `dfti_free_descriptor_external'
ground.f90:(.text+0x18cb6): undefined reference to `dfti_create_descriptor_highd'
ground.f90:(.text+0x18cc0): undefined reference to `dfti_commit_descriptor_external'
ground.f90:(.text+0x18ce7): undefined reference to `dfti_compute_backward_c'
ground.f90:(.text+0x18cf4): undefined reference to `dfti_compute_backward_c'
ground.f90:(.text+0x18d0f): undefined reference to `dfti_free_descriptor_external'
make: *** [ground.out] 错误 1

Can you give me some ideas?

Thanks,

Amy

 

0 Kudos
mecej4
Honored Contributor III
3,172 Views

Please state the options used in the command line for building the executable. Did you use -mkl, for example?

0 Kudos
Amy_L_
Beginner
3,171 Views

Yes,I use the mkl.

  use MKL_DFTI

 status=DftiCreateDescriptor(FFT_handle,DFTI_DOUBLE,DFTI_COMPLEX,2,L)
   status=DftiCommitDescriptor(FFT_handle)
 do i=1,Ny
 status=DftiComputeForward(FFT_handle,HzExten(:,i))
 end do
  status=DftiFreeDescriptor(FFT_handle)

And at the top of the program,I write the 'Include mkl_dfti.f90'to use the mkl.

Can you give me some advice?

Thanks,

Amy

 

0 Kudos
mecej4
Honored Contributor III
3,171 Views

The MKL library is not linked unless you ask for it, and a USE statement in the source does not necessarily cause passing any instructions to the linker. Please describe the method by which you attempted to build the program when you saw the linker errors listed in #7. Please answer the questions in #8.

 

0 Kudos
Amy_L_
Beginner
3,171 Views

Sorry,I can't understand your ideas clearly,I just use the statement to ask for the MKL library like the #9.Can you tell me the wrong with my codes?

Thanks

0 Kudos
mecej4
Honored Contributor III
3,171 Views

A number of files of several categories must exist or be created, available and accessible in order to build an application.

INCLUDE source files are used by the compiler (or preprocessor pass, if applicable). Module files must be present (they are created when their source fies are compiled) before the compiler can operate on sources containing USE statements. Object files must be present for linking to work, and some needed objects may be present in libraries rather than as separate objects. Some libraries are specified for every build when you use the Fortran  compiler driver to do the link step, but the MKL libraries are not in that category. However, there is an easy-to-use compiler option, "-mkl", that serves to include the necessary library files in simple applications. For more elaborate projects, the MKL Link Line Advisor is provided.

From what I gather from your post, you have not used the -mkl option of the compiler driver, nor have you specified the MKL libraries explicitly. There is nothing wrong with your code as far as I can see, but you seem to assume that having a "USE mkl_dfti" statement is going to cause the MKL libraries to be linked in. That is not true.

Please consult the MKL documentation or answer the question that I asked in #8 if you want more help on how to build.

0 Kudos
Amy_L_
Beginner
3,171 Views

Dear mecej4,

Thanks for the answers. I need your help very much. But I just know the"USE mkl_dfti" ,I really don't know the command line for building the executable. I also link the mkl by the "INCLUDE mkl_dfti.f90".Sorry,I use the mkl first time, I almost don't know anything. Give you so many troubles.Can you tell me how to do or tell me the MKL documentation where I can get.

Thanks,

Amy

0 Kudos
Dmitry_B_Intel
Employee
3,172 Views

Amy,

Looks like you use 'make' to build the executable. If you add flag '-n' to the 'make' command line, it will print the commands it would run to build the executable, without actually executing the commands. Thus you could see the command line that produces the error you've shown in #7. This build command should contain flag '-mkl' near the end of the command line, or other flags that tell the compiler 'icl' how to include MKL into the executable.

Thanks
Dima

0 Kudos
Amy_L_
Beginner
3,172 Views

Thanks for your ideas,but I try to use "make -mkl"or 'icl',the result doesn't good.I alse can't deal the problems.Can you tell me how to write?

Thanks,

Amy

0 Kudos
mecej4
Honored Contributor III
3,172 Views

So, are you, as Dmitry guessed, using make to build your program rather than calling ifort directly? It is important for you to communicate details about what you tried to do to build the program.

If you are doing builds through make, adding -mkl as an option to the make invocation will not work, because -mkl not an option that make knows anything about. Rather, the -mkl option should be given to the compiler driver.

You have to modify the makefile ("makefile", "Makefile" or another name that you have not told us about); find the line that contains "ifort" but not "-c", and add -mkl to that line. Or, post the makefile and we can see for ourselves.

Dmitry may have thought that you were working with C programs, which is why he mentioned "icl". You would use "ifort" with Fortran programs.

0 Kudos
Amy_L_
Beginner
3,172 Views

Oh,I know what your means

thank you very much!

Amy

0 Kudos
Tavassoli__Arash
Beginner
3,172 Views

I get exactly the same error but obviously my problem is not what Amy  L had. Can you please help me in this regard? Thanks in advance

program FFT_Poisson
Use MKL_DFTI 
IMPLICIT NONE
REAL, PARAMETER :: n=1000, pi=3.14159265359  
real(8) :: xl,dx !x length, x grid spacing
real(8) :: x(0:n-1), wk(0:n-1), E(0:n-1), RHO(0:n-1)
complex :: FFT_RHO(0:n-1)
type(DFTI_DESCRIPTOR), pointer :: desc_handl
Integer :: status
integer :: i

xl=600
dx=xl/n

DO i=0,n-1
    x(i)=i*dx
    wk(i)=2*(pi/xl)*i
    rho(i)=sin(2*(pi/xl)*x(i))+cos(3*2*(pi/xl)*x(i))-sin(10*2*(pi/xl)*x(i))
END DO

status = DftiCreateDescriptor(desc_handl, DFTI_DOUBLE, DFTI_COMPLEX, 1, INT(n))
status = DftiSetValue(desc_handl, DFTI_PLACEMENT, DFTI_NOT_INPLACE)
status = DftiCommitDescriptor(desc_handl)
status = DftiComputeForward(desc_handl, RHO, FFT_RHO)
status = DftiFreeDescriptor(desc_handl)

end program FFT_Poisson

0 Kudos
Reply