Я пытаюсь использовать выделяемые массивы внутри структур данных «устройства», которые находятся в памяти графического процессора. Код (вставленный ниже) компилируется, но выдает segfault. Я делаю что-то явно не так?
Файл модуля называется «gpu_modules.F90», как указано ниже:
!=============
! This module contains definitions for data structures and the data
! stored on the device
!=============
module GPU_variables
use cudafor
type :: data_str_def
!=============
! single number quantities
!=============
integer :: i, j
real(kind=8) :: a
!=============
! Arrays
!=============
real(kind=8), allocatable :: b(:)
real(kind=8), allocatable :: c(:,:)
real(kind=8), allocatable :: d(:,:,:)
real(kind=8), allocatable :: e(:,:,:,:)
end type data_str_def
!=============
! Actual data is here
!=============
type(data_str_def), device, allocatable :: data_str(:)
contains
!=============
! subroutine to allocate memory
!=============
subroutine allocate_mem(n1)
implicit none
integer, intent(in) :: n1
call deallocate_mem()
write(*,*) 'works here'
allocate(data_str(n1))
write(*,*) 'what about allocating memory?'
allocate(data_str(n1) % b(10))
write(*,*) 'success!'
return
end subroutine allocate_mem
!=============
! subroutine to deallocate memory
!=============
subroutine deallocate_mem()
implicit none
if(allocated(data_str)) deallocate(data_str)
return
end subroutine deallocate_mem
end module GPU_variables
Основная программа — «gpu_test.F90», приведенная ниже:
!=============
! main program
!=============
program gpu_test
use gpu_variables
implicit none
!=============
! local variables
!=============
integer :: i, j, n
!=============
! allocate data
!=============
n = 2 ! number of data structures
call allocate_mem(n)
!=============
! dallocate device data structures and exit
!=============
call deallocate_mem()
end program
Команда компиляции (из текущей папки):
pgfortran -Mcuda=cc5x *.F90
Выход терминала:
$ ./a.out
works here
what about allocating memory?
Segmentation fault (core dumped)
Любая помощь/понимание и решение будут оценены.. и нет, использование указателей не является жизнеспособным вариантом.
Изменить: еще одна деталь, которая может иметь значение: я использую pgfortran версии 16.10.
kind=8
уродливо и не переносимо (хотя и не вызывает эту ошибку). Кроме того, возвращение перед каждым концом совершенно поверхностно. - person Vladimir F   schedule 21.07.2017allocate(data_str(n1) % b(10))
выделяет компонентb
только дляn1
компонентаdata_str
. Но это может быть вашим намерением в этом простом примере. - person Vladimir F   schedule 21.07.2017