Critical Path

This example shows a normal coding style which could lead to critical path issue and design will give degraded timing. Example also contains better coding style which can improve design timing.

KEY CONCEPTS: Critical Path handling, Improve Timing

This example demonstrates the considerations in coding style to avoid critical paths in kernels.

Apply_watermark kernel is processing the image’s pixels concurrently by using HLS UNROLL however, a global variable x is being updated in every iteration which nullifies the speedup offered by unrolling the loop and leads to a critical path.

watermark:
       for (int i = 0; i < DATA_SIZE; i++, x++) {
          #pragma HLS UNROLL
          if (x > width) {
               x = x - width;
               y += 1;
           }

           uint w_idy = y % WATERMARK_HEIGHT;
           uint w_idx = x % WATERMARK_WIDTH;
           tmp.data[i] = saturatedAdd(tmp.data[i], watermark[w_idy][w_idx]);
       }

Using local variables and just referencing the value of x in every iteration and updating it outside the loop can remove this critical path and thus improve the performance and timing of kernel execution.

for (int i = 0; i < DATA_SIZE; i++) {
           #pragma HLS UNROLL
            uint tmp_x = x + i;
            uint tmp_y = y;
            if (tmp_x > width) {
                tmp_x = tmp_x - width;
                tmp_y += 1;
            }

            uint w_idy = tmp_y % WATERMARK_HEIGHT;
            uint w_idx = tmp_x % WATERMARK_WIDTH;
            tmp.data[i] = saturatedAdd(tmp.data[i], watermark[w_idy][w_idx]);
        }
        x += DATA_SIZE;

DESIGN FILES

Application code is located in the src directory. Accelerator binary files will be compiled to the xclbin directory. The xclbin directory is required by the Makefile and its contents will be filled during compilation. A listing of all the files in this example is shown below

data/golden.bmp
data/input.bmp
src/apply_watermark.cpp
src/host.cpp

COMMAND LINE ARGUMENTS

Once the environment has been configured, the application can be executed by

./host <apply_watermark_GOOD XCLBIN> ./data/input.bmp ./data/golden.bmp