【问题标题】:Altera OpenCL parallel execution in FPGAFPGA 中的 Altera OpenCL 并行执行
【发布时间】:2015-08-14 15:26:57
【问题描述】:

我一直在研究 Altera OpenCL,通过将计算部分移至 FPGA 来改进繁重的计算程序。我设法执行了 Altera 提供的向量加法示例,并且似乎工作正常。我查看了 Altera OpenCL 的文档并了解到 OpenCL 使用流水线并行性来提高性能。

我想知道是否有可能实现类似于 VHDL 中的多个进程在 FPGA 中使用 Altera OpenCL 并行执行的并行执行。就像在一台可以并行执行的设备中启动多个内核一样?可能吗?如何检查它是否受支持?任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 您是否已经阅读了 Altera 广泛的 OpenCL 文档并观看了他们的视频?我希望有一种方法可以用流水线结果的多个副本填充 FPGA,以提高性能。

标签: parallel-processing opencl fpga intel-fpga


【解决方案1】:

答案是肯定的。

根据 Altera OpenCL 指南,一般有两种方法可以实现:

1/ SIMD 用于矢量化数据加载/存储

2/ 复制设备上的计算资源

对于 1/,使用 num_simd_work_itemsreqd_work_group_size 内核属性,来自同一个工作组的多个工作项将同时运行

对于 2/,使用 num_compute_units 内核属性,多个工作组将同时运行

请先开发单个工作项内核,然后使用1/来提高内核性能,一般会最后考虑2/。

通过执行 1/ 和 2/,将有多个工作组,每个工作组都有多个工作项在 FPGA 设备上同时运行。

注意:根据您要解决的问题的性质,上述优化可能并不总是合适的。

【讨论】:

  • Re 1/ 值得一提:在 Altera 上也可以进行手动向量化(使用 OpenCL 向量类型,如 int4 等),这在处理更复杂的内核时很有用。
  • @doqtor 同意!感谢您添加您的评论,我投了赞成票:)
【解决方案2】:

如果您要多次复制内核,则可以增加计算单元的数量。您可以在内核之前添加一个属性。

__attribute__((num_compute_units(N)))
__kernel void test(...){
    ...
}

通过这样做,您实际上复制了内核 N 次。但是,编程指南指出,您可能首先考虑使用 simd 属性,它执行相同的操作但处理多个数据。这样,对全局内存的访问变得更加高效。通过增加计算单元的数量,如果您的内核具有全局内存访问权限,则可能会出现争用,因为多个计算单元正在竞争访问全局内存。

您还可以使用循环展开在细粒度级别复制操作。例如,

#pragma unroll N
for(short i = 0; i < N; i++)
    sum[i] = a[i] + b[i]

这实际上将通过创建硬件来执行 N 次加法,从而一次性执行 N 次向量的求和。如果数据依赖于先前的迭代,那么它会展开管道。

另一方面,如果您的目标是启动具有不同操作的不同内核,您可以通过在 OpenCL 文件中创建内核来实现。当你编译内核时,它会将文件中的内核一起映射和解析到 FPGA 中。之后,您只需要通过调用 clEnqueueNDRangeKernel 或 clEnqueueTask 来调用主机中的内核。将命令排入队列后,内核将并行运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多