私は行列乗算を実行するプログラムを持っています。私はマルチスレッドとシングルスレッド版を持っています。マルチスレッド版はシングルスレッド版よりも遅く、理由はわかりません。あなたは私にそれを説明できますか?マルチスレッドはシングルスレッドよりも遅い
マルチスレッド(サイズ= 128、秒付近ストップウォッチ番組):
private static SemaphoreSlim semaphore = new SemaphoreSlim(size, size);
(...)
for (int i = 0; i < size; i++)
{
threads[i] = new Thread(() => Multiply(ref a, ref b, ref c));
threads[i].Name = i.ToString();
threads[i].Start();
}
for (int i = 0; i < size; i++)
threads[i].Join();
(...)
public static void Multiply(ref float[,] a, ref float[,] b, ref float[,] c)
{
int index = int.Parse(Thread.CurrentThread.Name);
semaphore.Wait();
for (int j = 0; j < c.GetLength(0); j++)
for (int k = 0; k < c.GetLength(0); k++)
c[index, j] += a[index, k] * b[k, j];
semaphore.Release();
}
Singlethreaded(サイズ= 128、秒付近ストップウォッチ番組):
for (int i = 0; i < size; i++)
Multiply(i, ref a, ref b, ref c);
(...)
public static void Multiply(int i, ref float[,] a, ref float[,] b, ref float[,] c)
{
for (int j = 0; j < c.GetLength(0); j++)
for (int k = 0; k < c.GetLength(0); k++)
c[i, j] += a[i, k] * b[k, j];
}
ジョインスレッドの追加時間はありますか?実際には、かなりの量がかかることがあります。 –
セマフォのために並行性はまったくありません。だから、決して速くはありません。さらに悪いことに、最も遅いスレッドより速くなることはありません。ワーカースレッドを使用してもほとんど機能しません。スレッドの作成によるオーバーヘッドとコンテキスト切り替えが追加され始めます。独自の行列乗算器を考案してはいけません。これは完了し、徹底的に最適化されています。 –
また、無制限のスピードアップを得ることはありません。 16コアを使用している場合は、「サイズ= 128の場合」約16スレッドしか使用しないでください。128スレッドを作成しているように見えますが、1つのプロセッサでは1スレッドよりも8スレッドは速く実行されません。もっとゆっくり。 – Quantic