Я использовал cusparseDgtsv
для решения трехдиагональных матриц с несколькими правыми частями. Недавно я нашел cusparseDgtsv2
, который улучшает параллелизм. Однако в документации говорится, что cusparseDgtsv2
ожидает void *pBuffer argument
, а cusparseDgtsv2_bufferSizeExt
ожидает size_t *bufferSizeInBytes
аргумент. Какие аргументы мне следует использовать для аналога void
и size_t
в CUDA Fortran?
* EDIT
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
байтов в Фортране, вместо использования 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) )