FPGA上的OpenCL单一工作项VS NDRange内核

时间:2017-08-09 22:13:01

标签: opencl gpu fpga pipeline

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

Shreedutt的回答在2016年之前普遍可以接受。英特尔的管道和渠道实施远远超出了这个范围:

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

    __kernel void ordering (__global int * data, write_only pipe int __attribute__((blocking)) req)
    {
    write_pipe (req, &data[get_global_id(0)]);
    }
    
  3. 频道扩展是一种可行的替代方案,可以在包含多个工作项的循环中执行:

    __kernel void ordering (__global int * data, int X) {
      int n = 0;
      while (n < X)
      {    
        write_channel_intel (req, data[get_global_id(0)]);
        n++;
      }
    }
    
  4. 在UG-OCL002的第5部分中可以找到限制和警告2018.05.23用于渠道和管道。我建议阅读它并观看最新的训练区https://www.youtube.com/watch?v=_0RtAKeRl00。另一个重要的警告是,大公司决定为OpenCL提供单独的代码语法,需要不同的编译指示,而另一个更少。

  5. 我应该从这个IWOCL演示开始:https://www.iwocl.org/wp-content/uploads/iwocl2017-kapre-patel-opencl-pipes.pdf。原因是这些是新的计算模型,通过适当地构建并行应用程序可以获得巨大的性能提升。更重要的是学习如何移动而不是移动数据。查看删除转置的最新技巧GPU:https://devblogs.nvidia.com/tensor-core-ai-performance-milestones/ 我们可以在FPGA中做更多这样的技巧,可以吗?

  6. 我留给感兴趣的读者和贡献者来加权XILINX OpenCL管道。

    恕我直言,这是软件定义FPGA最重要的话题,因为切片面包,特别是如果我们要在ML / AI GPU和FPGA中赢得一些比赛。我支持FPGA团队。