网站建设编程时注意事项,12580黄页推广,wordpress 技术,深圳的网站建设公司的外文名是目录
1. 简介
2. 示例分析
2.1 代码分析
2.2 控制驱动TLP的关键特征
2.3 数据驱动TLP的关键特征
3. 总结 1. 简介
在 HLS 硬件加速领域#xff0c;Vitis HLS 提供了强大的抽象并行编程模型。这些模型包括控制驱动和数据驱动的任务级并行性#xff08;TLP#xff09;Vitis HLS 提供了强大的抽象并行编程模型。这些模型包括控制驱动和数据驱动的任务级并行性TLP它们是硬件设计优化的基石。控制驱动TLP通过#pragma HLS dataflow指令实现函数的并行执行而数据驱动TLP则利用hls::task类将函数转化为并行任务。这篇博文将深入探讨这两种并行性的特点并通过代码示例展示它们在实际硬件设计中的应用揭示如何有效地结合这两种模型以提升硬件性能和加速复杂算法的执行。 2. 示例分析
2.1 代码分析
#include hls_np_channel.h
#include hls_task.hvoid worker(hls::streamint in, hls::streamint out) {int i in.read();int o i * 2 1;out.write(o);
}void read_in(int* in, int n, hls::streamint out) {for (int i 0; i n; i) {out.write(in[i]);}
}void write_out(hls::streamint in, int* out, int n) {for (int i 0; i n; i) {out[i] in.read();}
}void dut(int in[16], int out[16], int n) {hls_thread_local hls::split::round_robinint, 4 split1;hls_thread_local hls::merge::round_robinint, 4 merge1;
#pragma HLS dataflowread_in(in, n, split1.in);// Task-Channelshls_thread_local hls::task t[4];for (int i 0; i 4; i) {
#pragma HLS unrollt[i](worker, split1.out[i], merge1.in[i]);}write_out(merge1.out, out, n);
}
功能分析
worker从输入流中读取数据进行处理乘2加1然后将结果写入输出流。read_in从输入数组中读取数据写入到输出流。write_out从输入流中读取数据写入到输出数组。
2.2 控制驱动TLP的关键特征
#pragma HLS dataflow 指示HLS工具启用数据流模式让不同的函数可以并行执行它是控制驱动TLP的关键特征具体体现如下
read_in 函数和 split1 模块将数据分发到不同的通道。四个 worker 函数并行处理数据。write_out 函数和 merge1 模块从不同的通道收集数据并写入输出数组。
此外顶层函数 void dut(int in[16], int out[16], int n) 中参数 in 和 out 均为外部存储器。 2.3 数据驱动TLP的关键特征
hls::task是一个任务通道它允许将函数作为任务并行执行它是数据驱动TLP的关键特征。
示例代码中worker函数被封装成任务并分配给四个hls::task实例每个实例处理输入数据流的一部分并将结果发送到合并通道。
hls::split::round_robin和hls::merge::round_robin是用于数据分割和合并的工具它们支持数据流中的并行处理。split1将输入数据流平均分配给四个工作任务而merge1则将这些任务的输出合并回单个数据流。
#pragma HLS unroll指令用于完全展开循环确保所有任务并行执行。 3. 总结
在Vitis HLS中控制驱动Control-driven和数据驱动Data-driven的并行性是高效硬件设计的两个关键组成部分。控制驱动并行性通过#pragma HLS dataflow指令实现允许不同函数在数据准备好时即刻并行执行从而优化整体性能。数据驱动并行性则通过hls::task类实现它将函数封装为可并行执行的任务。这两种技术的结合使得设计者能够充分利用硬件资源实现复杂算法的高效执行。通过示例代码的分析我们可以看到如何在实践中应用这些并行编程模型以及它们如何协同工作以达到最佳的硬件加速效果。