2013-03-18 28 views
0

我使用aparapi的並行化指數和我萬特這個java代碼轉換:aparapi開始getGlobalId()

public static void main(String[] args) { 
     float res = 0; 
     for (int i = 2; i < 5; i++) { 
      for (int j = 3; j < 5; j++) { 
       res += i * j; 
      } 
     } 

     System.out.println(res); 

    } 

以等值aparapi:

Kernel kernel = new Kernel() { 
    @Override 
    public void run() { 
     int i = getGlobalId(); 
     ... 
    } 
}; 
kernel.execute(); 
kernel.dispose(); 
+0

我的問題是我該如何設置星號和索引? – user2184177 2013-03-20 14:08:51

回答

2

有幾個問題在這裏。

首先你的代碼不是數據並行的。 'res'有'競賽'條件,所以這個代碼不能在GPU上計算。

其次,執行範圍太小。你正試圖執行6個線程(x [2,3,4] * y [3,4])。這不會真正從GPU中獲益。

回答關於如何在上面2個暗淡網格上實現的問題。

Range range = Range.create2D(3, 2) ; // A two dimension grid 3x2 
Kernel kernel = new Kernel() { 
    @Override 
    public void run() { 
     int x = getGlobalId(0)+2; // x starts at 2 
     int y = getGlobalId(1)+3; // y starts at 3 
     ... 
    } 
}; 
kernel.execute(range); 
kernel.dispose(); 
+0

非常感謝gfrost, 這只是一個例子,瞭解它是如何工作的,但是您能否輕易解釋爲什麼這段代碼不是數據並行? 謝謝 – user2184177 2013-03-21 14:48:30

+0

因爲你的原始代碼需要每個內部循環來更新'res'的值。所以如果所有的循環體是並行執行的,它們都會'競爭'給'res'添加它們的值,res不會包含你想要的結果。你可以把res放在一個數組中,並使用Aparapi的atomicInc(arr,index,value)來增加它,但這會減慢你的執行速度。 – gfrost 2013-03-21 18:57:56