FPGA中的Altera OpenCL并行执行

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

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

谢谢!


快速回答是YES。

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

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

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

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

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

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

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

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


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

__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来在主机中调用内核。 排队命令后,内核将并行运行。

链接地址: http://www.djcxy.com/p/46433.html

上一篇: Altera OpenCL parallel execution in FPGA

下一篇: restrict OpenCL access to Intel CPU?