gpt4 book ai didi

fortran - omp simd的多维数组对齐

转载 作者:行者123 更新时间:2023-12-04 08:51:45 33 4
gpt4 key购买 nike

如果我明白 aligned omp simd的条款构造,它指的是整个数组的对齐方式。

它如何用于多维数组?认为

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),这对性能有影响吗?

最佳答案

在这里解释,幻灯片 160-165:http://irpf90.ups-tlse.fr/files/parallel_programming.pdf

你应该

1) 对齐数组

2) 使用填充来强制所有列对齐:您的第一个维度(在分配语句中指定)应该是元素数量的倍数,以达到 16、32 或 64 字节边界,具体取决于指令集。

例如,对于具有 double (8 字节/元素)的 AVX 指令集(32 字节对齐)的 99x29x200 矩阵,您应该这样做

n = 99
l = 29
m=200

delta_n = mod(n,32/8)
if (delta_n == 0) then
n_pad = n
else
n_pad = n-delta_n+32/8
end if

allocate( A(n_pad,l,m) )
!DIR$ ATTRIBUTES ALIGN : 32 :: A

do k=1,m
do j=1,l
!$OMP SIMD
do i=1,n
A(i,j,k) = ...
end do
end do
end do

您可以使用 C 预处理器来制作可移植代码,以替换前面示例中的 32 和 8。

注意:对于数组使用 B=A 等语句时要小心,因为物理维度将与逻辑维度不对应。好的做法是将边界设置为 B(1:n,1:l,1:m) = A(1:n,1:l,1:m) 因为如果您更改物理尺寸,它仍然有效。

关于fortran - omp simd的多维数组对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33372455/

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