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__
массив динамических списков, выделенных первым потоком?
Я думаю, что я немного усложняю вещи, но мне никогда не нужно менять списки, скажем так, выполнение, которого я пытаюсь достичь, происходит примерно так
- Создание списков (только на графическом процессоре)
- Производить вывод из каждого списка (для каждого потока, выполненного в графическом процессоре, требуется только информация из списка, выделенного для этого потока.)
- Изменить / поменять списки (все еще выполняется на GPU)
- Повторяйте 2 и 3, пока на хосте не будет выполнено условие разрыва
Заранее спасибо!
1 ответ
По моему нынешнему пониманию, каждый поток получает свой собственный список, хранящийся в локальной памяти, это правда?
Это правильно. Локальные переменные создаются для каждого потока. Они будут храниться либо в регистре, либо в локальной памяти, где конец переменной зависит в основном от компилятора.
Если это так, будет ли какой-либо способ в конце выполнения ядра получить каждый из объектов dlist (из другого ядра), или я должен использовать
__shared__
массив динамических списков, выделенных первым потоком?
Локальная память является частной для потока (исключение: начиная с вычислительной возможности 3.0, существует некоторая внутриполосная инструкция, которая может облегчить обмен локальными переменными потока между потоками внутри деформации), поэтому вам необходимо скопировать локальную переменную в некоторую глобальную память переменная, если вам нужно получить значение вне ядра.__shared__
память выделяется для каждого потока и доступна только в этом потоке, поэтому вам снова нужно скопировать значение в глобальную ячейку памяти.
Вероятно, вам понадобится что-то вроде глобального массива списков, который вы передаете ядру в качестве параметра.