【发布时间】:2017-11-24 14:19:33
【问题描述】:
使用 CUDA,我试图在结构中分配数组,但我遇到了问题,我不知道为什么。所以这里有一个描述我的问题的短代码(存储在一个名为struct.cuf 的文件中)。我正在使用PGI 16.10 version 进行编译,并且正在使用以下选项:-O3 -Mcuda=cc60 -tp=x64 struct.cuf -o struct_out
module structure
contains
type mytype
integer :: alpha,beta,gamma
real,dimension(:),pointer :: a
end type mytype
type mytypeDevice
integer :: alpha,beta,gamma
real,dimension(:),pointer,device :: a
end type mytypeDevice
end module structure
program main
use cudafor
use structure
type(mytype) :: T(3)
type(mytypeDevice),device :: T_Device(3)
! For the host
do i=1,3
allocate(T(i)%a(10))
end do
T(1)%a=1; T(2)%a=2; T(3)%a=3
! For the device
print *, 'Everything from now is ok'
do i=1,3
allocate(T_Device(i)%a(10))
end do
!do i=1,3
! T_Device(i)%a=T(i)%a
!end do
end program main
输出错误:
Everything from now is ok
Segmentation fault
我在这里做错了什么?
我发现(并且有效)的唯一解决方案是将值存储在不同的数组中并将它们传输到 GPU,但它非常“重”。大多数情况下,如果我使用很多像 mytype 这样的结构。
编辑:代码已修改为使用 Vladimir F 的解决方案。如果我从T_Device(3) 声明中删除device 属性,那么分配似乎没问题并且也给出了值(分配下方的注释行)。但我需要T_Device(3) 的device 属性,因为我将在内核中使用它。
谢谢!
【问题讨论】:
-
来自pgroup.com/doc/pgi17cudaforug.pdf(Vladimir F 的链接):“派生类型的成员可能没有设备属性,除非它们是可分配的。”此外,您将“设备”属性同时赋予“a”和“T_Device”,从而形成嵌套的“设备”属性。这肯定会使您的问题复杂化:为“设备”属性设置一个级别。
-
是的,它只适用于一个“设备”属性。但是如果我从
T_Device(3)中删除这个属性,我就不能在内核中使用T_Device(3)...