近年まで、コンピューティングハードウェアの進歩により、ソフトウェア開発者は多大な労力を注ぐことなくソフトウェアの実行速度を目覚しく向上させることができました。プロセッサ速度が向上しただけで、ソフトウェアも即座に高速化されました。しかし、プロセッサ速度が限界に達し始め、プロセッサメーカーが新しい手法を使用して処理能力を向上させる中で、この状況は変わりつつあります。マルチコアプロセッサを導入するためには、ソフトウェア開発者はマルチコアプロセッシングの可能性を最大に引き出すためのプログラミング技術を習得する必要があります。これらのプログラミング手法の1つに、タスクの並列処理があります。
タスクの並列処理とは、ソフトウェアで別個のタスクを同時に実行することです。シングルコアプロセッサでWebブラウザとワープロプログラムが同時に実行しているとします。それらのアプリケーションは別のスレッドで実行されますが、結局は同じプロセッサを共有しています。次に、同じ2つのプログラムがデュアルコアプロセッサ上で実行している状況について考えてみます。デュアルコアマシンでは、2つのアプリケーションは互いに依存せずに実行することができます。完全に別々に実行することを避けるため、多少のリソースは共有する場合もありますが、デュアルコアマシンは2つの並列タスクをより効率的に処理することが可能です。
並列処理を得意とするデータフロープログラミングが可能なNI LabVIEWグラフィカル開発環境は、並列プログラミングに最適なプログラミング言語と言えます。従来のテキストベース言語では、シーケンシャル構文を主体とするため、並列形式での視覚化と整理が難しくなります。一方NI LabVIEWでは、マルチスレッドアプリケーションを直感的かつ簡単に作成できます。
LabVIEWのグラフィカルプログラミングパラダイムを使用すると、初心者も容易に並列プログラミングを行えます。そのために特別なプログラミングをしなくても、依存関係のない2つの別個のタスクを並列で実行できます。
図1は、簡単なデータ収集ルーチンを示しています。上段のコードはアナログ電圧入力タスクで、下段はデジタル出力タスクです。
図1:図1. LabVIEWコードのデータ依存性のない2つのセクションをそれぞれ独立して並列実行
シングルコアプロセッサ上では、依存関係のないこれらの2つのデータ集録タスクが同じCPUを共有することになります。マルチコアプロセッサの場合は、各スレッドがそれぞれ別のプロセッサ上で実行するため、実行速度が格段に高まります。
アプリケーションにデータの並列性を組込む際は、図2に示すコードのように、2つのタスクの間に障壁となり得る共有リソースがないことを確認する必要があります。
図2:1つのタスクが別のタスクのデータに依存するため両方のタスクをを独立して実行できない例
このプログラムでは、2つのタスクがデータを共有するため、デジタルタスクはアナログタスクが開始されるまで待機しなければなりません。このコードは並列化されているように見えますが、2つのタスクがデータを共有するため実際には並列とは言えません。タスクの並列処理を使用してアプリケーションをプログラミングする際は、この点に注意する必要があります。
Eaton Corporationでは、開発チームがトラックR&D部門で使用されるテスト/測定システムの改善に取り組んでいます。このチームは、LabVIEWのマルチコアプロセッシングと���ルチスレッドアーキテクチャをイートンのシステムで使用されているチャンネル数の4倍以上にも適用し、リアルタイムの確定性を確保しました。このLabVIEWアプリケーションは、集録、テスト制御、ユーザインタフェースの並列タスクを実行する3つの非同期ループで構成されています。このソリューションを実装する前には、テスト要件を満たすために、処理負荷をシーケンス的に分割するか、複数のシングルコアコンピュータでアプリケーションを実行する必要がありました。開発チームは、標準的な市販コンピュータシステムを使用することで、電力消費、熱出力、テスト時間を最小限に抑え、全体的なコストを抑えていました。
ソフトウェア開発者は、タスクの並列化などのプログラミング手法を採用することで、マルチコアプロセッシングの能力を最大限に活用することができます。これらの手法を理解し、習得することで、将来的なトレンドにアプリケーションを対応させることが可能になります。並列性を備えたLabVIEWのグラフィカルプログラミング環境を使用することで、次世代アプリケーションを効果的に開発することができます。