Parallel processing FPGA中的Altera OpenCL并行执行

Parallel processing FPGA中的Altera OpenCL并行执行,parallel-processing,opencl,fpga,intel-fpga,Parallel Processing,Opencl,Fpga,Intel Fpga,我研究AlteraOpenCL有一段时间了,通过将计算部分转移到FPGA来改进繁重的计算程序。我成功地执行了Altera提供的向量加法示例,看起来效果不错。我看过Altera OpenCL的文档,了解到OpenCL使用流水线并行来提高性能 我想知道是否有可能实现类似于VHDL中使用Altera OpenCL在FPGA中并行执行的多个进程的并行执行。比如在一个设备中启动多个内核,可以并行执行?可能吗?如何检查它是否受支持?任何帮助都将不胜感激 谢谢 如果要多次复制内核,可以增加计算单元的数量。在内

我研究AlteraOpenCL有一段时间了,通过将计算部分转移到FPGA来改进繁重的计算程序。我成功地执行了Altera提供的向量加法示例,看起来效果不错。我看过Altera OpenCL的文档,了解到OpenCL使用流水线并行来提高性能

我想知道是否有可能实现类似于VHDL中使用Altera OpenCL在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]
#pragma展开N
对于(短i=0;i
这将通过创建硬件进行N次加法,一次完成向量与元素的N次求和。如果数据依赖于上一次迭代,那么它将展开管道


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

答案是肯定的

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

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

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

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

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

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

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


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

您是否已经阅读了Altera的所有OpenCL文档并观看了他们的视频?我希望有一种方法可以用流水线结果的多个副本填充FPGA,以提高性能。Re 1/值得一提:在Altera上也可以手动矢量化(使用OpenCL矢量类型,如int4等),这在处理更复杂的内核时非常有用。@doqtor同意!感谢您添加您的评论,我向上投了一票:)