CULA_DGEMM not found in R17 using FORTRAN
5 posts
• Page 1 of 1
CULA_DGEMM not found in R17 using FORTRAN
I migrated to R17 cula dense library. But now, when I compile my source I obtain this message about CULA_DGEMM : undefined reference to `cula_dgemm_'
To test I adapted the FortranInterface example like this :
*
* CULA Example: Fortran Interface
*
* This example is meant to show a typical program flow when using CULA's
* fortran interface. Data resides in host memory and is automatically
* transferred to and from the GPU as needed.
*
* 1. Initialize CULA with CULA_INITIALIZE
* 2. Call CULA_SGEQRF
* 3. Call CULA_SHUTDOWN to free resources
*
* After each CULA operation, the status of CULA is checked. On failure, an
* error message is printed and the program exits.
*
* Note: this example performs the QR factorization on a matrix of zeros, the
* result of which is a matrix of zeros, due to the omission of ones across the
* diagonal of the upper-diagonal unitary Q.
*
PROGRAM CULA_TEST
use CULA_STATUS
use CULA_LAPACK
INTRINSIC MAX, MIN
INTEGER M, N, K, STATUS, L
PARAMETER ( M = 8192, N = 8192, K = 8192 )
REAL A(M, N)
REAL TAU(K)
REAL*8 AA(3,3), BB(3,3), CC(3,3), ALPHA, BETA
AA(1,1) = 1.
AA(2,1) = 1.
AA(3,1) = 1.
AA(1,2) = 1.
AA(2,2) = 1.
AA(3,2) = 1.
AA(1,3) = 1.
AA(2,3) = 1.
AA(3,3) = 1.
BB(1,1) = 1.
BB(2,1) = 1.
BB(3,1) = 1.
BB(1,2) = 1.
BB(2,2) = 1.
BB(3,2) = 1.
BB(1,3) = 1.
BB(2,3) = 1.
BB(3,3) = 1.
CC(1,1) = 1.
CC(2,1) = 1.
CC(3,1) = 1.
CC(1,2) = 1.
CC(2,2) = 1.
CC(3,2) = 1.
CC(1,3) = 1.
CC(2,3) = 1.
CC(3,3) = 1.
L = 3
WRITE(*,*) 'Initializing CULA'
STATUS = CULA_INITIALIZE()
CALL CULA_CHECK_STATUS(STATUS)
WRITE(*,*) 'Calling CULA_SGEQRF'
STATUS = CULA_SGEQRF(M, N, A, M, TAU)
CALL CULA_CHECK_STATUS(STATUS)
ALPHA = 1.
BETA = 1.
STATUS = CULA_DGEMM('N', 'N', L, L, L, ALPHA, AA, L, BB,
* L, BETA, CC, L)
WRITE(*,*) CC(1,1), CC(1,2), CC(1,3)
WRITE(*,*) 'Shutting down CULA'
CALL CULA_SHUTDOWN()
END
I used the Makefile, and I obtained the same message : fortranInterface.f:(.text+0x28b): undefined reference to `cula_dgemm_'
The same example in R16 works fine !
Have you an idea ?
Many thanks in advance
To test I adapted the FortranInterface example like this :
*
* CULA Example: Fortran Interface
*
* This example is meant to show a typical program flow when using CULA's
* fortran interface. Data resides in host memory and is automatically
* transferred to and from the GPU as needed.
*
* 1. Initialize CULA with CULA_INITIALIZE
* 2. Call CULA_SGEQRF
* 3. Call CULA_SHUTDOWN to free resources
*
* After each CULA operation, the status of CULA is checked. On failure, an
* error message is printed and the program exits.
*
* Note: this example performs the QR factorization on a matrix of zeros, the
* result of which is a matrix of zeros, due to the omission of ones across the
* diagonal of the upper-diagonal unitary Q.
*
PROGRAM CULA_TEST
use CULA_STATUS
use CULA_LAPACK
INTRINSIC MAX, MIN
INTEGER M, N, K, STATUS, L
PARAMETER ( M = 8192, N = 8192, K = 8192 )
REAL A(M, N)
REAL TAU(K)
REAL*8 AA(3,3), BB(3,3), CC(3,3), ALPHA, BETA
AA(1,1) = 1.
AA(2,1) = 1.
AA(3,1) = 1.
AA(1,2) = 1.
AA(2,2) = 1.
AA(3,2) = 1.
AA(1,3) = 1.
AA(2,3) = 1.
AA(3,3) = 1.
BB(1,1) = 1.
BB(2,1) = 1.
BB(3,1) = 1.
BB(1,2) = 1.
BB(2,2) = 1.
BB(3,2) = 1.
BB(1,3) = 1.
BB(2,3) = 1.
BB(3,3) = 1.
CC(1,1) = 1.
CC(2,1) = 1.
CC(3,1) = 1.
CC(1,2) = 1.
CC(2,2) = 1.
CC(3,2) = 1.
CC(1,3) = 1.
CC(2,3) = 1.
CC(3,3) = 1.
L = 3
WRITE(*,*) 'Initializing CULA'
STATUS = CULA_INITIALIZE()
CALL CULA_CHECK_STATUS(STATUS)
WRITE(*,*) 'Calling CULA_SGEQRF'
STATUS = CULA_SGEQRF(M, N, A, M, TAU)
CALL CULA_CHECK_STATUS(STATUS)
ALPHA = 1.
BETA = 1.
STATUS = CULA_DGEMM('N', 'N', L, L, L, ALPHA, AA, L, BB,
* L, BETA, CC, L)
WRITE(*,*) CC(1,1), CC(1,2), CC(1,3)
WRITE(*,*) 'Shutting down CULA'
CALL CULA_SHUTDOWN()
END
I used the Makefile, and I obtained the same message : fortranInterface.f:(.text+0x28b): undefined reference to `cula_dgemm_'
The same example in R16 works fine !
Have you an idea ?
Many thanks in advance
- quinioue
- CULA Academic
- Posts: 9
- Joined: Tue Feb 23, 2010 3:27 am
Re: CULA_DGEMM not found in R17 using FORTRAN
The Fortran modules were unchanged for R17, so I'm not sure why this would have worked in R16. I don't believe we've ever had a module file for BLAS, to my memory. You can easily add the declaration though, following the cula_lapack.f90 file as an example.
(This may have worked in R15 when we supported implicit linking from Fortran, but that proved unsafe and not very portable.)
(This may have worked in R15 when we supported implicit linking from Fortran, but that proved unsafe and not very portable.)
- john
- Administrator
- Posts: 587
- Joined: Thu Jul 23, 2009 2:31 pm
Re: CULA_DGEMM not found in R17 using FORTRAN
Many thanks John, I simply added the declaration of the function and all works fine.
I don't know why, but in my configuration this declaration was not necessary in R16.
I don't know why, but in my configuration this declaration was not necessary in R16.
- quinioue
- CULA Academic
- Posts: 9
- Joined: Tue Feb 23, 2010 3:27 am
Re: CULA_DGEMM not found in R17 using FORTRAN
I'm having similar problems.
1. Can you show me how you declared cula_dgemm?
2. How do I declare the modules besides a 'use' statement?
/opt/nn/s4/./s3.f:406: undefined reference to `cula_status_cula_check_status_'
/opt/nn/s4/./s3.f:406: undefined reference to `cula_dgemm_'
s3.o: In function `.STATICS1':
s3.f:(.data+0x280): undefined reference to `cula_status_'
s3.f:(.data+0x288): undefined reference to `cula_lapack_'
s3.f:(.data+0x298): undefined reference to `cula_type_'
pgacclnk: child process exit status 1: /usr/bin/ld
1. Can you show me how you declared cula_dgemm?
2. How do I declare the modules besides a 'use' statement?
/opt/nn/s4/./s3.f:406: undefined reference to `cula_status_cula_check_status_'
/opt/nn/s4/./s3.f:406: undefined reference to `cula_dgemm_'
s3.o: In function `.STATICS1':
s3.f:(.data+0x280): undefined reference to `cula_status_'
s3.f:(.data+0x288): undefined reference to `cula_lapack_'
s3.f:(.data+0x298): undefined reference to `cula_type_'
pgacclnk: child process exit status 1: /usr/bin/ld
- bub2357
- Posts: 4
- Joined: Mon Oct 27, 2014 12:27 pm
Re: CULA_DGEMM not found in R17 using FORTRAN
I have just add these lines to cula_lapack.f90 :
interface
integer(C_INT) function cula_dgemm(transa,transb,m,n,k,alpha,a,lda,b,ldb,beta,c,ldc) &
BIND(C,NAME="culaDgemm")
! Consult the API Reference for all array sizes
use ISO_C_BINDING
character(C_CHAR), value :: transa
character(C_CHAR), value :: transb
integer(C_INT), value :: m
integer(C_INT), value :: n
integer(C_INT), value :: k
real(C_DOUBLE), value :: alpha
integer(C_INT), value :: lda
real(C_DOUBLE), dimension(lda,*) :: a
integer(C_INT), value :: ldb
real(C_DOUBLE), dimension(ldb,*) :: b
real(C_DOUBLE), value :: beta
integer(C_INT), value :: ldc
real(C_DOUBLE), dimension(ldc,*) :: c
end function
end interface
interface
integer(C_INT) function cula_dgemm(transa,transb,m,n,k,alpha,a,lda,b,ldb,beta,c,ldc) &
BIND(C,NAME="culaDgemm")
! Consult the API Reference for all array sizes
use ISO_C_BINDING
character(C_CHAR), value :: transa
character(C_CHAR), value :: transb
integer(C_INT), value :: m
integer(C_INT), value :: n
integer(C_INT), value :: k
real(C_DOUBLE), value :: alpha
integer(C_INT), value :: lda
real(C_DOUBLE), dimension(lda,*) :: a
integer(C_INT), value :: ldb
real(C_DOUBLE), dimension(ldb,*) :: b
real(C_DOUBLE), value :: beta
integer(C_INT), value :: ldc
real(C_DOUBLE), dimension(ldc,*) :: c
end function
end interface
- quinioue
- CULA Academic
- Posts: 9
- Joined: Tue Feb 23, 2010 3:27 am
5 posts
• Page 1 of 1
Who is online
Users browsing this forum: No registered users and 0 guests