Как использовать функции gtsv2 библиотеки cusparse в CUDA Fortran? - PullRequest
0 голосов
/ 09 января 2019

Я использовал 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) )

1 Ответ

0 голосов
/ 10 января 2019

До Фортрана 2018 года у C void не было эквивалента Фортрана. Компиляторы, которые поддерживают функции "Дальнейшая совместимость с C" в F2018, поддерживают type(*), который совместим с void *. Я не знаю, какой компилятор вы используете - если это PGI, я не думаю, что они еще поддерживают это.

Альтернативой является объявление аргумента как type(C_PTR) вместе с атрибутом value. Затем вы должны передать C_LOC(arg).

Для size_t, это integer(C_SIZE_T). Все это предполагает, что вы добавили USE ISO_C_BINDING, что ваш интерфейс для процедуры имеет BIND(C), и что ваш компилятор поддерживает как минимум функции совместимости F2003 C.

...