Как работает параллелизм на уровне команд и параллелизм на уровне потоков на графических процессорах?

Позволять'скажи яЯ пытаюсь сделать простое сокращение размера массива n, скажем, в пределах одного рабочего блока ... скажем, добавив все элементы. Общая стратегия заключается в том, чтобы порождать несколько рабочих элементов на каждом графическом процессоре, что уменьшает количество элементов в дереве. Наивно это, казалось бы, предпринимает шаги, но этоНе так ли, если первая волна потоков все эти потоки идут в одном кадре, не так ли? Они намечены в деформациях.

for(int offset = get_local_size(0) / 2;
      offset > 0;
      offset >>= 1) {
     if (local_index < offset) {
       float other = scratch[local_index + offset];
       float mine = scratch[local_index];
       scratch[local_index] = (mine < other) ? mine : other;
     }
     barrier(CLK_LOCAL_MEM_FENCE);
   }

Таким образом, 32 элемента добавляются параллельно, и затем этот поток ожидает у барьера. Еще 32 едут и ждем у барьера. Еще 32 шага, и мы ждем у барьера, пока все потоки не сделают n / 2 сложений, необходимых для перехода на самый верхний уровень дерева, и мы обойдем цикл. Здорово.

Это кажется хорошим, но, возможно, сложным? Я понимаю, что параллелизм на уровне команд имеет большое значение, так почему бы не создать ОДИН поток и сделать что-то вроде

while(i

Ответы на вопрос(1)

Ваш ответ на вопрос