gpt4 book ai didi

fortran - 英特尔 Fortran 中结构内的数据对齐

转载 作者:行者123 更新时间:2023-12-04 03:35:38 26 4
gpt4 key购买 nike

我正在尝试在内存中对齐以下类型的数据:

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 的数组类型结构,有两个大数组 bar1bar2作为我需要在内存中的缓存边界附近对齐的变量。

我有点知道如何为简单的数组( link )做到这一点,但我不知道如何为这种复杂的数据结构做到这一点。如果 my_foo不是 1 号,而是 100 号?我会遍历它们吗?

最佳答案

好的,案例半封闭。结果证明解决方案非常简单。您只需使用指针并执行 assume_aligned给他们。那应该照顾它。

type foo
real, allocatable, dimension(:) :: bar1, bar2
!dir$ attributes align:64 :: bar1
!dir$ attributes align:64 :: bar2
end type foo

type(foo), target, allocatable, dimension(:) :: my_foo
real, pointer, contiguous :: pt_bar1(:)
real, pointer, contiguous :: pt_bar2(:)
allocate(my_foo(1))
allocate(my_foo(1)%bar1(100))
allocate(my_foo(1)%bar2(100))

pt_bar1 = my_foo(1)%bar1
pt_bar2 = my_foo(1)%bar2
!dir$ assume_aligned pt_bar1:64, pt_bar2:64

pt_bar1 = 10.
pt_bar2 = 10.
do循环仍然不是矢量化 smh。就像如果我做同样的事情
do i = 1, 100
pt_bar1(i) = 10.
pt_bar2(i) = 10.
end do

它不会被矢量化。

更新。
好的,这就完成了(还需要向编译器添加 -qopenmp-simd 标志):
!$omp simd
!dir$ vector aligned
do i = 1, 100
pt_bar1(i) = 10.
pt_bar2(i) = 10.
end do

此外,如果您正在循环访问 my_foo(j)%...确保在每次迭代后使用 pt_bar1 => null() 释放指针等等。

附注。感谢我们部门的 BW 提供的帮助。 :) 有时个人交流 > stackoverflow(并非总是如此,只是有时)。

关于fortran - 英特尔 Fortran 中结构内的数据对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53161673/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com