Проблемы с API устройства CUDA Fortran CURAND

Контекст: я пытаюсь выполнить генерацию псевдослучайных чисел на графическом процессоре с помощью CURAND, но, поскольку я использую CUDA fortran, мне нужно создать интерфейсный модуль, который взаимодействует с функциями CURAND LIBRARY, написанными на C. Вот код интерфейса:

    interface curand_init

      attributes(device) subroutine curand_init(seed,sequence,offset,state) &
        bind(C,name='curand_init')
        use iso_c_binding
        integer(c_long_long),value :: seed
        integer(c_long_long),value :: sequence
        integer(c_long_long),value :: offset
        !pgi$ ignore_tr state
        real(c_float), device :: state(*)   
      end subroutine curand_init

    end interface curand_init

    interface curand

      attributes(device) subroutine curand(state) &
        bind(C,name='curand')
        use iso_c_binding
        !pgi$ ignore_tr state
        real(c_float),device :: state(*)
      end subroutine curand

    end interface curand

    interface curand_uniform

      attributes(device) subroutine curand_uniform(state) &
        bind(C,name='curand_uniform')
        use iso_c_binding
        !pgi$ ignore_tr state
        real(c_float),device :: state(*)
      end subroutine curand_uniform

      attributes(device) subroutine curand_uniform_double(state) &
      bind(C,name='curand_uniform_double')
        use iso_c_binding
        !pgi$ ignore_tr state
        real(c_double),device :: state(*)
      end subroutine curand_uniform_double

    end interface curand_uniform

    interface curand_normal

      attributes(device) subroutine curand_normal(state) &
        bind(C,name='curand_normal')
        use iso_c_binding 
        !pgi$ ignore_tr state
        real(c_float),device :: state(*)
      end subroutine curand_normal 

      attributes(device) subroutine curand_normal_double(state) &
        bind(C,name='curand_normal_double')
        use iso_c_binding
        !pgi$ ignore_tr state
        real(c_double),device :: state(*)
      end subroutine curand_normal_double

    end interface curand_normal

в том же модуле я вызываю подпрограмму этого устройства call curand_init(seed,id,0,tmpconf) в глобальном ядре. Я получаю эту ошибку, когда вызываю глобальное ядро.

gpu_gen_m.CUF:
PGF90-S-0155-Could not resolve generic procedure curand_init (gpu_gen_m.CUF: 99)
  0 inform,   0 warnings,   1 severes, 0 fatal for gen_conf

любая идея, как я могу решить эту проблему.


person egodfred    schedule 21.10.2014    source источник
comment
Просто совет, используйте отступы в своем коде. Ваши интерфейсы очень трудно читать.   -  person Vladimir F    schedule 21.10.2014
comment
Как определяется seed,id,0,tmpconf?   -  person Vladimir F    schedule 21.10.2014
comment
Нет причин для общего интерфейса для curand_init, измените его на нормальный интерфейс, и вы получите более прямое сообщение об ошибке.   -  person Vladimir F    schedule 21.10.2014
comment
integer(kind=int_ptr_kind ()) :: seed , id и real(fp_kind), allocatable, device :: tmp_d(:), где fp_kind = singlePrecision   -  person egodfred    schedule 21.10.2014


Ответы (1)


В интерфейсе у вас есть

integer(c_long_long),value :: seed
integer(c_long_long),value :: sequence
integer(c_long_long),value :: offset
!pgi$ ignore_tr state
real(c_float), device :: state(*)   

но в звонке вы используете

два раза integer(kind=int_ptr_kind ()), один integer и один real(fp_kind)

Это не сработает, у вас должны быть те же типы в вызове.

Если вы удалите поверхностное имя интерфейса, что делает интерфейс универсальным, вы получите более прямое сообщение об ошибке от компилятора.

person Vladimir F    schedule 21.10.2014