首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCL编译失败的aparapi

OpenCL编译失败的aparapi
EN

Stack Overflow用户
提问于 2018-05-29 06:49:24
回答 1查看 468关注 0票数 1

有人知道这意味着什么吗?这是怎么发生的?在我看来是对的。我想把GPU用在神经网络上。

这是错误:

代码语言:javascript
运行
复制
!!!!!!! clCreateCommandQueue() failed out of host memory
May 28, 2018 6:36:39 PM com.aparapi.internal.kernel.KernelRunner fallBackToNextDevice
WARNING: Device failed for Util$1, devices={AMD<GPU>|AMD<CPU>|Java Alternative Algorithm|Java Thread Pool}: OpenCL compile failed
com.aparapi.internal.exception.AparapiException: OpenCL compile failed
    at com.aparapi.internal.kernel.KernelRunner.fallBackToNextDevice(KernelRunner.java:1286)
    at com.aparapi.internal.kernel.KernelRunner.executeInternalInner(KernelRunner.java:1550)
    at com.aparapi.internal.kernel.KernelRunner.executeInternalOuter(KernelRunner.java:1351)
    at com.aparapi.internal.kernel.KernelRunner.execute(KernelRunner.java:1342)
    at com.aparapi.Kernel.execute(Kernel.java:2856)
    at com.aparapi.Kernel.execute(Kernel.java:2813)
    at com.aparapi.Kernel.execute(Kernel.java:2753)
    at Util.Util.dotProduct(Util.java:46)
    at Network.FullyConnectedNetwork.predictOutput(FullyConnectedNetwork.java:181)
    at Network.FullyConnectedNetwork.test(FullyConnectedNetwork.java:321)
    at Run.RunFullyConnected.main(RunFullyConnected.java:32)

以下是导致错误的代码:

代码语言:javascript
运行
复制
public static double dotProduct(ArrayList<Double> in1, ArrayList<Double> in2) {

        final double[] in1Copy = new double[in1.size()];
        final double[] in2Copy = new double[in1.size()];
        for(int i = 0; i < in1.size(); i++) {
            in1Copy[i] = in1.get(i);
            in2Copy[i] = in2.get(i);
        }

        final double[] result = new double[1];

        Kernel kernel = new Kernel() {
            @Override
            public void run() {
                int i = getGlobalId();
                result[0] += in1Copy[i] + in2Copy[i];
            }
        };

        Range range = Range.create(in1Copy.length);
        kernel.execute(range);
        return result[0];

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-29 09:02:00

你的问题都在下面这一行:

代码语言:javascript
运行
复制
result[0] += in1Copy[i] + in2Copy[i];

这里最大的问题是您试图同时从多个线程对同一内存位置(读取变量)执行读/写操作。即使允许这样做,也会导致意想不到的结果。您正在GPGPU环境中工作,您希望将锁定需求降至最低。这意味着您需要使用map-reduce类型的方法来解决这类问题。为此,您应该创建一个与in1和in2大小相同的实际结果数组。对每个线程数组执行加法(映射步骤),然后作为第二步将数组的所有元素相加在一起(缩减步骤)。

顺便说一句,你得到的异常与我刚才提到的无关。这个问题很可能是你运行的系统没有足够的内存。例如,下面的代码在我的机器上运行得很好,除了我在最后一段中提到的问题(只是测试了一下)。

代码语言:javascript
运行
复制
import com.aparapi.*;
import org.junit.Test;

public class DotProductTest {
  @Test
  public void dotProduct() {

        final double[] in1Copy = new double[4096];
        final double[] in2Copy = new double[4096];
        for(int i = 0; i < 4096; i++) {
            in1Copy[i] = i;
            in2Copy[i] = i*10.0;
        }

        final double[] result = new double[1];

        Kernel kernel = new Kernel() {
            @Override
            public void run() {
                int i = getGlobalId();
                result[0] += in1Copy[i] + in2Copy[i];
            }
        };

        Range range = Range.create(in1Copy.length);
        kernel.execute(range);
        System.out.println(result[0]);

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

https://stackoverflow.com/questions/50574237

复制
相关文章

相似问题

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