Altera OpenCL在FPGA中并行执行

时间:2015-07-07 18:49:54

标签: parallel-processing opencl fpga intel-fpga

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

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

谢谢!

2 个答案:

答案 0 :(得分:4)

快速回答是“是”。

根据Altera OpenCL指南,通常有两种方法可以实现这一目标:

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

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

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

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

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

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

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

答案 1 :(得分:1)

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

__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次加法,一次执行向量与元素的求和。如果数据依赖于先前的迭代,则它将展开管道。

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