2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊
對(duì)于并行執(zhí)行,您需要在方法的開頭刪除像變量聲明這樣的 c 語言,并在實(shí)際使用的范圍內(nèi)聲明它們,這樣它們就不會(huì)在線程之間共享。使其并行應(yīng)該為性能提供一些好處,但是將它們?nèi)吭O(shè)為ParallerFors 并不是一個(gè)好主意,因?yàn)閷?shí)際上可以并行運(yùn)行的線程數(shù)量是有限制的。我會(huì)嘗試僅使用頂級(jí)循環(huán)來實(shí)現(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貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是使用 GPU 優(yōu)于使用 CPU 的任務(wù)的完美示例。GPU 每秒能夠執(zhí)行數(shù)萬億次浮點(diǎn)運(yùn)算 (TFlops),而 CPU 性能仍以 GFlops 衡量。要注意的是,只有使用 SIMD 指令(單指令多數(shù)據(jù))才有用。GPU 擅長數(shù)據(jù)并行任務(wù)。如果不同的數(shù)據(jù)需要不同的指令,使用 GPU 沒有優(yōu)勢。
在您的程序中,位圖的元素經(jīng)過相同的計(jì)算:相同的計(jì)算只是數(shù)據(jù)略有不同(SIMD!)。所以使用 GPU 是一個(gè)不錯(cuò)的選擇。這不會(huì)太復(fù)雜,因?yàn)?GPU 上的計(jì)算線程不需要交換信息,它們也不依賴于先前迭代的結(jié)果(每個(gè)元素將由 GPU 上的不同線程處理)。
例如,您可以使用 OpenCL 輕松訪問 GPU。
- 2 回答
- 0 關(guān)注
- 262 瀏覽
添加回答
舉報(bào)