
この記事では、OpenCLと組み合わせた開発のためのJavaプラットフォームの使用、このアプローチの長所と短所について説明します。 将来のソフトウェア開発におけるこれらの技術の組み合わせにより、クラウドコンピューティングとOpenCLのフルパワーを使用できるようになります。
最近、高度な並列処理を備えた市販のコンピューティングデバイスのソフトウェア開発が人気を集めています。 これらは、SIMDコマンドとGPGPU(GPUでの汎用計算)をサポートするビデオアクセラレーター、単一のAMD Fusionクリスタル上の中央およびグラフィックコプロセッサーを組み合わせたデバイス、および特殊なコプロセッサーを備えた最新のマルチコアプロセッサーです。 ほとんどすべてのタイプのデバイスには独自のコマンドシステム、アーキテクチャ機能、およびアプリケーション開発があり、以前は開発者がいくつかのプログラミング言語とAPI(アプリケーションプログラミングインターフェイス)の知識を必要としていました。 こうした非常に複雑なプログラミングにより、プラットフォームを変更することが不可能または経済的に不便になりました(ベンダーロックイン)。 Alliance of Hardware and Software Manufacturersは、これらの問題を解決するOpenCL言語を開発および標準化しました。 これはオープンスタンダードであり、オペレーティングシステムWindows、Linux、およびMacOS用のハードウェアAMD、Intel、Nvidia、IBMなどのさまざまなメーカーの実装がいくつかあります。
Windows for VisualStudioには、NVIDIAのプラグイン-Parallel NsightとAMDのgDEBuggerがあります。 また、前述のオペレーティングシステムのOpenCLコンパイラとランタイムランタイムに問題がない場合、Linux開発環境ではAMD / Nvidiaの方がはるかに複雑です。
ホストコードがデータを準備し、OpenCLカーネルの動作を調整するOpenCLコードの一部である場合、Javaで記述されているため、Linux / Windowsでのデバッグに問題があります。 クロスプラットフォームサーバーソフトウェアを開発するための市場でのJavaプラットフォームの成功を思い出すと、ハードウェアベンダーがまだOpenCL開発ツール(Eclipse IDE、Netbeans IDE、IntelliJ Ideaに組み込まれたデバッグとプロファイリング)を開発しない理由は明らかではありません。 それまでの間、これらの開発環境には問題のテクノロジーの操作を簡素化する既製のツールは含まれていません。今日利用可能なツールを使用して開発の問題を解決してみましょう。 これにより、現代のコンピューティングデバイスでの作業に最適化された競争力のある産業用ソリューションを手に入れることができます。
JavaとOpenCLを共有することの利点と欠点
では、なぜJavaプラットフォームを使用してOpenCLのホストコードを開発する必要があるのでしょうか。 この選択を支持していくつかの議論をします。
- クロスプラットフォーム-Java Virtual Machine(JVM)は、Windows、Linux、MacOS、Unixなどの多くのプラットフォームに対応しています。 「一度書くだけで、どこでも実行できます。」JVMのさまざまなベンダーの実装、オープンソース実装もあります。
- このプラットフォームを知っている膨大な数の開発者/アーキテクト。 集合開発、テスト、デバッグとプロファイリングの容易さ、ソフトウェアリリース、および実稼働環境でのシステムモジュールの配信の単純さと利便性。
- 多数のオープンソースライブラリが開発で使用できます。 たとえば、 Apache Camelコンポーネントからの、Javaアプリケーション(http、soap、rest、smtp、scp、jms、CORBA、データベース-リレーショナル/ NoSQLなど)で利用可能なデータの数え切れない数のソースとコンシューマー。
- クラウドアプリケーションのプラットフォーム:分散された柔軟なアプリケーションを開発し、たとえばApache Hadoopを使用して大量のデータを処理するためのフレームワークの存在。
- 銀行、金融機関、電気通信部門で認められている企業標準:JVMの作業をサポートできるシステム管理者の大規模なスタッフ。
- JVMで実行できる多くのプログラミング言語:jruby、PHP(Caucho quercus)、jython、javascript(Mozilla Rhino)、Scalaなど。 多数の言語が存在するため、既存のアプリケーションを最適化し、新しいアプリケーションをより生産的に開発できます。 その結果、OpenCLを使用してこれらの言語からJavaクラスへのインプロセス呼び出しが行われます。 使用する言語専用のOpenCL APIバインディングを使用した方がよい場合があります。 DSLで使用されるフレームワークは、一部の開発者によってjavaで記述され、他の開発者がJVM内のプログラミング言語で使用して、迅速なアプリケーション開発を行うことがあります。
- JavaCLは、OpenCLホストコード用のコンパクトでオブジェクト指向のAPIです。
Javaを使用してOpenCLホストコードを記述しない場合:
- ガベージコレクターの非参照。 アプリケーションでは、データの処理と応答の発行に低遅延が必要な場合があります(たとえば、トレーディングシステムまたは医療機器の制御プログラム)。
- JVMとネイティブコード間でデータをコピーするための大きなオーバーヘッドコストが存在します。 OpenCLの実装。 これには、必要なデータを読み書きできるjvmのコードの不足も含まれます。
- このアルゴリズムは、OpenCLアーキテクチャのフレームワーク内で効果的に実装できません。 すべてのアルゴリズムが十分に並列化されているわけではなく( アムダールウェアの法則 )、バス上のデータ転送時間はデバイス上の計算時間よりも何倍も長くなる可能性があります。 この問題は、一般的なアルゴリズムとアプローチに関連しており、特にJavaには関連していません。 この場合、OpenCL API呼び出しのホストコードは役に立ちません。
そのため、私たちのタスクはOpenCLに適していると判断し、Java言語のみを使用して効果的に実装することは不可能です。 同時に、JVMを利用したいと考えています。 アイデアから実装に移りましょう。
技術
AMD + Radeon HD 5000/6000 CPUまたはAMD Fusionベースのデスクトップソリューションの代わりにサーバープロセッサAPU Opteronの使用に切り替える予定がある場合、
AMDの実装でOpenCLを開発することをお勧めします。
OpenCLを操作するためのAPIとしての
JavaCL 。 bridJを使用してOpenCL APIの動的ライブラリのネイティブコードを呼び出すと、JNAと比較してパフォーマンスが向上します。
デバッグツール:テキストユーザーインターフェイスを備えたgdbまたはgdbフロントエンドとしてのddd
コードプロファイリングについては、AMD Accelerated Parallel Processing(APP)SDKのAMD APPプロファイラー、開発用にAMD独自のFGLRXグラフィックスドライバーがインストールされたUbuntu 11.04 OSを使用することをお勧めします。 開発は、Mavenプロジェクトをサポートする任意のJava IDEで実行できます。 しかし、コードの記述中の構文強調表示およびOpenCL関数のコンパイルのサポートは、現在
、netbeansの
プラグインのみをサポートしてい
ます 。 このプラグインの動作は非常に不安定でした。
開発用のインフラストラクチャと開発プロセスを作成することは、他のJavaテクノロジを操作することと変わりません。
デバッグツールはより複雑ですが、この問題に対する解決策もあります。 AMDのOpenCLランタイムを使用すると、CPUの起動時にカーネルをデバッグできます。ブレークポイントを設定し、ベクタータイプfloat4、int4などの変数値を表示します。 同時に、たとえばテクスチャを操作するために、GPU機能が中央プロセッサでエミュレートされます。 デバッグの詳細に興味がある人のために、
linuxでのJavaCLとOpenCLのデバッグに関する記事があります。 また、プロジェクトの
作成者は、Javaからのカーネルコードのデバッグに関する
Wikiページを作成しました 。
OpenCLでサポートされている
gdb拡張機能の詳細
AMD APPプロファイラーを使用して、アプリケーションのプロファイルを作成できます。 Linuxで起動すると、アプリケーションのOpenCL関数の動作に関する統計を収集し、LibreOffice Calcテーブルプロセッサでの後続のデータ分析のためにCSVファイルに保存できます。 コードの最適な動作を理解するに
は、プロファイラーによって測定されたパラメーターの値を解釈する必要があり
ます 。
おわりに
この記事では、JavaプラットフォームとOpenCLテクノロジーを使用したソフトウェア開発の長所と短所を調べました。 並列処理が増加する過程でコンピューティングデバイスの開発が見込まれるため、ソフトウェア開発へのこのアプローチは、JVMでの高性能エンタープライズおよびクラウドアプリケーションの開発における主要なものの1つになると主張しています。