首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Aparapi GPU执行速度比CPU慢

Aparapi GPU执行速度比CPU慢
EN

Stack Overflow用户
提问于 2015-09-30 05:54:37
回答 1查看 3.4K关注 0票数 4

我在试着测试阿巴拉皮的表现。我看到了一些博客,结果表明,在执行数据并行操作时,Aparapi确实提高了性能。

但在我的测试中我看不出来。这是我所做的,我写了两个程序,一个使用Aparapi,另一个使用普通循环。

方案1:在Aparapi

代码语言:javascript
复制
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:使用循环

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2018-07-21 21:21:54

只需在主循环内核执行之前添加

代码语言:javascript
复制
kernel.setExplicit(true);
kernel.put(a);
kernel.put(b);

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32858768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档