2016-04-17 15 views
0

私はマルチスレッドの分野で全く新しいです。現時点では、同じサイズの2つの行列を乗算できるコマンドラインプログラムを実装しようとしています。主な目的は、ユーザーがコマンドライン引数として特定の数のスレッドを入力できることと、この数のスレッドを使用して乗算タスクを解決できることです。マトリクス特定のスレッド数での乗算

私のアプローチは、同様の課題解決しようとすると、次のJava実装に基づいています

:私は2つの問題を抱えている現時点で

using System; 
using System.Threading; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Threading.Tasks; 

class Program 
{ 
    static int rows = 16; 
    static int columns = 16; 
    static int[] temp = new int[rows*columns]; 
    static int[,] matrixA = new int[rows, columns]; 
    static int[,] matrixB = new int[rows, columns]; 
    static int[,] result = new int[rows, columns]; 
    static Thread[] threadPool; 

    static void runMultiplication(int index){ 
     for(int i = 0; i < rows; i++){ 
      for(int j = 0; j < columns; j++){ 
       Console.WriteLine(); 
       result[index, i] += matrixA[index, j] * matrixB[j, i]; 
      } 
     } 
    } 

    static void fillMatrix(){ 
     for (int i = 0; i < matrixA.GetLength(0); i++) { 
      for (int j = 0; j < matrixA.GetLength(1); j++) { 
       matrixA[i, j] = 1; 
       matrixB[i, j] = 2; 
      } 
     }  
    } 

    static void multiplyMatrices(){ 
     threadPool = new Thread[rows]; 

     for(int i = 0; i < rows; i++){ 
      threadPool[i] = new Thread(() => runMultiplication(i)); 
      threadPool[i].Start(); 
     } 

     for(int i = 0; i < rows; i++){ 
      try{ 
       threadPool[i].Join(); 
      }catch (Exception e){ 
       Console.WriteLine(e.Message); 
      } 
     } 
    } 

    static void printMatrix(int[,] matrix) { 
     for (int i = 0; i < rows; i++) 
     { 
      for (int j = 0; j < columns; j++) 
      { 
       Console.Write(string.Format("{0} ", matrix[i, j])); 
      } 
      Console.Write(Environment.NewLine + Environment.NewLine); 
     }  
    } 

    static void Main(String[] args){ 
     fillMatrix(); 
     multiplyMatrices(); 
     printMatrix(result); 
    } 
} 

Java Implementation Matrix Multiplication Multi-Threading

私の現在の状態は、次のいずれかを

  1. 私の結果マトリックスには、有効な結果から遠い値が含まれています
  2. 私はしません自分のゴールに従って正しい方法で使用しているかどうかを知ってください。ユーザーは、使用するスレッドの数を指定できます。

誰かが私を解決策に導くことができれば非常に感謝します。

PS:私の似たような既存の投稿があることを知っていますが、投稿の主な課題は、ユーザーが行列の乗算を解決するスレッドの数を設定できるようにすることです。

+2

'i'変数は、ループの存続期間全体を通して同じメモリ位置を参照します。この答えがあなたの問題を解決することを確認してください:http://stackoverflow.com/questions/34319303/thread-parameters-being-changed –

+0

@HenkHolterman確かに、Parallel.For()は非常に快適なアプローチですが、特定の数のスレッドを定義する可能性があります。 – mian

答えて

1

線形代数は、新しいものであればスレッドで始めるのが難しい場所です。 map/reduceについて最初に学習し、C#で実装することをお勧めします。

コアが1つしかなく、長い計算を実行するとします。オペレーティングシステムによって複数のスレッドがスケジューリングされるので、ある作業が行われ、次に次の作業が行われます。思考実験を行うのは簡単で、コンテキスト切り替えによって問題がシングルスレッドバージョンよりも遅くなることがわかります。そこには真の並列化はありません。

問題は、ほとんどの線形代数演算は容易に並列化できないということです。彼らはお互いに独立していません。コア以外のスレッドでは状況が改善されず、パフォーマンスが低下する可能性があります。

コアごとに1つのスレッドを使用し、thisのようにマトリックスを分割するのが最適です。

マルチスレッドを心配する前に、Matrixクラスを使用して、すべての単一操作が1つのスレッドで正しく機能することを確認してください。あなたのコードが1つのスレッドに対して正しい答えを出せない場合は、マルチスレッドに関する心配はありません。その作業をしてから、問題を複数のスレッドに分割する方法を理解してください。