执行内核

所以现在我们来看看真正的东西,在并行设备上执行你的内核。请阅读有关硬件基础知识的内容,以完全了解内核调度。

首先,你需要在实际调用内核之前设置内核参数。这是通过

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 相同。最后一个参数为你提供了一个表示你当前执行的内核的对象。