通过将一些工作转移到GPU,我的时间消耗Java应用程序会从Rootbeer中受益吗?

时间:2014-12-11 20:25:26

标签: java gpu rootbeer

我的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中受益吗?

1 个答案:

答案 0 :(得分:1)

答案常常是:它取决于。

Rootbeer将能够将一些工作转移到GPU。但是有很多警告。

  1. 你必须学习一种全新的做事方式。
  2. 它可能不会加快速度。这取决于应用程序瓶颈的位置。例如,如果您的问题是I / O限制,那么GPU处理将无济于事。您可以通过在应用程序运行时查看CPU使用情况来查看代码。如果它需要一个小时,那么除非你的文件是灾难性的巨大,否则它听起来好像是受CPU限制的。
  3. (这是最重要的警告。)您应该首先优化您拥有的代码,并检查需要改进的空间。 GPU处理基本上只是在问题上投入了更多的能量;这是一个好主意当且仅当您的代码已经以最佳方式运行时。
  4. 现在,从应用程序的角度来看,应用程序中的许多处理都与处理字符串有关。您在.split()上调用String,将其分解为String[];然后你浏览这些位并读取每一位以转换为float;然后你做你的计算。这是非常繁重的工作,特别是在垃圾收集器上,它必须摆脱所有这些String

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

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