• ベストアンサー

スレッドについて質問があります。

こんばんは。 今、「スレッドを使った並列計算」というテーマを考えています。 並列処理が可能である行列の計算を、スレッドを用いて処理してみる、といったことをやっているんですが、スレッドの使い方がいまいちわかりません。 プログラムなんですが、はじめに、n行n列の配列を定義します(nは自分で入力)。 double A[][] = new double [n][n]; double B[][] = new double [n][n]; double C[][] = new double [n][n]; その後、A行列、B行列として使う配列に数値を代入します(A行列には1~n^2、B行列には(n^2)+1~(n^2)*2までの数値が代入されるようになっています)。 そして、次の計算を行なうわけですが・・・ for (i = 0; i < n; i++){ for (j = 0; j < n; j++){ C[i][j]=0; for (k = 0; k < n; k++){ C[i][j] += A[i][k] * B[k][j]; } } } この計算をどうスレッドに対応させればいいのか、わからなくてずっと悩んでいます。 ぜひみなさんの意見、アドバイスを聞かせてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

まあ普通のコンピュータでは、 スレッドを使って分散計算をさせても あまり意味はないんですけど、 学習・研究目的ということですね。 端的には、ループで計算しているところの一段目を 「i=aからbまではこのスレッドがやる」 というふうにして、仕事を分ければいいでしょう。 スレッドのrun()の中で for (i = a; i < b; i++){ for (j = 0; j < n; j++){ C[i][j]=0; for (k = 0; k < n; k++){ C[i][j] += A[i][k] * B[k][j]; } } } のようにし、(a, b)を引数としてスレッドを作っておいて、 start()させたらいいと思います。

jin_09
質問者

お礼

なるほどと思いました。こんな考え方であれば、可能ですよね。いろいろ試してがんばってみます。ありがとうございました。

その他の回答 (1)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

このプログラムではあえて複数のスレッドを使って並列処理を行う必要は内容に思われます。 行列Cの計算も一つのスレッドでやってしまったほうが、プログラムも簡潔になりスピーディに動くでしょう。 例えば、「一つ目のスレッドで行列AとBを掛けてCを計算し、同時に二つ目のスレッドで行列BとAを掛けてDを計算する」というのであれば、複数のスレッドで並列処理を行う意義が出てくるでしょう。

jin_09
質問者

お礼

そうなんですよね。そう思うんですが、研究目的なので、あまり気にしなくていいみたいです。ご意見ありがとうございました。

関連するQ&A

専門家に質問してみよう