CUDA эффективное использование общей / локальной памяти?

Я все еще немного не уверен, когда дело доходит до общей / локальной памяти в CUDA. В настоящее время у меня есть ядро, в ядре каждый поток выделяет объект списка. Что-то вроде этого

__global__ void TestDynamicListPerThread()
{
    //Creates a dynamic list (Each thread gets its own list)
    DynamicList<int>  dlist(15);

    //Display some ouput information
    printf("Allocated a new DynamicList, size=%d, got pointer %p\n", dlist.GetSizeInBytes(),dlist.GetDataPtr());

    //Loops through and inserts multiples of four into the list
    for (int i = 0; i < 12; i++)
        dlist.InsertAtEnd(i*4);
}

По моему нынешнему пониманию каждая нить получает свою собственную dlist хранится в локальной памяти, это правда? Если это так, будет ли какой-либо способ в конце выполнения ядра захватить каждый из dlist объекты (из другого ядра), или я должен использовать __shared__ массив динамических списков, выделенных первым потоком?

Я думаю, что я немного усложняю вещи, но мне никогда не нужно менять списки, скажем так, выполнение, которого я пытаюсь достичь, происходит примерно так

  1. Создание списков (только на графическом процессоре)
  2. Производить вывод из каждого списка (для каждого потока, выполненного в графическом процессоре, требуется только информация из списка, выделенного для этого потока.)
  3. Изменить / поменять списки (все еще выполняется на GPU)
  4. Повторяйте 2 и 3, пока на хосте не будет выполнено условие разрыва

Заранее спасибо!

1 ответ

Решение

По моему нынешнему пониманию, каждый поток получает свой собственный список, хранящийся в локальной памяти, это правда?

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

Если это так, будет ли какой-либо способ в конце выполнения ядра получить каждый из объектов dlist (из другого ядра), или я должен использовать __shared__ массив динамических списков, выделенных первым потоком?

Локальная память является частной для потока (исключение: начиная с вычислительной возможности 3.0, существует некоторая внутриполосная инструкция, которая может облегчить обмен локальными переменными потока между потоками внутри деформации), поэтому вам необходимо скопировать локальную переменную в некоторую глобальную память переменная, если вам нужно получить значение вне ядра.__shared__ память выделяется для каждого потока и доступна только в этом потоке, поэтому вам снова нужно скопировать значение в глобальную ячейку памяти.

Вероятно, вам понадобится что-то вроде глобального массива списков, который вы передаете ядру в качестве параметра.

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