我正在学习使用Aparapi和Java 8,因此GPU可用于加速我的应用程序,但我想知道Aparapi是否可以处理字符串处理。
例如,如果我有10,000个文件要通过,我的应用程序需要读取文本并遍历每一行来提取和解析浮点数,然后进行一些计算并将结果存储在某个地方,如hashmap或列表或数组,当我使用多个线程时,我的CPU运行在接近100%,并且它运行了将近一个小时才能完成工作。
我的应用程序可以从Aparapi with Java 8中获益,为GPU分配一些计算吗?我知道它可以做[+ - * /],但Aparapi可以这样做:
String lines[]=text.split("\n");
for (int i=0;i<lines.length;i++)
{
float number=Float.parseFloat(lines[i]);
number*=2000;
}
答案 0 :(得分:2)
基于OpenCL的Aparapi无法做到这一点,因为它不能直接处理堆上的对象。我们可以做的最好的事情是通过将对象编组到单个连续堆区域(ala Rootbeer)中将所有String状态移动到GPU,然后对所有字符串执行并行操作。大多数时候很难赢回来#39;马歇尔+转会时间。
启用HSA的Aparapi的lambda分支(仍在使用!)将使您能够在启用HSA的平台上执行此操作。 HSA允许直接从GPU(共享虚拟内存)访问Java堆对象。这意味着我们不再需要将数据复制到GPU或从GPU复制数据。 GPU可以直接跟踪对象引用。
仍然无法在GPU上分配(这需要对GC,安全点和延迟处理的一些支持),这超出了Aparapi。另一方面,苏门答腊是一个OpenJDK项目,能够处理您建议的用例并允许分配。它的优点是能够挂钩到JVM;)
答案 1 :(得分:0)
我想我已经找到了答案:
https://github.com/pcpratts/rootbeer1/tree/master/doc [rootbeer1_paper.pdf]