基于FPGA的OpenCL单工作项与NDRange内核
我是OpenCL新手,正在FPGA上使用OpenCL进行分组密码加密。我读了一些文章,知道Opencl中有两种内核(单工作项和NDRange)。NDRange内核的函数不会被编译器自动流水线化,而单个工作项内核的函数将被流水线化 是否建议实现单个工作项内核而不是NDRange内核 在FPGA上?为什么?基于FPGA的OpenCL单工作项与NDRange内核,opencl,gpu,fpga,pipeline,Opencl,Gpu,Fpga,Pipeline,我是OpenCL新手,正在FPGA上使用OpenCL进行分组密码加密。我读了一些文章,知道Opencl中有两种内核(单工作项和NDRange)。NDRange内核的函数不会被编译器自动流水线化,而单个工作项内核的函数将被流水线化 是否建议实现单个工作项内核而不是NDRange内核 在FPGA上?为什么? 如果我想让内核在循环中运行,直到读取所有数据,那么内核(一次从主机获取一些数据——在FPGA上运行——写回)。如何实现管道 单工作项内核允许您将计算循环移动到内核中,您可以生成自定义管道,对累积
如果我想让内核在循环中运行,直到读取所有数据,那么内核(一次从主机获取一些数据——在FPGA上运行——写回)。如何实现管道 单工作项内核允许您将计算循环移动到内核中,您可以生成自定义管道,对累积进行巧妙的优化,并通过“pragmas”控制访问模式。NDRange内核依赖于您在工作项之间划分数据,编译器生成SIMD类型的硬件,每个单元由内核描述。如果您的问题具有规则的数据并行性,从而使分区变得容易,这是很好的。OpenCL的NDRange内核是为GPU等SIMD计算单元设计的。您还可以利用“通道”在流式应用程序中的单个工作项内核之间移动数据,从而减轻DRAM带宽。对于NDRange内核,您必须使用全局内存作为内核之间共享数据的媒介 Shreedutt的回答在2016年之前基本上可以接受。英特尔的管道和通道实现远远超出了这一范围:
__kernel void ordering (__global int * data, int X) {
int n = 0;
while (n < X)
{
write_channel_intel (req, data[get_global_id(0)]);
n++;
}
}
\uuuuu内核无效排序(\uuuu全局int*数据,int X){
int n=0;
而(n
IMHO这是软件定义的FPGA最重要的主题,因为它是面包片,特别是如果我们想赢得ML/AI GPU与FPGA的比赛。我支持FPGA团队。我建议查看FPGA供应商的指导。他们最了解自己的编译器。我在他们的网站上也看到了一些不错的视频。因此,你不仅会学到这个问题的答案,而且在这个过程中你可能会学到更多。
__kernel void ordering (__global int * data, int X) {
int n = 0;
while (n < X)
{
write_channel_intel (req, data[get_global_id(0)]);
n++;
}
}