cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Highlighted
Visitor
Visitor
82 Views
Registered: ‎11-02-2020

What is the algorithm used in QRF_ALT function in linear Algebra library provided with the Xilinx Vivado_HLS?

Along with Vivado HLS installation a linear algebra library is provided. Within this library there is this function QRF_ALT, which is supposed to be a high throughput version of Qrf-basic: QR decomposition which uses givens rotations.

My question is that how does it achieves high throughput? From the brief comments that are provided with the code, my guess is that it uses parallel processing of batches of matrix rows, but how does it schedule it, I could not understand.

Does anyone has any prior experience with Vivado HLS who could help me? At this point any help would be greatly appreciated.

The library is located at (linux) in

/opt/Xilinx/Vivado/<installation version>/examples/design/linear_algebra/qrf_alt
0 Kudos
1 Reply
Highlighted
Moderator
Moderator
52 Views
Registered: ‎05-27-2018

Hi @aamir_sheikh 

/opt/Xilinx/Vivado/<installation version>/examples/design/linear_algebra/qrf_alt

This is an out-of-date lib that no one is working on it now. If you're interested in this example. Just run it and refer to the analysis window.

If you want to explore the algorithm, please refer to the hls_qrf.h file. 

XAPP1317 would be a good reference for matrix multiplication.

Now it is moved to the Vitis solver library.

https://github.com/Xilinx/Vitis_Libraries/tree/b894e62a9749c0aa9ddca49e3d72a4261d5655de/solver/L2

 

void qrf_alt_top(const MATRIX_IN_T  A[A_ROWS][A_COLS],
                       MATRIX_OUT_T Q[A_ROWS][A_ROWS],
                       MATRIX_OUT_T R[A_ROWS][A_COLS]){

  MATRIX_IN_T  a_i[A_ROWS][A_COLS];
  MATRIX_OUT_T q_i[A_ROWS][A_ROWS];
  MATRIX_OUT_T r_i[A_ROWS][A_COLS];

  // Copy input data to local memory
  a_row_loop : for (int r=0;r<A_ROWS;r++) {
    a_col_loop : for (int c=0;c<A_COLS;c++) {
      a_i[r][c] = A[r][c];
    }
  }

  // Call QR Factorization, Q is produced such that Q*R = A
  const bool TRANSPOSED_Q = false;
  hls::qrf_top<TRANSPOSED_Q, A_ROWS, A_COLS, QRF_CONFIG, MATRIX_IN_T, MATRIX_OUT_T>(a_i, q_i, r_i);

  // Copy local memory contents to outputs
  r_row_loop : for (int r=0;r<A_ROWS;r++) {
    r_col_loop : for (int c=0;c<A_COLS;c++) {
      R[r][c] = r_i[r][c];
    }
  }
  q_row_loop : for (int r=0;r<A_ROWS;r++) {
    q_col_loop : for (int c=0;c<A_ROWS;c++) {
      Q[r][c] = q_i[r][c];
    }
  }
}

 

 

Wen

 

 

-------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 Kudos