2013-03-18 2 views
0

я использую aparapi для распараллеливания и я wante преобразовать этот код 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

ответ

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

+0

Поскольку ваш исходный код требует, чтобы каждый внутренний цикл обновлял значение «res». Поэтому, если все тела цикла были реализованы параллельно, все они будут «гоняться», чтобы добавить их значение в «res», res не будет содержать результат, который вы хотели. Вы можете поместить res в массив и использовать AtomInc Aparapi (arr, index, value), чтобы увеличить его, но это замедлит ваше выполнение. – gfrost

Смежные вопросы