【问题标题】:How do I use gtsv2 functions of the cusparse library in CUDA Fortran?如何在 CUDA Fortran 中使用 cusparse 库的 gtsv2 函数?
【发布时间】:2019-01-11 12:45:47
【问题描述】:

我一直在使用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 属性”。另外,有没有更好的方法在 Fortran 中分配 N 字节而不是使用 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) )

【问题讨论】:

  • 您可以通过fortran-iso-c-binding 下的问题了解 Fortran C 互操作性。
  • 您没有显示导致有关target 的警告的内在函数。这是一个新问题。你原来的问题已经解决了。避免在每个帖子中问太多问题,尤其是在您得到答案之后。
  • @VladimirF 调用最后一行的cusparseDgtsv2 时出现警告消息。我想它与c_loc(buf)有关。顺便说一句,我添加了第二个问题,因为我认为它通常与使用 gtsv2 函数有关。我将为此发布一个新问题。谢谢。
  • 好的,我现在可以看到了。那是因为你没有使用 charecter(kind=c_char)。

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


【解决方案1】:

在 Fortran 2018 之前,C void 没有 Fortran 等效项。支持 F2018 的“与 C 的进一步互操作性”功能的编译器支持与 void * 互操作的 type(*)。我不知道你使用的是哪个编译器——如果是 PGI,我认为他们还不支持这个。

另一种方法是将参数声明为 type(C_PTR) 以及 value 属性。然后你会传递C_LOC(arg)

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

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 2021-07-14
    • 2021-07-21
    相关资源
    最近更新 更多