2 回答

TA貢獻1829條經(jīng)驗 獲得超13個贊
對于并行執(zhí)行,您需要在方法的開頭刪除像變量聲明這樣的 c 語言,并在實際使用的范圍內(nèi)聲明它們,這樣它們就不會在線程之間共享。使其并行應該為性能提供一些好處,但是將它們?nèi)吭O為ParallerFors 并不是一個好主意,因為實際上可以并行運行的線程數(shù)量是有限制的。我會嘗試僅使用頂級循環(huán)來實現(xiàn)它:
private static float[,] Differentiate(int[,] Data, int[,] Filter)
{
var Fw = Filter.GetLength(0);
var Fh = Filter.GetLength(1);
float[,] Output = new float[Width, Height];
Parallel.For(Fw / 2, Width - Fw / 2 - 1, (i, state) =>
{
for (var j = Fh / 2; j <= (Height - Fh / 2) - 1; j++)
{
var sum = 0;
for (var k = -Fw / 2; k <= Fw / 2; k++)
{
for (var l = -Fh / 2; l <= Fh / 2; l++)
{
sum = sum + Data[i + k, j + l] * Filter[Fw / 2 + k, Fh / 2 + l];
}
}
Output[i, j] = sum;
}
});
return Output;
}

TA貢獻1811條經(jīng)驗 獲得超5個贊
這是使用 GPU 優(yōu)于使用 CPU 的任務的完美示例。GPU 每秒能夠執(zhí)行數(shù)萬億次浮點運算 (TFlops),而 CPU 性能仍以 GFlops 衡量。要注意的是,只有使用 SIMD 指令(單指令多數(shù)據(jù))才有用。GPU 擅長數(shù)據(jù)并行任務。如果不同的數(shù)據(jù)需要不同的指令,使用 GPU 沒有優(yōu)勢。
在您的程序中,位圖的元素經(jīng)過相同的計算:相同的計算只是數(shù)據(jù)略有不同(SIMD!)。所以使用 GPU 是一個不錯的選擇。這不會太復雜,因為 GPU 上的計算線程不需要交換信息,它們也不依賴于先前迭代的結果(每個元素將由 GPU 上的不同線程處理)。
例如,您可以使用 OpenCL 輕松訪問 GPU。
- 2 回答
- 0 關注
- 250 瀏覽
添加回答
舉報