如何在CUDA Fortran中使用cusparse库的gtsv2函数?

时间:2019-01-09 08:39:00

标签: cuda fortran fortran-iso-c-binding

我一直在使用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属性”。另外,有没有比使用N数组更好的方式在Fortran中分配character个字节?

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) )

1 个答案:

答案 0 :(得分:2)

直到Fortran 2018,C void都没有等效的Fortran。支持F2018的“与C进一步互操作”功能的编译器支持与type(*)互操作的void *。我不知道您使用的是哪个编译器-如果是PGI,我认为他们还不支持。

另一种方法是将参数与type(C_PTR)属性一起声明为value。然后,您将通过C_LOC(arg)

对于size_t,则为integer(C_SIZE_T)。所有这些都假定您已添加USE ISO_C_BINDING,该过程的接口具有BIND(C),并且您的编译器至少支持F2003 C互操作性功能。