0

为了举例说明,我有一个循环,在该循环中,每次迭代都在一次循环中读取和写入数组的内容。

int my_array[10] = ...;
for(i=0; i<10; i++) {
  if(i<5) {
    my_array[i*2] = func_b(my_array[i*2]);//func_b takes double the time of func_a, but it also runs on 1/2 of the time.
  }
  func_a(myarray[i]);//func_a is executed quickly
}

仅在 上访问相同的元素以进行读/写操作i=0,具有适当的延迟和同步算法应该允许并行化。我正在努力寻找合适的 HLS 编译指示来强制它们像这样并行运行

//#pragma HLS to delay by two cycles
for(i=0; i<10; i++) {
  func_a(my_array[i]);

}
//#pragma HLS to allow to run each iteration in parallel with the first loop, if possible in two cycles
for(i=0; i<5; i++) {
    my_array[i*2] = func_b(my_array[i]);//func_b might be split into two halves for each to fit into one cycle.
}

理想情况下,第一个循环应该在第二个循环完成后完成两个循环,并以这种方式读取最后一个my_array元素的正确值。我可能有一个误解,但我希望以这种方式(跨两个周期)划分工作,应该提高时钟速度吗?

生成的 Verilog 代码的其余部分很好,尽管它很神秘,我宁愿坚持使用 C 而不是尝试修改生成的 HDL。关于如何并行化它或它是否可行的任何建议?

4

1 回答 1

0

首先要注意的是,时钟速度不一定会受到循环是否并行运行的影响。可以改进的是算法的延迟,即运行它所需的总周期数。

两个函数在同一个周期中处理了一些元素。因此,除非您重写函数(可能将它们合并在一起),否则您将拥有无法破坏的数据依赖性(或者您的算法将简单地失败)。检查您正在访问的索引并检查操作的顺序是否保持不变:

for(int i = 0; i < 10; i++) {
  if (i < 5) {
    // Accessing indexes: 0, 2, 4, 6, 8
    my_array[i * 2] = func_b(my_array[i * 2]);
  }
  // Accessing indexes: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  func_a(myarray[i]);
}

您提出的解决方案,即第二个代码片段,将不起作用,因为没有按照与第一个代码片段相同的顺序执行相同的操作(如果您只运行 C/C++ 代码,该代码必须有效,该代码必须具有相同的结果)。

但是,您可以尝试的一件事是像这样放置一个 DATAFLOW 杂注:

#pragma HLS DATAFLOW
for(i = 0; i < 5; i++) {
  my_array[i * 2] = func_b(my_array[i * 2]);
}
for(i = 0; i < 10; i++) {
  func_a(my_array[i]);
}

但我不确定 HLS 是否会正确处理my_array缓冲区,因为它将由两个循环/进程共享。

我必须完全允许 ​​DATAFLOW 的最后一个想法,即通过创建生产者-消费者算法,是将其分成my_array两个不同的缓冲区,一个用于算法的每个部分(i偶数或奇数),如下所示:

int my_array_evens[5] = ...;
int my_array_odds[5] = ...;

#pragma HLS DATAFLOW
for(i = 0; i < 5; i++) {
  my_array_evens[i * 2] = func_b(my_array_evens[i * 2]); // Dataflow producer
}
for(i = 0; i < 10; i++) {
  if (i % 2 == 0) {
    func_a(my_array_evens[i]); // Dataflow consumer
  } else {
    func_a(my_array_odds[i]);
  }
}

注意:如果函数相对较小,请在循环中添加 PIPELINE 编译指示以“加快”速度。

于 2021-03-09T14:57:35.637 回答