1

私のJavaアプリは何千ものテキストファイルを読み取り、行を調べてテキストをフロートに解析し、それらを使って計算を行い、結果をいくつかのファイルに保存します。現在、複数のスレッドを使用してそれらを同時に実行していますが、まだ約.アプリ全体を実行するのに 1 時間。

これは、私のアプリが行うことの簡略化された疑似バージョンです:

String Lines[]=ReadFile("abc.txt"),Items[];
float its[];

for (int i=0;i<Lines.length;i++)
{
  Items=Lines[i].split(",");
  its=new float[Items.length];
  for (int j=0;j<its.length;j++) its[j]=Float.parseFloat(Items[j]);
  do some calculation with : its[]
}
Do more calculation, save results to a StringBuffer.
Save StringBuffer to ("abc_result.txt");

Rootbeer は一部のワークロードを GPU にシフトしてプロセスを高速化できることを読んだので、私の質問は次のとおりです。

[1] Rootbeer は GPU でテキスト解析とファイル I/O を処理できますか? それとも、この部分を CPU で実行し、GPU で計算のみを行う必要がありますか?

[2] 私のアプリは Rootbeer の恩恵を受けますか?

4

1 に答える 1

1

よくあることですが、答えは場合によって異なります。

Rootbeer は、一部の作業を GPU に移すことができます。しかし、多くの注意事項があります。

  1. 物事を行うためのまったく新しい方法を学ばなければなりません。
  2. スピードアップしないかもしれません。むしろ、アプリケーションのボトルネックがどこにあるかによって異なります。たとえば、問題が I/O バウンドである場合、GPU 処理は役に立ちません。アプリの実行中に CPU 使用率を調べることで、現状のコードでこれを確認できます。1 時間かかる場合、ファイルが壊滅的なほど巨大でない限り、CPU バウンドのように聞こえます。
  3. (これは最も重要な注意事項です。) 所有しているコードを最適化することから始めて、改善の余地がどれくらいあるかを確認する必要があります。GPU 処理は基本的に、問題により多くの馬力を投入しているだけです。これは、コードが既に最適に実行されている場合にのみ有効です。

アプリケーションでの処理の多くは、見た目からすると、文字列の処理に関係しています。.split()aを呼び出しているため、 ;Stringに分割されます。String[]次に、ビットを調べて、それぞれを読み取ってfloat;に変換します。次に、計算を行います。これは、特にこれらすべての s を取り除かなければならないガベージ コレクターでは、かなりの重労働Stringです。

この質問では、浮動小数点の代わりに整数を使用して、非常によく似たものの詳細な分析を行い、詳細な議論につながりました。String結論として、 - ベースのアプローチを放棄し、ファイルを 1 文字ずつ読み取り、手動で整数に変換すると、大きな違いが生じるというものでした。ほぼ確実に、非常によく似たものが浮動小数点数の生成に役立ちます。

つまり、要するに、Rootbeer は役立つかもしれませんが、抜本的なことを試す前にできることはたくさんあります。

于 2014-12-11T20:37:10.530 に答える