проблема чтения из __global памяти после atom_inc в OpenCL - PullRequest
0 голосов
/ 30 сентября 2010

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

void barrier(__global uint* scratch) {
  uint nThreads = get_global_size(0);
  atom_inc(scratch);
  /* this loop never terminates */
  while(scratch[0] < nThreads) {
    continue;
  }
}

Идея состоит в том, что каждый поток зацикливается, пока всеиз них инкремент увеличивается на один фрагмент памяти.

Однако значение, прочитанное с нуля [0], никогда не изменяется для потоков после его чтения и оно зацикливается навсегда.Я знаю, что он увеличивается, потому что это правильное значение, когда я читаю его обратно на хост.

Кэшируется ли глобальная память локально?Что здесь происходит?

1 Ответ

0 голосов
/ 30 сентября 2010

Обнаружена проблема: порядок выполнения рабочих групп определяется реализацией.Это означает, что некоторые потоки могут начинаться только после завершения других.

В коде, который я дал, рабочие группы, которые запускаются первыми, будут постоянно работать в цикле, ожидая, пока другие не достигнут «барьера».И рабочие группы, которые будут запущены позже, никогда не начнутся, потому что они ждут окончания первых.

Если реализация (я на Radeon 5750, использую Stream SDK 2.2) выполняетсявсе рабочие группы одновременно, тогда это, вероятно, не будет проблемой.Но это не относится к моей настройке.

...