Небольшой вопрос на счет __syncthreads()

Допустим есть двумерный массив Width*Height.
Производится его обработка одномерным блоком размера Width:

  1. int xi,yi;  // Координаты нити в сетке
  2. __shared__ int buf[Width];
  3. for(int y=0; y<Height; y++)
  4. {
  5.  buf[xi] = Image[y*Width+xi]; // Image - массив в глобальной памяти
  6.   ...     // Нити обрабатывают строку buf
  7.  __syncthreads();
  8. }

Правильно ли я понимаю что новая строка не начнет обрабатываться (т.е. y не изменится) , пока все нити не закончат работу? И есть ли какое-нибудь преимущество подобного подхода по сравнению с обработкой на CPU?

Forums: 

__syncthreads работает внутри

__syncthreads работает внутри одного блока.

А разные блоки могут вообще работать в разное время (последовательно) т.к. одновременно на один GPU не влезли и синхронизация между блоками возможна только путем последовательных запусков одного или различных kernels (данные в глобальной памяти остаются).

Что касается выигрыша относительно CPU - на каких-то задачах он есть, на каких-то нет, зависит от задачи.

Это то понятно. Интересно,

Это то понятно. Интересно, будет ли работать именно приведенная выше функция. Яб и сам проверил, но времени кучу убить придется, может кто сталкивался с этим уже.

Если вам нужно гарантировать

Если вам нужно гарантировать загрузку buf до продолжения, то надо иначе - загрузить, синхронизироваться, потом обработать.

помогите пожалуйста, в общем

помогите пожалуйста, в общем у меня прога производит простое скалярное произведение векторов, и все работает, но если в код вставляю __syncthreads(); то он пишет идентификатор "syncthreads" не определен, при компиляции он его съедает почему то и считает правильно, но без syncthreads он тоже правильно считает, хотя теоретически если нити в блоке не одновременно досчитают, то будет ошибка. в общем помогите разобраться