如何在JavaCL中结合CPU和GPU?

时间:2013-06-29 02:28:08

标签: opencl

我的笔记本电脑了 - 一个CPU核心i5:Intel(R)Core(TM)i5-3210M CPU @ 2.50GHz - 一张显卡:英特尔(R)HD Graphics 4000 - 一张Nvidia卡(外卡):GeForce GT 630M

但是当我尝试使用JavaCL.createBestContext()时,它看起来就像只使用一卡Intel HD Graphics。所以我尝试使用以下方法将3:CPU和2个GPU组合在一起:

List<CLDevice> devices = new ArrayList<CLDevice>();

    // try to list all platform and devices
    for(CLPlatform platform : JavaCL.listPlatforms()) {
        //System.out.println(platform.getName());
        for (CLDevice device : platform.listAllDevices(true)) {
            System.out.println(device.getName().trim());
            devices.add(device);
        }
    }


CLDevice device1 = (CLDevice)devices.get(0);
CLDevice device2 = (CLDevice)devices.get(1);
CLDevice device3 = (CLDevice)devices.get(2);

CLContext context = JavaCL.createContext(null, device1, device2, device3);

但是在尝试同时使用3时我遇到了错误。那么如何在JavaCL中编译CPU和GPU呢?因为我读到OpenCL是使用CPU和GPU支持并行编程的标准。所以如果我错过了什么,请告诉我。任何想法或答案将不胜感激。

谢谢, DUY。

1 个答案:

答案 0 :(得分:2)

可悲的是,它并不那么容易。在跨多个设备创建单个上下文时,这些设备都必须来自同一平台。创建包含Intel CPU和GPU的上下文应该可以工作,但Nvidia GPU必须在自己的环境中(不同的平台,Nvidia而不是Intel)。

以下是我如何处理这种情况:我为每个设备创建一个上下文,为每个上下文创建一个线程。每个线程都会处理我正在处理的一部分数据,并将其分配给指定的OpenCL设备。通过这种方式,您可以混合使用AMD和Nvidia的CPU,GPU以及任何其他硬件。

跨线程进行负载均衡非常重要,这样您就不会有更快的设备闲置等待较慢的设备赶上来。