1

我的 Java 应用程序读取数千个文本文件,遍历这些行并将文本解析为浮点数并用它们进行一些计算,然后将结果保存到一些文件中,现在我正在使用多个线程同时执行它们,仍然需要大约小时运行整个应用程序。

这是我的应用程序的简化伪版本:

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 使用情况来检查您的代码。如果需要一个小时,那么除非您的文件非常庞大,否则听起来确实像是受 CPU 限制。
  3. (这是最重要的警告。)您应该首先优化您拥有的代码,并检查有多少改进空间。GPU 处理本质上只是在解决这个问题。当且仅当您的代码已经以最佳方式运行时,这是一个好主意。

现在,从外观上看,您的应用程序中的许多处理都与处理字符串有关。您正在调用.split()a String,将其分解为String[]; 然后你浏览这些位并读取每个位以转换为float; 然后你做你的计算。这是一项相当繁重的工作,尤其是在垃圾收集器上,它必须摆脱所有这些Strings。

在这个问题中,我对非常相似的东西做了一些详细的分析,使用整数而不是浮点数,并引发了一些详细的讨论。那里的结论是,放弃String基于 - 的方法并逐个字符地读取文件,手动将它们转换为整数会产生巨大的差异。几乎可以肯定,非常相似的东西会帮助您生成浮点数。

所以,简而言之,Rootbeer 可能会有所帮助,但在你尝试如此激烈的事情之前,你可以做很多事情。

于 2014-12-11T20:37:10.530 回答