block_transpose_copy_s Subroutine

private subroutine block_transpose_copy_s(extent_out, extent_in, rows, columns)

Copy and transpose block.

Arguments

Type IntentOptional Attributes Name
real(kind=real_4), intent(out), DIMENSION(:), TARGET :: extent_out

output matrix in the form of a 1-d array

real(kind=real_4), intent(in), DIMENSION(:) :: extent_in

input matrix in the form of a 1-d array

integer, intent(in) :: rows

input matrix size input matrix size

integer, intent(in) :: columns

input matrix size input matrix size


Source Code

      PURE_BLOCKOPS SUBROUTINE block_transpose_copy_s (extent_out, extent_in, &
                                                                   rows, columns)
     !! Copy and transpose block.

#if defined(__LIBXSMM_TRANS)
         USE libxsmm, ONLY: libxsmm_otrans, libxsmm_ptr1
#endif
         REAL(kind=real_4), DIMENSION(:), INTENT(OUT), TARGET :: extent_out
        !! output matrix in the form of a 1-d array
         REAL(kind=real_4), DIMENSION(:), INTENT(IN)          :: extent_in
        !! input matrix in the form of a 1-d array
         INTEGER, INTENT(IN) :: rows, columns
        !! input matrix size
        !! input matrix size

!    ---------------------------------------------------------------------------
#if defined(__LIBXSMM_TRANS)
         CALL libxsmm_otrans(libxsmm_ptr1(extent_out), libxsmm_ptr1(extent_in), &
                             4, rows, columns, rows, columns)
#elif defined(__MKL)
         CALL mkl_somatcopy('C', 'T', rows, columns, 1.0_real_4, extent_in, rows, extent_out, columns)
#else
         extent_out(1:rows*columns) = RESHAPE(TRANSPOSE( &
                                              RESHAPE(extent_in(1:rows*columns), (/rows, columns/))), (/rows*columns/))
#endif
      END SUBROUTINE block_transpose_copy_s