Я тестировал функцию cusparse GTSV, чтобы использовать ее в своем исследовательском проекте, который включает в себя решение множества TDMA.Я опробовал пример кода CUDA FORTRAN с функцией cusparse.Это соответствует всем хорошо, но я наблюдаю ошибочный вывод.Поэтому я проверил состояние операций и увидел это в своих выходных данных:
PGI $ ./test_cuda_cusparse.exe CREATE cusparseCreate_status: CUSPARSE_STATUS_SUCCESS
Dgtsv СОСТОЯНИЕ: CUSPARSE_STID_6 * * * 100%это: SOL (1): 1,000000000000000 SOL (2): 2.000000000000000 SOL (3): 3.000000000000000 SOL (4): 4.000000000000000 SOL (5): 5.000000000000000 SOL (6): 6.000000000000000 SOL (7): 7.0000000000000 SOL (8)SOL (9): 9.000000000000000 SOL (10): 10.00000000000000 SOL (11): 11.00000000000000 SOL (12): 12.00000000000000 SOL (13): 13.00000000000000 SOL (14): 14.00000000000000 SOL (15):
15.000000000000 SOL16,00000000000000 SOL (17): 15,00000000000000 SOL (18): 14,00000000000000 SOL (19): 13,00000000000000 SOL (20):
12,00000000000000 SOL (21): 11,00000000000000 SOL (22): 10,000000000000 SOL (23): 9: 8,000000000000000 SOL (25):
7,000000000000000 SOL (26): 6,000000000000000 SOL (27): 5,000000000000000 SOL (28): 4.000000000000000 SOL (29): 3.000000000000000 SOL (30):
2.000000000000000 SOL (31): 1.000000000000000
Теперь я искал эту ошибку и из того, что я знаю, у меня естьудовлетворяет всем критериям, необходимым для избежания этой ошибки:
CUSPARSE_STATUS_INVALID_VALUE = были переданы недопустимые параметры (m <3, n <0). </p>
И мои M иN: m = 31 и n = 1 Я вставил все детали, необходимые в коде, включая ожидаемый результат (в комментариях):
!********** cuda_tdma.cuf ************!
PROGRAM TDMA
use iso_C_binding
use cudafor
use cusparse
implicit none
! atri - sub-diagonal (means it is the diagonal below the main diagonal)
! btri - the main diagonal
! ctri - sup-diagonal (means it is the diagonal above the main diagonal)
! dtri - right part
! npts - number of equations
integer npts,i,istat
parameter (npts=31)
real(8),dimension(npts) :: atri,btri,ctri,dtri
integer(4) cusparseCreate_status
type(cusparseHandle) :: handle
integer(4) :: m, n, ldb
real(8), device, dimension(npts) :: dl,d,du,B
!***** TEST VALUES INITIALIZATION *****!
atri = 1.0
atri(1) = 0.0
btri = 2.0
ctri = 1.0
ctri(npts) = 0.0
do i=1,16 !***** dtri = transpose of (1,2,3,4,....16,15,14,13,12,....1) *****!
dtri(i)=i
dtri(32-i)=i
enddo
!atri(1)=0
!atri(2)=-1
!atri(3)=-1
!btri(1)=3
!btri(2)=3
!btri(3)=3
!ctri(1)=-1
!ctri(2)=-1
!ctri(3)=0
!dtri(1)=-1
!dtri(2)=7
!dtri(3)=7
!***** memcpy() HtoD *****!
dl = atri
d = btri
du = ctri
B = dtri
m = npts
n = 1
ldb = 1
!**** cusparse_create and check ****!
cusparseCreate_status = cusparseCreate(handle)
print*,'CREATE cusparseCreate_status: '
if(cusparseCreate_status.eq.CUSPARSE_STATUS_SUCCESS) print*,'CUSPARSE_STATUS_SUCCESS'
if(cusparseCreate_status.eq.CUSPARSE_STATUS_NOT_INITIALIZED) print*,'CUSPARSE_STATUS_NOT_INITIALIZED'
if(cusparseCreate_status.eq.CUSPARSE_STATUS_ALLOC_FAILED) print*,'CUSPARSE_STATUS_ALLOC_FAILED'
if(cusparseCreate_status.eq.CUSPARSE_STATUS_ARCH_MISMATCH) print*,'CUSPARSE_STATUS_ARCH_MISMATCHED'
!***** Calling Dgtsv and checking the output Status *****!
istat = cusparseDgtsv(handle,m,n,dl,d,du,B,ldb)
print*,'Dgtsv STATUS: '
if(istat.eq.CUSPARSE_STATUS_SUCCESS) print*,'CUSPARSE_STATUS_SUCCESS'
if(istat.eq.CUSPARSE_STATUS_NOT_INITIALIZED) print*,'CUSPARSE_STATUS_NOT_INITIALIZED'
if(istat.eq.CUSPARSE_STATUS_ALLOC_FAILED) print*,'CUSPARSE_STATUS_ALLOC_FAILED'
if(istat.eq.CUSPARSE_STATUS_INVALID_VALUE) print*,'CUSPARSE_STATUS_INVALID_VALUE'
if(istat.eq.CUSPARSE_STATUS_ARCH_MISMATCH) print*,'CUSPARSE_STATUS_ARCH_MISMATCHED'
if(istat.eq.CUSPARSE_STATUS_EXECUTION_FAILED) print*,'CUSPARSE_STATUS_EXECUTION_FAILED'
if(istat.eq.CUSPARSE_STATUS_INTERNAL_ERROR) print*,'CUSPARSE_STATUS_INTERNAL_ERROR'
!***** memcpy() DtoH *****!
dtri = B
!***** Printing solution *****!
print*,'The solution is: ' !***** Expexted Solution = transpose of (0,1,0,2,0,3,...,0,8,0,7,0,6,...,0,1,0)
do i=1,npts
print*,'SOL(',i,'):',dtri(i)
end do
END PROGRAM TDMA
Почему вывод неправильный?