运行并行OpenCL内核

时间:2014-12-02 02:08:36

标签: parallel-processing opencl

我一直在研究OpenCL,看看它在我的上下文中是否有用,虽然我理解了基础知识,但我不确定我是否理解如何强制内核的多个实例并行运行。

在我的情况下,我想要运行的应用程序本质上是顺序的,并且(在某些情况下)需要非常大的输入(数百MB)。但是,有问题的应用程序有许多不同的选项/标志可以设置,在某些情况下可以使它更快或更慢。我希望我们可以重新编写OpenCL的应用程序,然后并行执行每个选项/标志,而不是猜测要使用哪些标志。

我的问题是: 一个图形卡可以并行运行多少个内核。这是购买时可以看到的东西吗?它是否与着色器,内存或应用程序/内核的大小相关联?

此外,虽然应用程序的输入将是相同的,但每次执行都将以不同的方式修改数据。我是否需要单独将输入数据传输到每个内核以实现此目的,或者每个内核是否可以分配" local"存储器中。

最后,这甚至需要多个内核,我可以使用工作项吗?在这种情况下,您如何确定可并行运行的工作项数量?

(参考:http://www.drdobbs.com/parallel/a-gentle-introduction-to-opencl/231002854?pgno=3

3 个答案:

答案 0 :(得分:3)

您的问题似乎不时出现在各种论坛和SO上。用于在硬件级别单独运行内核的功能称为设备分裂。详细了解this page上的扩展程序,或google" cl_ext_device_fission"。

此扩展已在CPU上启用了很长时间,但在GPU上未启用。最新的图形硬件可能支持设备裂变。您可能至少需要2014年第二季度或更新的GPU,但这必须由您来研究。

使用OpenCL软件让内核并行运行的方法是在同一设备上使用不同的命令队列对它们进行排队。一些开发人员说,多个队列会损害性能,但我个人没有经验。

答案 1 :(得分:1)

  • 显卡可并行运行多少内核?

您可以查看有多少内核实例(即具有不同启动ID的相同内核代码)可以在显卡上并行运行。这是SIMD / CU /着色器/等的功能。取决于GPU供应商喜欢称之为什么。获取确切数量的内核实例确实执行的数量有点复杂,因为这取决于占用,这取决于内核使用的资源,例如:使用的寄存器,使用的本地存储器。

如果你的意思是有多少内核调度(即不同的内核代码和cl_kernel对象或不同的内核参数)可以并行运行,那么我所知道的所有GPU只能运行单个内核一时间这些内核可以从多个命令队列中获取,但GPU一次只能处理一个。这就是当前GPU不支持cl_ext_device_fission的原因 - 没有办法" split"硬件。不过,您可以在内核代码中自己完成(见下文)。

  • 每个内核都可以分配" local"存储器?

烨。这正是OpenCL本地内存的用途。但是,它是一个有限的资源,所以应该考虑内核控制的缓存而不是堆。

  • 在这种情况下,您如何确定可并行运行的工作项数量?

与假设内核实例的第一个问题相同的答案。

  • 这甚至需要多个内核,我可以使用工作项吗?

您可以使用uber内核模拟运行的不同内核,该内核根据工作项全局ID决定运行哪个子内核。例如:

void subKernel0( .... )
{
    int gid = get_global_id(0);
    // etc.
}

void subKernel1( .... )
{
    int gid = get_global_id(0) - DISPATCH_SIZE_0;
    // etc.
}

__kernel uberKernel( .... )
{
    if( get_global_id(0) < DISPATCH_SIZE_0 )
    {
        subKernel0( .... );
    }
    else if( get_global_id(0) < DISPATCH_SIZE_0 + DISPATCH_SIZE_1 )
    {
        subKernel1( .... );
    }
    else if( .... )
    {
        // etc.
    }
}

使调度大小倍数为32/64等的通常性能建议也适用于此处。您还必须调整其他各种ID。

答案 2 :(得分:1)

支持兼容2008ish到2015ish硬件,只需安全地假设每个gpu只能在任何时刻运行一个内核,并且内核在runtume上交换和编译,排队等待模拟多个内核。 交换内核是大型内核优于微内核的原因。

单内核客户端计算单元是默认值。 具有同时运行2个并行不同的独立内核的选项是例外。假设它很罕见,不受支持或较慢。

当然,一台计算机中的2cpus可以这样做。但截至2016年,在一个系统中有2个cpus仍然有点太罕见。甚至更少有4。

某些图形卡可能能够并行运行2个内核。让他们不要这么做。