Я пытаюсь выровнять в памяти следующий тип данных:
type foo
real, allocatable, dimension(:) :: bar1, bar2
!dir$ attributes align:64 :: bar1
!dir$ attributes align:64 :: bar2
end type foo
type(foo), allocatable, dimension(:) :: my_foo
allocate(my_foo(1))
allocate(my_foo(1)%bar1(100))
allocate(my_foo(1)%bar2(100))
! somewhere here I need to tell the compiler that data is aligned
! for a simple array with name `bar` I would just do:
!dir$ assume_aligned bar1: 64
!dir$ assume_aligned bar2: 64
! but what do I do for the data type I have, something like this?
!dir$ assume_aligned my_foo(1)%bar1: 64
!dir$ assume_aligned my_foo(1)%bar2: 64
do i = 1, 100
my_foo(1)%bar1(i) = 10.
my_foo(1)%bar2(i) = 10.
end do
Как видите, это массив структур типа foo
, который имеет два больших массива bar1
и bar2
в качестве переменных, которые мне нужно выровнять рядом с границами кеша в памяти.
Я знаю, как это сделать для простых массивов (link), но я понятия не имею, как это сделать для такой сложной структуры данных. А что, если бы my_foo
было не размера 1, а размера, скажем, 100? Я прохожу через них?