2016-10-27 26 views
1

私は行列乗算を実行するプログラムを持っています。私はマルチスレッドとシングルスレッド版を持っています。マルチスレッド版はシングルスレッド版よりも遅く、理由はわかりません。あなたは私にそれを説明できますか?マルチスレッドはシングルスレッドよりも遅い

マルチスレッド(サイズ= 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]; 
} 
+0

ジョインスレッドの追加時間はありますか?実際には、かなりの量がかかることがあります。 –

+5

セマフォのために並行性はまったくありません。だから、決して速くはありません。さらに悪いことに、最も遅いスレッドより速くなることはありません。ワーカースレッドを使用してもほとんど機能しません。スレッドの作成によるオーバーヘッドとコンテキスト切り替えが追加され始めます。独自の行列乗算器を考案してはいけません。これは完了し、徹底的に最適化されています。 –

+0

また、無制限のスピードアップを得ることはありません。 16コアを使用している場合は、「サイズ= 128の場合」約16スレッドしか使用しないでください。128スレッドを作成しているように見えますが、1つのプロセッサでは1スレッドよりも8スレッドは速く実行されません。もっとゆっくり。 – Quantic

答えて

4

それは珍しいことではない。スレッド、特にスレッド同期は、多くのオーバーヘッドを追加する傾向があります。そのため、マルチスレッドは慎重に検討するもので、非同期だがマルチスレッドのアプローチではないことがしばしば正解です。

CPUの重いタスクを実行している場合は、1つまたは少数のワーカースレッドで実行する方がよい場合があります。通常、CPUの制限されたスレッドの数がプロセッサの使用可能なコアを超えると、実際にはパフォーマンスが向上せず、実際にはパフォーマンスが低下します。

幼稚園児の授業を戸口を通って窪みに行くことを想像してみましょう。実際にそれらを整列させて整然としたやり方で進めるのは、互いを押しのけて最初から乗り越えるよりも速いのです。

スレッドがCPU時間のために戦う前の時点でも、スレッドの並列化によって得られるよりも同期化のオーバーヘッドがより多くの時間を要すると、スレッド化が遅くなる可能性があります。

0

マルチスレッドはシングルスレッドよりも必ずしも高速であるとは限りません。スレッドの作成と同期の追加のオーバーヒアは、問題を完了するのに要する時間に大きく貢献する可能性があります。また、あなたのCPUにはいくつのコアがあるか(マルチスレッドのパフォーマンスが最悪であるかのように)など、マルチスレッドに対応する他の要因もあります。

関連する問題