Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loop Unrolling -Microblaze C programming

Can we have loop unrolling in Microblaze C programming using EDK?

This is required because I need more performance. Traditionally my C code will run serially, so having loop unrolling using some compiler directive can accelerate my application.
(e.g as we do using openMP).

#pragma Unroll 
for (i = 0; i < 100; i++ ) {
    a[i] = fetch_data(i);
}

Is this possible for Microblaze? If yes is there any example on the same?

like image 443
gpuguy Avatar asked Jul 02 '26 07:07

gpuguy


1 Answers

No, there isn't any automatic loop unrolling like that. For tight loops like that the common recommendation on the Xilinx forums is to manually unroll 10-20 times and see if the performance is acceptable or write the looping code in assembly.

You are typically losing 3 or 4 clock cycles on every one of the loop branches so depending on how long fetch_data takes to execute you could figure out how much unrolling you want to do.

for (i = 0; i < 100; i+=10 ) { 
    a[i] = fetch_data(i); 
    a[i+1] = fetch_data(i+1); 
    a[i+2] = fetch_data(i+2); 
    a[i+3] = fetch_data(i+3); 
    a[i+4] = fetch_data(i+4); 
    a[i+5] = fetch_data(i+5); 
    a[i+6] = fetch_data(i+6); 
    a[i+7] = fetch_data(i+7); 
    a[i+8] = fetch_data(i+8); 
    a[i+9] = fetch_data(i+9); 
} 

Make sure to heed the standard loop unrolling caveats like watching for interval sizes that aren't a multiple of your increment steps.

like image 163
nvuono Avatar answered Jul 03 '26 21:07

nvuono



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!