CUDA Fortran: несколько общих массивов с отдельными именами? - PullRequest
0 голосов
/ 21 марта 2011

Действительно ли возможно выделить несколько общих массивов в CUDA Fortran, не прибегая к использованию только одного общего массива и смещению индекса?

Указатели не работают, указатель и цельатрибуты конфликтуют с атрибутом «shared».

Это то, что я хочу достичь:

  attributes(global) subroutine shared_sub_arrays()

    integer :: i

    real, shared, dimension(*), target :: alldata
    real, shared, dimension(:), pointer :: left
    real, shared, dimension(:), pointer :: centre
    real, shared, dimension(:), pointer :: right

    i = threadIdx%x

    left   => alldata(1:3)
    centre => alldata(4:6)
    right  => alldata(7:9)    

    left(i) = 1.0
    centre(i) = 2.0
    right(i) = 3.0

  end subroutine shared_sub_arrays

Кто-нибудь знает другой способ сделать это?

Заранее спасибо за помощь

1 Ответ

1 голос
/ 22 марта 2011

Из руководства Portland CUDA Fortran:

Эти правила применяются к данным устройства:

  • Переменные и массивы устройства могут не иметь атрибутов Pointer или Target.

Так что, думаю, это просто невозможно.Что касается других способов сделать это, вы можете вручную отслеживать индексы (что, кажется, вы не хотите делать), или использовать матрицу с 3 столбцами, например,

real, shared, dimension(:,:) :: alldata
allocate(data(N,3))

! name indices
left=1
centre=2
right=3

! access the columns
alldata(i,left)
alldata(i,centre)
alldata(i,right)
...