週一ブログ ~2回目~

  • 今回扱うテーマは「マルチコア」です

今週の担当は修士2年の佐賀美です

大学院の授業でこの手の話が出てきたので、紹介します

多分、みなさんはスマホやパソコンを使用したことがありますよね?それらのカタログを見てみると、「デュアルコア」とか「クアッドコア」などと書かれていませんか?(「コア」とはスマホやPCなどで計算を行うチップのことです)

この「デュアルコア」とかクアッドコア」とは「コア」の数を表しており(前者は2つ、後者は4つ)、「コア」が複数個配置されているチップを「マルチコア」と呼びます

なぜ複数個ついているかと言うと、より多くの計算を一度に行うためです(注意!:本当は他の理由もあります!消費電力とか熱問題とか)

前置きが長くなりましたが、これから「コア」を複数個使った場合と1つだけ使った場合では、こんなに性能が違うんだ、ということをプログラムであらわします

  • 使った環境:

PC (Win 7 Pro 64bit, Core i5 3470S, 4GB Memory)

Visual Studio 2012 (OpenMP使用)

あなたが会津大生なら、製品版のVisual Studio がタダで使えますよ↓

https://www.dreamspark.com/Student/Default.aspx

  • 書いたプログラム

プログラムは添付しておきますTest_OpenMP、拡張子はcppにしてください

今回書いたプログラムは、1000^3回ループを行うプログラムです。こいつを、下記のように#pragma … で囲むだけで勝手に並列化をしてくれます。具体的には、「4つのコア」がそれぞれ「独立して」1000^3回のループ計算を実行します

#pragma omp parallel private(i, j, k)
{
for ( i=0; i<1000; i++ )
for ( j=0; j<1000; j++ )
for ( k=0; k<1000; k++ );
}

それに比べ、下記のプログラムは「1つのコア」が「4回」1000^3回のループ計算をします。

for ( numThread=0; numThread<4; numThread++ )
for ( i=0; i<1000; i++ )
for ( j=0; j<1000; j++ )
for ( k=0; k<1000; k++ );

実行内容はともに同じですが、果たしてどれくらいの差が出るのでしょうか?

  • 結果

結果を求めるまでにかかった時間、短いほうが良い

4つのコアを使った場合: 2008 [ms]

1つのコアを使った場合: 7410 [ms]

なんと、たった数行追加しただけで3.7倍も高速化してしまいました。

しかし、製品に使われるプログラムはもっと複雑な処理(リソースの競合とかメモリアクセスが遅いとか)が絡んでくるため、逆に遅くなるかもしれません。

  • 個人的な感想

最近、PS4が発売されましたよね。PS4のソフトでは計算だけでなく、綺麗な映像や迫力ある音楽の処理も同時に行うため、いかにマルチコアを最大限に動かすか、といったことをプログラマーの方は工夫されているとおもいますよ。

それに比べ、GBAのゲームは作るのが比較的楽でしょう(マルチコアでないし、音楽流して背景いれかえるだけだし)。でも、昔のゲームとか好きですよ、逆○裁判とか。(裁判長ではなくサイバンチョなのが(・∀・)イイネ!!)

工夫の点で言うと、昔のほうがキツイそうです。例えば、ゲーム機の性能が低いので複雑な処理ができず、アクションゲームが作れない等。

でも、こんな環境でできたゲームってご存知ですか?そのゲームこそ、現在超有名なメタ○ギアです。低性能なハードのおかげで、激しいアクションゲームがつくれなかったため、ステルスアクション(弾幕を張るのではなく、敵から隠れながら戦う)というジャンルが生まれたそうです。

  • 最後に

今回扱った題材はマルチコア、具体的にはCPUについてでした

そこで次回(3ヶ月後くらい?)はグラフィックボードについているGPUについて扱いたいと思います

Q. 次のテーマがGPUの理由?

A. 増税前に買ったから

続きます

カテゴリー: 未分類