基于FPGA的OpenCL单工作项与NDRange内核

基于FPGA的OpenCL单工作项与NDRange内核,opencl,gpu,fpga,pipeline,Opencl,Gpu,Fpga,Pipeline,我是OpenCL新手,正在FPGA上使用OpenCL进行分组密码加密。我读了一些文章,知道Opencl中有两种内核(单工作项和NDRange)。NDRange内核的函数不会被编译器自动流水线化,而单个工作项内核的函数将被流水线化 是否建议实现单个工作项内核而不是NDRange内核 在FPGA上?为什么? 如果我想让内核在循环中运行,直到读取所有数据,那么内核(一次从主机获取一些数据——在FPGA上运行——写回)。如何实现管道 单工作项内核允许您将计算循环移动到内核中,您可以生成自定义管道,对累积

我是OpenCL新手,正在FPGA上使用OpenCL进行分组密码加密。我读了一些文章,知道Opencl中有两种内核(单工作项和NDRange)。NDRange内核的函数不会被编译器自动流水线化,而单个工作项内核的函数将被流水线化

是否建议实现单个工作项内核而不是NDRange内核 在FPGA上?为什么?


如果我想让内核在循环中运行,直到读取所有数据,那么内核(一次从主机获取一些数据——在FPGA上运行——写回)。如何实现管道

单工作项内核允许您将计算循环移动到内核中,您可以生成自定义管道,对累积进行巧妙的优化,并通过“pragmas”控制访问模式。NDRange内核依赖于您在工作项之间划分数据,编译器生成SIMD类型的硬件,每个单元由内核描述。如果您的问题具有规则的数据并行性,从而使分区变得容易,这是很好的。OpenCL的NDRange内核是为GPU等SIMD计算单元设计的。您还可以利用“通道”在流式应用程序中的单个工作项内核之间移动数据,从而减轻DRAM带宽。对于NDRange内核,您必须使用全局内存作为内核之间共享数据的媒介

Shreedutt的回答在2016年之前基本上可以接受。英特尔的管道和通道实现远远超出了这一范围:

  • 如果您对工作项ID没有工作项变量或依赖关系,则用户可以有多个内核或多个工作项访问管道
  • 可以控制和保证从多个工作项(例如NDRange内核)访问管道的确定顺序:“当管道存在于包含多个工作项的循环体中时,如下所示,每个 循环迭代在后续迭代之前执行。这意味着工作组中每个工作项的循环迭代0在工作组中每个工作项的迭代1之前执行,依此类推。”

  • 通道扩展是一种可行的替代方案,可在多个工作项的循环中执行:

    __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
  • UG-OCL002 | 2018.05.23第5节中对通道和管道有限制和警告。我建议大家通读一下,看看最新的训练版。另一个巨大的警告是,大公司决定为OpenCL提供单独的代码语法,需要不同的pragma,一个多一个少

  • 但是,我应该从以下IWOCL演示开始:。原因是这些都是新的计算模型,通过合理地构造并行应用程序,可以获得巨大的性能提升。更重要的是学习如何移动而不是移动数据。查看GPU移除转置的最新技巧: 我们可以在FPGA中做更多这样的把戏,对吗

  • 我把它留给感兴趣的读者和贡献者来关注XILINX OpenCL管道


    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++;
      }
    }