これからのプログラマーに『並列処理』の知識は必須か?

      2017/03/23

「CPU単体の処理性能の向上が限界に来ている」という話をよく聞くようになりました。

昔はCPUがPetium2 → Petium3 → Petium4とバージョンアップされる度にクロック周波数が266MHz(メガヘルツ)から533MHzになるなど、常に上がり続けてきましたが、最近は3GHzとか4GHzくらいで止まっていますよね。

ムーアの法則で「シリコン集積回路の集積密度が2年でほぼ2倍になる」と以前は言われていました。かんたんに言うとコンピュータの性能は2年間で2倍にアップするという法則です。

しかし、CPUがあまりに高度に集積されるようになり、これ以上単体での性能アップは無理だという段階になってしまったのです。

その分CPUのコア数が増えて、Core2Duoでコアが2つになり、Core-i5で4つのコアが搭載されるようになりました。その後もヘキサコア(コアが6つ)、オクタコア(コアが8つ)と増え続けています。

周波数は伸びなくても、コア数が増えているので、複数の処理を複数コアで同時並行で処理することによってスピードアップを図っているんです。

よって、CPUのマルチコア化に対応したプログラムの書き方が出来ないとプログラムの処理性能を上げることは出来ないと言われています。

この点について、じっくり考えてみたことを紹介します。

Ruby開発者まつもとゆきひろさんの意見

まつもとゆきひろさんは「ソフトウェア開発にフリーランチは存在しない」とおっしゃっています。

フリーランチってタダ飯のことです。

今まではプログラムを一度書けば、ハードウェアの性能が上がるから年々勝手に動作速度が速くなっていくというタダ飯(プログラムを何も修正しなくても速くなる)をいただけました。

しかし、現在ではCPU単体の処理性能が限界に達したため、並列に動作するように書き直さないと処理性能が上がっていかなくなってしまったのです。

このことは、ここ数年、関数型言語が注目されていることに関係があります。

関数型言語は並列処理に向いている?

関数型言語は副作用のないプログラミングがしやすいという特徴があるため、並列処理がしやすいんです。

副作用のないプログラミングとはどういうことかというと、関数の動作が関数の外側にある変数に依存しないということです。以下はJavaScriptのサンプルコードです。

オブジェクト指向でいうと、クラスのメンバー変数(フィールド)をメソッドから参照しているようなコードは副作用のあるコードなんです。

状態を持った変数によって、関数の動作が変わってしまう場合、その関数を並列で実行することは出来ません。

しかし、関数が引数にだけ依存している場合は、その関数を並列で処理することが出来ます。

なぜならば、引数とローカル変数はその関数内でしか参照されないからです。

例えば、for文の中でfunc1という関数を呼び出しているとします。この時、func1の動作が外部の変数に依存しないのであれば、for文を順番に繰り返すのではなく並列で処理することが出来ます。

関数型言語で書くと、外部の状態変数に依存しない書き方になりやすいので、プログラマーが並列を意識してコードを書かなくても、言語の処理系が自動的に並列に実行できる部分は並列に実行してくれるんです。

例えば、for文で4回処理を繰り返していて、CPUコアが4つある場合、くりかえし一回の処理を1コアに割り当てれば、4つコアがあるので、4回の繰り返しを並列に処理できる場合があるのです。

意識的に並列処理を書くとかなりめんどい

プログラマーが意識して並列処理をさせるコードを書く場合は、for文の中の処理をひとつひとつThred起動して実行させればいいのですが、並列で起動したスレッドが全部終わるのを待つjoin処理なども書かなければなりません。

先程のJavaScriptのコードをJavaで並列に実行するコードを書いた例を示すと以下のようになります。(new Thread(num1, num2)の部分が正確ではないコードです。簡略化してあります)

コードも複雑になりますし、可読性も落ちます。

サーバーは元々並列処理してるからプログラムはそのままでOK

WebアプリやJSON APIなどサーバーサイドのプログラムの場合、1リクエストを処理するプログラムを私たちは書きますよね?では、その1リクエストを処理するプログラムの中でさらにユーザースレッドを起動して処理を並列に動かす必要があるでしょうか?ないですよね。

なんでかというと、サーバー自体が並列で動いて同時アクセスをさばいているからです。

例えばCPUが8コアあるサーバに10個の同時アクセスがあったとします。

その1リクエストの中の繰り返し処理を並列で8個のCPUコアに割り当てて並列処理をさせることになります。

そんなことをしたら、1リクエストで8コアすべてを使ってしまうので、他のリクエストがCPUを使用できなくなってしまいます(厳密に言えばCPUをタイムシェアリングしてるから、CPU割当が短時間で切り替えられますが)。

このような理由から、サーバーサイドのユーザープログラムの中では、並列処理を意図的に起こす必要性はないと考えられます。サーバー自体が並列でリクエストを処理していますからね。私達が書くユーザープログラムに制御が移る時には、既にプログラムは並列で動いているのです。

具体的に言えば、Apacheからmod-phpだったり、Nginxからphp-fpmに処理が移ってユーザープログラムが起動される時には、既に並列で起動されてるということです。

ですから、サーバーサイドでは並列処理を意識する必要性はないのです。

ただ、クライアントサイドでは状況が違います。

クライアントサイドは並列処理の意識が必要?

私のキャリアはサーバーサイドが中心なのですが、スマホゲームのクライアント側の開発をしたこともあります。

ゲームのクライアント側ってすごく並列的に動いているんですよ。

フレーム処理というものがあって、一秒間に30回画面描画が走ることを30fps(frame per second = フレームレート)と言います。

それくらい細かい描画処理をしながら、裏でサーバーのAPIと通信してたり、ローカルストレージにデータを保存したりします。

ですから、クライアント側は並列を意識してコードを書く場面があると思います。スマホのCPUもマルチコアですからね。

とはいえ、これらの処理はゲームエンジンなどを使えば、ゲームエンジンが下のレイヤーでGPUをうまく使うなどを勝手にやってくれるので、やはり、クライアントサイドにおいても、アプリケーションプログラマーが並列処理を意識する必要性はそれほどないと思います。

まとめ

そんなわけでここ数年並列処理の重要性が説かれていますが、実際にはそういうコードを書く機会は少ないと思われます。

まぁ、私が書いてるコードのほとんどがアプリケーションレイヤーなので、もう少し下のレイヤー(フレームワークとかゲームエンジン)を開発している人だと違った状況なのかもしれませんけどね。

プログラミング初心者におすすめのサービス
1. 講師から対面で学びたい派には

プログラマカレッジをおすすめします。ProEngineerという転職エージェントが運営しているプログラミングスクールです。なんと無料で受講できて、修了後、就職支援もしてくれるそうです。最高過ぎですよ、これ!!就職の紹介料を企業からもらえるのでスクールを無料にできるんでしょうね。すばらしいシステムだと思います!

2. 自宅で学びたい派には

侍エンジニア塾の無料体験レッスンをおすすめします。カリキュラムを自由に選択できるので、自分が教わりたい内容をピンポイントで学ぶことが出来ます。このスクールから33歳でITエンジニアに就職出来た人がいるそうなので、30代の方にもおすすめです。

3. つまづいた時に質問したくなったら

プログラマー専用の質問サイトteratailをおすすめします。 つまづいた時にteratrailで質問すれば教えてもらえます。

これらのサービスを活用すれば、全くの初心者からでもプログラミングをばっちり出来るようになると思います!レッツトライです!

エージェントを使った方が転職活動は楽です

東京・大阪近郊のイケてるIT企業に転職したい人には『レバテックキャリア』

 東京・大阪近郊のエンジニア経験者向け転職サービスです。

このサービスを運営しているレバレジーズという会社はシステム開発もやっているので、現場の仕事をよくわかってくれてますし、ヒカ☆ラボというIT系の勉強会なども主催していたりteratailというプログラマー専用の質問サイトを運営してて好感が持てます。求人案件もWebやスマホの面白い仕事が多いのでいいと思います。

あとホームページ見ると分かるんですが、若くて美人の担当者が多いのもナイスなんです!私の場合(たぶんあなたも)、担当者が美人だと転職活動のモチベーションめちゃ上がりますからね笑

エンジニア未経験の方や地方在住の方にはDODAというエージェントをおすすめします。

エンジニア未経験の方や地方在住の方には『DODA』

全国の求人を扱っていて、しかもITエンジニア未経験の人にも転職支援をしてくれるエージェントです。

未経験の人はサポート対象外のエージェントが多い中、DODAは未経験者を支援し転職を成功させています。未経験の方こそエージェントから職務経歴書の作り方や面接の仕方のレクチャーを受けた方がずっとうまくいきます。

『派遣社員』なら正社員とフリーランスの『良いとこ取り』!

  • 「フリーランスになりたいけど、確定申告とかめんどくさいな」
  • 「定時帰りできる職場や、時短勤務がしたい」

という方には派遣社員がおすすめです。

派遣ってネガティブなイメージありますが、ITエンジニアの派遣社員ならやりたい仕事を選べて、給料も悪くないですし、確定申告や年金、健康保険も派遣会社が入ってくれるので、実はとてもいい選択なんです。

 - 技術