【发布时间】:2016-01-27 03:05:28
【问题描述】:
如果我理解omp simd 构造的aligned 子句,它指的是整个数组的对齐方式。
它如何用于多维数组?假设
ni = 131; nj = 137; nk = 127
!allocates arr(1:131,1:137,1:127) aligned to 64-bytes
call somehow_allocate_aligned(arr, [ni,nj,nk], 64)
!$omp parallel do collapse(2)
do k = 1, nk
do j = 1, nj
call some_complicated_subroutine(arr(:,j,k))
!$omp simd aligned(arr:64)
do i = 1, ni
arr(i,j,k) = some arithmetic expression involving arr(i,j,k)
end do
end do
end do
!$omp end parallel do
尽管内部循环的迭代从arr(1,j,k) 开始,但这是指示数组对齐的正确方法吗?
编译器如何使用该信息来推断有关内部循环子数组的对齐方式?
如果运行时大小更好(比如 128、128、128)对性能有影响吗?
【问题讨论】:
-
因为您仅沿
i轴执行 SIMD 矢量化,您只需将您的arr数组与该维度中的 64 字节对齐。其他维度可以是任意长度,它根本不应该影响您的矢量化。您始终可以通过查看使用-qopenmp-simd -qopt-report=5编译的输出来仔细检查您设置的对齐方式和执行的矢量化是否一致。 -
@NoseKnowsAll Fortran 数组不能那样工作(沿一维对齐)。它们是连续的。哪个编译器支持您引用的选项?
-
是的,Fortran 数组是连续的。但是在您的情况下,
simd构造仅沿 1 个轴工作,因此对于该构造,您基本上是将数组的一维切片交给它。该切片是唯一必须对齐的部分。 (另外,将最快的维度自动对齐到 64 字节意味着 3D 数组无论如何都会对齐到 64 字节......)是的,这些都是 ifort 选项。 -
我的意思是,
arr(:,2,1)与arr的对齐方式(可以)不同。可以通过在 FORTRAN77 样式中分配更大的数组来避免这种情况,但这会给代码的其他部分带来大量挑战。 -
即使数组的大小恰好使得连续的部分(列?)以相同的方式对齐,编译器是否能够知道这一点?我如何告诉它这些信息?