執行核心

所以現在我們來看看真正的東西,在並行裝置上執行你的核心。請閱讀有關硬體基礎知識的內容,以完全瞭解核心排程。

首先,你需要在實際呼叫核心之前設定核心引數。這是通過

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 相同。最後一個引數為你提供了一個表示你當前執行的核心的物件。