Fortran Coder

查看: 8319|回复: 2
打印 上一主题 下一主题

[并行] CUDA Fortran 结构体问题

[复制链接]

3

帖子

2

主题

0

精华

入门

F 币
88 元
贡献
30 点
跳转到指定楼层
楼主
发表于 2021-10-16 15:20:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近在学习CUDA Fortran,但相关资料里的示例全部都是对一二维数组进行并行加速的,
但在我的实际应用过程中,派生类(TYPE定义的结构数组)是程序的主要数据结构,所以今天试了一下可否在CUDA Fortran中实现结构体的并行
但出错了,错误截图如下,请问是否是CUDA Fortran原生的不支持结构体?
[Fortran] 纯文本查看 复制代码
    MODULE Compute
    USE Global_variables
    IMPLICIT NONE
    
    CONTAINS
    attributes ( global ) SUBROUTINE Age_add(People_d)
    INTEGER		:: I,N1
    type(Person),       allocatable              :: People_d(:)
    
    I=(BLOCKIDX%X-1)*BLOCKDIM%X+THREADIDX%X
    N1=SIZE(People_d,1)
    
    IF (I>N1) RETURN
    People_d(I)%age = People_d(I)%age + 1
 
    END SUBROUTINE
    END
    
    MODULE Global_variables
    IMPLICIT NONE

    type Person
        integer(kind=4)                        ::     age                    ! 年龄
        integer(kind=4)                        ::     height                 ! 身高
        integer(kind=4)                        ::     weight                 ! 体重
    end type
    END


    program Test
    use cudafor
    use Global_variables
    implicit none
    integer , parameter :: PersonNum = 10000
    type(Person),       allocatable              :: People(:)
    type(Person),device,allocatable              :: People_d(:)
    integer :: i
    
    allocate(People(PersonNum))
    allocate(People_d(PersonNum))
    DO i = 1, PersonNum
        People(i)%age = i
        People(i)%height = i
        People(i)%weight = i
    ENDDO
    
    People_d = People
    CALL Age_add<<<CEILING(REAL(PersonNum)/256),256>>>(People_d)
    People = People_d
    
    write(*,*) People(500)%age
    write(*,*) SIZE(People, 1)
    
    end program Test


QQ图片20211016151752.png (77.14 KB, 下载次数: 295)

QQ图片20211016151752.png
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
沙发
发表于 2021-10-20 12:18:11 | 只看该作者
本帖最后由 li913 于 2021-10-20 12:43 编辑

1、去掉 第六行的 allocatable;
2、MODULE Global_variables 放在最开始;      
3、主程序 use Compute。


[Fortran] 纯文本查看 复制代码
MODULE Global_variables
IMPLICIT NONE
type Person
    integer(kind=4)                        ::     age                    ! 年龄
    integer(kind=4)                        ::     height                 ! 身高
    integer(kind=4)                        ::     weight                 ! 体重
end type
END module

MODULE Compute
USE Global_variables
IMPLICIT NONE
CONTAINS
attributes ( global ) SUBROUTINE Age_add(People_d)
INTEGER                :: I,N1
type(Person) :: People_d(:)
I=(BLOCKIDX%X-1)*BLOCKDIM%X+THREADIDX%X
N1=SIZE(People_d,1)
IF (I>N1) RETURN
People_d(I)%age = People_d(I)%age + 1
END SUBROUTINE
END

program Test
use cudafor
use Global_variables
use Compute
implicit none
integer , parameter :: PersonNum = 10000
type(Person),       allocatable              :: People(:)
type(Person),device,allocatable              :: People_d(:)
integer :: i
allocate(People(PersonNum))
allocate(People_d(PersonNum))
DO i = 1, PersonNum
    People(i)%age = i
    People(i)%height = i
    People(i)%weight = i
ENDDO
People_d = People
CALL Age_add<<<CEILING(REAL(PersonNum)/256),256>>>(People_d)
People = People_d
write(*,*) People(500)%age
write(*,*) SIZE(People, 1)
end program Test




11.jpg (41.7 KB, 下载次数: 311)

11.jpg

3

帖子

2

主题

0

精华

入门

F 币
88 元
贡献
30 点
板凳
 楼主| 发表于 2021-10-20 15:20:20 | 只看该作者
li913 发表于 2021-10-20 12:18
1、去掉 第六行的 allocatable;
2、MODULE Global_variables 放在最开始;      
3、主程序 use Compute。

感谢!!解决了我的问题
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-22 06:42

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表