簡體   English   中英

如何在CUDA Fortran中使用cusparse庫的gtsv2函數?

[英]How do I use gtsv2 functions of the cusparse library in CUDA Fortran?

我一直在使用cusparseDgtsv來求解具有多個右側的三對角矩陣。 我最近發現cusparseDgtsv2可以提高並發性。 但是,文檔說cusparseDgtsv2需要一個void *pBuffer argument ,而cusparseDgtsv2_bufferSizeExt需要一個size_t *bufferSizeInBytes參數。 對於CUDA Fortran中的voidsize_t對應項,我應該使用哪種參數?

*編輯

cusparseStatus_t cusparseDgtsv2(
    cusparseHandle_t handle,
    int m,        
    int n,        
    const double *dl,  
    const double  *d,    
    const double *du, 
    double *B,     
    int ldb,
    void *pBuffer)

@SteveLionel我編寫了下面的代碼,效果很好,但是當調用函數cusparseDgtsv2 ,我收到一條警告消息,提示“ ISO_C_BINDING內部參數必須設置TARGET屬性”。 另外,有沒有比使用character數組更好的在Fortran中分配N個字節的方法?

function cusparseDgtsv2 (h,m,n,dl,d,du,B,ldb,pBuffer) bind(C,name='cusparseDgtsv2')
   use iso_c_binding
   use cusparse
   type (cusparseHandle), value :: h
   integer (c_int), value  :: m,n
   real (c_double), device :: dl(*)
   real (c_double), device :: d(*)
   real (c_double), device :: du(*)
   real (c_double), device :: B(*)
   integer (c_int), value  :: ldb
   type (c_ptr),    value  :: pBuffer
   integer (c_int), value  :: cusparseDgtsv2
end function

integer :: istat
integer :: m, n
integer (c_size_t) :: N
type (cusparseHandle) :: handle
real, allocatable, device :: d_A(:), d_B(:), d_C(:), d_D(:)
character, allocatable, device :: buf(:)

allocate (buf(N))
istat = cusparseDgtsv2 ( handle, m, n, d_A, d_B, d_C, d_D, m, c_loc(buf) )

在Fortran 2018之前,C void沒有等效的Fortran。 支持F2018的“與C進一步互操作性”功能的編譯器支持可與void *互操作的type(*) 我不知道您使用的是哪個編譯器-如果是PGI,我認為他們還不支持。

另一種選擇是將參數與value屬性一起聲明為type(C_PTR) 然后,您將傳遞C_LOC(arg)

對於size_t ,它是integer(C_SIZE_T) 所有這些都假定您已添加USE ISO_C_BINDING ,該過程的接口具有BIND(C) ,並且您的編譯器至少支持F2003 C互操作性功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM