PerlでもマルチCPUを最大限に活用できる
Perlでは、マルチCPU対応の方法を解説します。PerlではマルチCPU対応できないのではないかという誤解が、Web上には、たくさんあります。
正確な情報は、ある方法であれば、マルチCPU対応ができて、ある方法では、マルチCPU対応できないということです。
どのような方法であれば、マルチCPU対応がができて、どのような方法では、マルチCPU対応できないのか、把握しておきましょう。
Webアプリにおけるプリフォークを使ったマルチCPU対応
Perlでは、Webアプリケーションであれば、プリフォークという機能を使って、マルチCPU対応ができます。
プリフォークという機能を使うと、マルチCPUの資源をフル活用することができます。
誤解を解いておくと、Perlでは、Webアプリにおいては、プリフォークに対応したWebサーバーを利用すれば、マルチCPUの資源をフルに活用できるということです。
プリフォークに対応したWebサーバーには、StarmanやMojoliciousがあります。
Starman
StarmanはPerlのプリフォークに対応したWebサーバーです。
StarmanはNet::Serverモジュールをベースとした多機能なPrefork型のWebサーバです。作者はPSGI/Plackの開発や仕様策定を行っている宮川氏です。
第24回 PSGI/Plack実践入門―Starman,Starlet,Twiggy,Plack::Middleware,Server::Starter(2)>
Mojolicious
MojoliciousというPerlのWebフレームワークは、プリフォークに対応したWebサーバーを持っています。
Mojo::Server::Preforkは完全の機能を備えたUNIXに最適化された プリフォークの非同期IOのHTTPとWebSocketの組み込みのサーバーです。
Mojo::Server::Prefork - プリフォークのノンブロッキングIOのHTTPとWebSocketのサーバー
なぜPerlは、マルチCPUを有効に利用できないと信じられているの?
一般的に、マルチCPU対応は、一番最初の話題として、スレッドの話題で始まるからです。
あるいは、スレッドではないが、マルチCPUを利用できる仕組みを言語が持っているかという話題から始まるからです。
Perlの場合は、スレッドが非推奨な機能であり、シングルスレッドで運用することが、想定されています。
Perlは、言語機能としては、マルチCPU対応ではないのです。
このことから、Perlは、言語機能としてはマルチCPU対応ではないということが、間違って伝達され、PerlではマルチCPU対応できないという風に誤解されています。
Perlは、Unix/Linuxのフォーク機能を使用し、プリフォークを実装しているWebサーバーを使えば、Webアプリにおいて、マルチCPU対応できます。
Perlの言語自体の機能としてはありませんが、言語自体の機能を使わない方法を使えば、マルチCPU対応できるのです。
XSという言語拡張を使えば、GPUやCPUによる並列化も可能
並列処理といった場合に、本当に並列化によるパフォーマンスを求めるのであれば、スレッドというのは、不十分なパフォーマンスしか出せないということを、知っておく必要があります。
スレッド切り替えのコストは高く、スレッドの個数を3倍にしても、パフォーマンスが3倍になることはありません。
計算資源を最大限に使うためには、GPUやCPUといったハードウェアレベルの最適化が必要になってきます。
Perlでは、XSというC/C++による言語拡張機能を使えば、C/C++やGPUを記述するためのC風の言語を使って、ハードウェアによる並列処理を実行できます。
Perlレベルでは、シングルスレッドですが、C/C++レベルで記述を行うと、CPUやGPUなどのハードウェアの並列機能を最大限に活用することができます。