Ошибка выполнения при использовании функции cusparseDgtsv в CUDA FORTRAN - PullRequest
0 голосов
/ 27 июня 2019

Я тестировал функцию 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

Почему вывод неправильный?

...