CUDA: потоковая передача одной и той же области памяти всем потокам - PullRequest
3 голосов
/ 01 ноября 2011

Вот моя проблема: у меня есть довольно большой набор пар (это массив из 77.500 пар), который нужно хранить где-то в cuda.Теперь мне нужен большой набор потоков, чтобы последовательно выполнять кучу операций с этим массивом.Каждый поток должен будет прочитать один и тот же элемент этого массива, выполнить задачи, сохранить результаты в общей памяти и прочитать следующий элемент массива.Обратите внимание, что каждый поток должен будет одновременно читать (просто читать) из одной и той же области памяти.Итак, мне интересно: есть ли способ транслировать один и тот же дубль на все потоки только с одной прочитанной памятью?Чтение много раз было бы совершенно бесполезным ... Любая идея ??

1 Ответ

5 голосов
/ 01 ноября 2011

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

// choose some reasonable block size
const unsigned int block_size = 256;

__global__ void kernel(double *ptr)
{
  __shared__ double window[block_size];

  // cooperate with my block to load block_size elements
  window[threadIdx.x] = ptr[threadIdx.x];

  // wait until the window is full
  __syncthreads();

  // operate on the data
  ...
}

Вы можете итеративно "скользить" окном по массиву block_size (или, может быть, с некоторым целым числом больше) элементов за раз, чтобы поглотить все это. Тот же метод применяется, когда вы хотите хранить данные обратно синхронизированным способом.

...