【发布时间】:2019-01-11 12:45:47
【问题描述】:
我一直在使用cusparseDgtsv 来求解具有多个右侧的三对角矩阵。我最近发现cusparseDgtsv2 提高了并发性。但是文档说cusparseDgtsv2 需要void *pBuffer argument,而cusparseDgtsv2_bufferSizeExt 需要size_t *bufferSizeInBytes 参数。我应该为 CUDA Fortran 中的 void 和 size_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