执行内核
所以现在我们来看看真正的东西,在并行设备上执行你的内核。请阅读有关硬件基础知识的内容,以完全了解内核调度。
首先,你需要在实际调用内核之前设置内核参数。这是通过
err = Cl.SetKernelArg(_kernel, $argumentIndex, $argument);
如果在启动内核之前没有设置每个参数,则内核将失败。
在我们实际启动内核之前,我们需要计算全局工作大小和本地工作大小。
全局工作大小是将在 GPU 上启动的线程总数。本地工作大小是每个线程块内的线程数。如果内核不需要任何特殊要求,则可以省略本地工作大小。但是,如果给出了本地工作规模,则全局工作规模必须是本地工作规模的倍数。
工作尺寸可以是一维的,二维的或三维的。你想要多少尺寸的选择完全取决于你,你可以选择最适合你算法的任何尺寸。
现在我们决定了我们的工作规模,我们可以调用内核。
Event clevent;
err = Cl.EnqueueNDRangeKernel(_queue, _kernel, $dimensions, null, $globalWorkSize, $localWorkSize, 0, null, out clevent);
$ dimensions 定义了我们所需的维度数,$ globalWorkSize 是一个大小为$ dimension 的数组,其全局工作大小与$ localWorkSize 相同。最后一个参数为你提供了一个表示你当前执行的内核的对象。