2013-06-29 54 views
2

我的笔记本电脑有 - 一个CPU核心i5:Intel(R)Core TM i5-3210M CPU @ 2.50GHz - 一个显卡:Intel(R)HD Graphics 4000 - 一个Nvidia卡(外部卡): GeForce GT 630M如何在JavaCL中结合CPU和GPU?

但是,当我试图使用JavaCL.createBestContext(),它看起来就像使用一个卡英特尔高清显卡。所以我试图结合使用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。

回答

2

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

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

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

+0

感谢您的回答,我明白了您的想法,但您是否有任何示例?因为我在OpenCL中真的很新鲜。 –

+0

@DuyChung我没有一个简单的例子给你。由于您是OpenCL的新手,因此我现在会警告多GPU编程。您需要熟悉Java中的多线程,为并发编程设计的数据类型以及设备之间的负载平衡(如果您希望看到任何加速) – chippies

+0

实际上,我已经尝试过使用相同平台的CPU和GPU,但在不同的平台上,我从来没有尝试过,也不知道如何开始。但无论如何,感谢您的信息。我会尽力找出解决方案。 –