c - 循环展开-Microblaze C编程

标签 c openmp fpga microblaze

我们可以使用 EDK 在 Microblaze C 编程中展开循环吗?

这是必需的,因为 我需要更多性能。传统上,我的 C 代码将串行运行,因此使用一些编译器指令展开循环可以加速我的应用程序。
(例如,就像我们使用 openMP 所做的那样)。

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

对于 Microblaze 这可能吗?如果是,是否有相同的例子?

最佳答案

不,没有像那样的任何自动循环展开。对于像这样的紧密循环,Xilinx 论坛上的常见建议是手动展开 10-20 次,看看性能是否可以接受,或者在汇编中编写循环代码。

您通常会在每个循环分支上损失 3 或 4 个时钟周期,因此根据 fetch_data 执行的时间长短,您可以计算出您想要执行多少展开。

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); 
} 

确保注意标准循环展开的注意事项,例如注意间隔大小不是增量步长的倍数。

关于c - 循环展开-Microblaze C编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10407389/

相关文章:

VHDL/Verilog : access HDMI port

c - 如何 mmap() 更正地址

c - libsox 转换 wav 文件采样率等。

c - ‘(’ 之前的预期标识符或 ‘for’

c - strcmp 比较下注预定义和接收到的字符串

c - 从其他二进制文件加载符号

c++ - OpenMP 是否复制私有(private)对象?

c - 使用 openmp 使用 C 通过 openacc 在多个 GPU 上分配矩阵乘法工作

c++ - 启用 openmp 时出错 - "ld: library not found for -lgomp"和 Clang 错误

verilog - 从命令行使用 Quartus