我的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中受益吗?
答案 0 :(得分:1)
答案常常是:它取决于。
Rootbeer将能够将一些工作转移到GPU。但是有很多警告。
现在,从应用程序的角度来看,应用程序中的许多处理都与处理字符串有关。您在.split()
上调用String
,将其分解为String[]
;然后你浏览这些位并读取每一位以转换为float
;然后你做你的计算。这是非常繁重的工作,特别是在垃圾收集器上,它必须摆脱所有这些String
。
我在this question中使用整数而不是浮点对一些非常相似的东西做了一些详细的分析,这导致了一些详细的讨论。结论是,放弃基于String
的方法并逐个字符地读取文件,将它们手动转换为整数,这是一个巨大的差异。几乎可以肯定,非常相似的东西可以帮助您生成浮点数。
因此,简而言之,Rootbeer可能会有所帮助,但是在尝试激烈的事情之前,你可以做很多事情。