If I understand the aligned clause of the omp simd construct, it refers to the alignment of the whole array.
How is it used for multi-dimensional arrays? Assume
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
Is this the correct way to indicate the alignment of the array although the iteration of the inner loop starts at arr(1,j,k)?
How does the compiler use that information to infer anything about the alignment of the inner loop subarray?
Does it matter for the performance if the run-time sizes are nicer (say 128, 128, 128)?
It is explained here, slides 160-165 : http://irpf90.ups-tlse.fr/files/parallel_programming.pdf
You should
1) Align the array
2) use padding to force all your columns to be aligned : Your first dimension (specified in the allocate statement) should be a multiple of the number of elements to reach the 16, 32 or 64 -byte boundary depending on the instruction set.
For example, for a 99x29x200 matrix with the AVX instruction set (32 bytes alignment) in double precision (8 bytes/element), you should do
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
You can use the C preprocessor to make portable code replacing the 32 and 8 in the previous example.
Note : be careful using statements such as B=A for arrays, as the physical dimensions will not correspond to the logical dimensions. Good practice is to set the boundaries as B(1:n,1:l,1:m) = A(1:n,1:l,1:m) as it will still work if you change the physical dimensions.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With