找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 142|回复: 1

请教一个关于cudafortran结构体并行的问题

[复制链接]
发表于 2017-7-6 15:30:30 | 显示全部楼层 |阅读模式
ESC4000G3
subroutine IntegrateMomentum()
!------------------------------------------------------------------
!-  Purpose                                                       -
!-    1. Integrating  the momentum equations on the               -
!=        computational grid                                      -
!-    2. Apply  boundary conditions                               -
!------------------------------------------------------------------
  use ParticleData
  use GridData
  implicit none

  integer:: c, n ! loop counter
  type(GridNodeProperty), POINTER :: gd
  type(GridNode), POINTER :: node

  do c = 1, nb_component
     do n = 1, nb_gridnode
        gd => grid_list(c, n)
        node => node_list(n)
         
        ! Integrate momentum equation
        if(istep == 1) then
           gd%PXg = gd%PXg + gd%FXg * DT*0.5
        else
           gd%PXg = gd%PXg + gd%FXg * DT
        end if
这是我想并行的代码,grid_list是一个结构体数组变量,其中结构体中元素PXg为大小为3的一维数组。
我这样声明real(8),device,allocatable::grid_list(:,:)%PXg(3),grid_list(:,:)%FXg(3)设备变量不太对,编译通不过,另外想知道kernel函数该怎么写,因为没有结构体的例子,新手不知道该怎么下手。谢谢啦              
回复

使用道具 举报

发表于 2017-7-11 15:52:00 | 显示全部楼层
Jetson TX2
没有结构体的例子,是因为cuda提倡用多个数组代替结构体数组,因为访存的关系,结构体数组会大大降低gpu程序的性能,所以建议使用多个数组,从根源上解决一系列的麻烦.
比如,你的这个程序,建议不要使用grid_list,声明pxg和fxg的多维数组,
real*8,device,allocatable::pxg(:,:,:)
allocate(pxg(3,c,n))



另外,强烈不建议在fortran中使用指针,Cuda fortran的kernel要在module中实现,建议你的这个程序,在使用多个数组的情况下,跟向量加法的示例代码基本一致,建议自己去模仿写



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

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