我(經由Cudafy.NET library,雖然我在CUDA/C++方法同樣的興趣)執行在CUDA一些陣列操縱/計算,並且需要計算的最小和數組中的最大值。其中一個內核看起來是這樣的:返回的數組的最小和最大元素CUDA
[Cudafy]
public static void UpdateEz(GThread thread, float time, float ca, float cb, float[,] hx, float[,] hy, float[,] ez)
{
var i = thread.blockIdx.x;
var j = thread.blockIdx.y;
if (i > 0 && i < ez.GetLength(0) - 1 && j > 0 && j < ez.GetLength(1) - 1)
ez[i, j] =
ca * ez[i, j]
+ cb * (hx[i, j] - hx[i - 1, j])
+ cb * (hy[i, j - 1] - hy[i, j])
;
}
我想要做的是這樣的:要返回的最小值和最大值(整個陣列的便捷方式
[Cudafy]
public static void UpdateEz(GThread thread, float time, float ca, float cb, float[,] hx, float[,] hy, float[,] ez, out float min, out float max)
{
var i = thread.blockIdx.x;
var j = thread.blockIdx.y;
min = float.MaxValue;
max = float.MinValue;
if (i > 0 && i < ez.GetLength(0) - 1 && j > 0 && j < ez.GetLength(1) - 1)
{
ez[i, j] =
ca * ez[i, j]
+ cb * (hx[i, j] - hx[i - 1, j])
+ cb * (hy[i, j - 1] - hy[i, j])
;
min = Math.Min(ez[i, j], min);
max = Math.Max(ez[i, j], max);
}
}
有誰知道,不只是每個線程或塊)?
傳統上通過縮減操作找到最小值和最大值。我對Cudafy不太熟悉,但這看起來並不像減少。 – alrikai
@alrikai我會很高興地屠殺和補充我的代碼來解決這個問題。我看了一下map/reduce等,但實現有點模糊。忘記Cudafy部分:你如何直接在CUDA/C++中執行它? –
你可以使用'thrust'或'npp'。 – sgarizvi