Intel® High Level Synthesis Compiler Pro Edition: Best Practices Guide

ID 683152
Date 3/28/2022
Public

A newer version of this document is available. Customers should click here to go to the newest version.

Document Table of Contents

8.1. Executing Multiple Loops in Parallel

By using HLS tasks, you can run sequential loops in a pipelined manner within the context of the loop nest.
For example, in the following code sample, the first and second loops can be executing different invocations of the component foo() if the invocations can be pipelined by the Intel® HLS Compiler Pro Edition:
component void foo() {
  // first loop
  for (int i = 0; i < n; i++) {
    // Do something
  }
  // second loop
  for (int i = 0; i < m; i++) {
    // Do something else
  }
}
However, the same invocation of the component foo() cannot execute the two loops in parallel. System of tasks provides a way to achieve this by moving the loops into asynchronous tasks. With the first loop in an asynchronous task, the second loop can run concurrently with the first loop.
void first_loop() {
  for (int i = 0; i < n; i++) {
    // Do something
  }
}

void second_loop() {
  for (int i = 0; i < m; i++) {
    // Do something else
  }
}

component void foo() {
  ihc::launch<first_loop>();
  ihc::launch<second_loop>();
  ihc::collect<first_loop>();
  ihc::collect<second_loop>();
}

Review the tutorial <quartus_installdir>/hls/examples/tutorials/system_of_tasks/parallel_loop to learn more about how to run multiple loops in parallel.