OpenCL 设备队列

我们有如下图中这样一种应用场景,采用GPU对流体模拟。气体的活跃度和强度随着空间位置的变化而变化。为了更好地模拟气体流动细节,在图中右边建模所需的计算明显要高于左边。

在OpenCL 1.2中,NDRange都是在主机端启动,完成计算任务所需的工作项且工作项都是在启动之前就已定义好。如此一来,若使用固定大小的细网格来计算,对于图像中左边区域明显增加了很多无用的计算量。但是如果使用粗粒度的网格来计算,图像右边区域精度就会下降。有没有一种方式可以根据需求来动态分配网格大小呢?如下图中右下部分动态分配网格图。

固定网格与动态网格流体模拟

OpenCL 2.0允许内核程序在设备端队列中增加内核执行,也就是说在设备上正在运行的内核A可以根据需求调用内核B(我们把内核A称为父内核,内核B称为子内核),无需把内核执行控制权交还给主机,下图大致比较了OpenCL 1.2中内核调用方式和OpenCL 2.0中设备队列方式的不同执行过程。减少了内核A返回时间和主机调用内核B的时间,对于某些频繁调用内核函数的应用场景来说可以提升程序性能。

OpenCL 1.2内核调用和OpenCL 2.0设备内核

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程