我在试着测试阿巴拉皮的表现。我看到了一些博客,结果表明,在执行数据并行操作时,Aparapi确实提高了性能。
但在我的测试中我看不出来。这是我所做的,我写了两个程序,一个使用Aparapi,另一个使用普通循环。
方案1:在Aparapi
import com.amd.aparapi.Kernel;
import com.amd.aparapi.Range;
public class App
{
public static void main( String[] args )
{
final int size = 50000000;
final float[] a = new float[size];
final float[] b = new float[size];
for (int i = 0; i < size; i++) {
a[i] = (float) (Math.random() * 100);
b[i] = (float) (Math.random() * 100);
}
final float[] sum = new float[size];
Kernel kernel = new Kernel(){
@Override public void run() {
int gid = getGlobalId();
sum[gid] = a[gid] + b[gid];
}
};
long t1 = System.currentTimeMillis();
kernel.execute(Range.create(size));
long t2 = System.currentTimeMillis();
System.out.println("Execution mode = "+kernel.getExecutionMode());
kernel.dispose();
System.out.println(t2-t1);
}
}程序2:使用循环
public class App2 {
public static void main(String[] args) {
final int size = 50000000;
final float[] a = new float[size];
final float[] b = new float[size];
for (int i = 0; i < size; i++) {
a[i] = (float) (Math.random() * 100);
b[i] = (float) (Math.random() * 100);
}
final float[] sum = new float[size];
long t1 = System.currentTimeMillis();
for(int i=0;i<size;i++) {
sum[i]=a[i]+b[i];
}
long t2 = System.currentTimeMillis();
System.out.println(t2-t1);
}
}程序1需要大约330,而程序2只需要大约55。我在这里做错什么了吗?我在Aparpai程序中打印了执行模式,它打印出执行模式是GPU。
发布于 2018-07-21 21:21:54
只需在主循环内核执行之前添加
kernel.setExplicit(true);
kernel.put(a);
kernel.put(b);和
kernel.get(sum);在那之后。
尽管Aparapi确实分析了
Kernel.run()方法的字节代码(以及任何可从Kernel.run()访问的方法),但Aparapi对调用站点没有可见性。在上面的代码中,Aparapi无法检测到在for循环体中没有修改hugeArray。不幸的是,Aparapi必须默认为“安全”,并将hugeArray的内容来回复制到GPU设备。
https://github.com/aparapi/aparapi/blob/master/doc/ExplicitBufferHandling.md
https://stackoverflow.com/questions/32858768
复制相似问题