Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer(kind=int32), | intent(in) | :: | A(:,:) | |||
integer(kind=int32), | intent(out) | :: | B(:,:) | |||
logical, | intent(in), | optional | :: | threaded |
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
integer(kind=default_int), | private | :: | cols | ||||
integer(kind=default_int), | private | :: | i | ||||
integer(kind=default_int), | private | :: | ii | ||||
integer(kind=default_int), | private | :: | j | ||||
integer(kind=default_int), | private | :: | jj | ||||
integer(kind=default_int), | private | :: | rows | ||||
logical, | private | :: | use_threads |
subroutine transpose_matrix_int32(A, B, threaded) integer(int32), intent(in) :: A(:, :) integer(int32), intent(out) :: B(:, :) logical, intent(in), optional :: threaded logical :: use_threads integer(default_int) :: i, j, ii, jj, rows, cols rows = size(A, 1) cols = size(A, 2) if (size(B, 1) /= cols .or. size(B, 2) /= rows) then error stop "transpose: size mismatch" end if if (present(threaded)) then use_threads = threaded else use_threads = use_threaded_default end if if (use_threads) then !$omp parallel do collapse(2) private(i,j,ii,jj) do jj = 1, cols, block_size do ii = 1, rows, block_size do j = jj, min(jj + block_size - 1, cols) do i = ii, min(ii + block_size - 1, rows) B(j, i) = A(i, j) end do end do end do end do !$omp end parallel do else B = transpose(A) end if end subroutine transpose_matrix_int32