Блокировка не работает с OpenCL

Я застрял с проблемой в моем коде OpenCL, где я пытаюсь синхронизироваться внутри ядра:

__kernel void pdiffs (__global const long2 *inData, __global const long2 *inData2, __global long2 *outData) {
  long2 diffSum = 0;
  uint idx0 = get_local_size(0)*get_group_id(0);
  for (uint idx=idx0; idx<idx0+get_local_size(0); idx += 1) {
    diffSum += inData[idx] -  inData2[idx];
  outData[get_group_id(0)] = diffSum;
  printf("%d %d %d %d/%d\n", get_group_id(0), get_num_groups(0), get_local_size(0), diffSum.x, diffSum.y);
  barrier(CLK_GLOBAL_MEM_FENCE|CLK_LOCAL_MEM_FENCE);
  if (get_group_id(0) == 0) {
    for (size_t i = 1; i < get_num_groups(0); i++){
      outData[0] += outData[i];
      printf("v(%d): %d/%d\n", i, outData[i].x, outData[i].y);
    }
  }
}

(Я знаю, что этот кусок кода просто плохо...)

Я просто подумал, что барьер будет синхронизировать отдельные группы, поэтому значения в outData определены. Но моя трассировка показывает, что некоторые различия не рассчитываются и содержат ноль (я настраиваю свои данные, чтобы все возвращали значение 1, но некоторые отображают как 0). Кроме того, имеет значение, есть ли у меня printf заявления или нет. Без printf еще больше различий кажется неправильным.

0 ответов

Другие вопросы по тегам