2013-06-29 52 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,但在不同的平臺上,我從來沒有嘗試過,也不知道如何開始。但無論如何,感謝您的信息。我會盡力找出解決方案。 –