2015-02-20 4 views
0

Я смущен о копировании массивов в постоянную память.Есть ли способ динамически выделить постоянную память? CUDA

Согласно programming guide существует как минимум один способ выделить постоянную память и использовать ее для хранения массива значений. И это называется статическое распределение памяти:

__constant__ float constData[256]; 
float data[256]; 
cudaMemcpyToSymbol(constData, data, sizeof(data)); 
cudaMemcpyFromSymbol(data, constData, sizeof(data)); 

По programming guide снова мы можем использовать:

__device__ float* devPointer; 
float* ptr; 
cudaMalloc(&ptr, 256 * sizeof(float)); 
cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr)); 

Похоже, используется динамическая константа распределения памяти, но я не уверен в этом. А также здесь не используется определитель __constant__.

Так вот некоторые вопросы:

  1. хранится этот указатель в постоянной памяти?
  2. Устанавливается (этим указателем) память, хранящаяся в постоянной памяти тоже?
  3. Является ли этот указатель постоянным? И не разрешается изменять этот указатель, используя функцию устройства или хоста. Но изменяет ли значения массива запрещенные или нет? Если изменение значений массива разрешено, значит ли это, что постоянная память не используется для хранения этих значений?
+1

'__constant__', как и стандартный C/C++' const', означает «только для чтения», а не «неизменяемый». Подобно ситуации в CUDA, где данные '__constant__', которые доступны только для чтения внутри кода устройства, могут быть изменены вызовами API в коде хоста, объект' const volatile 'может быть обновлен агентом за пределами области кода, где он объявляется (например, ISR, DMA transfer или hardwae register). – njuffa

+0

@njuffa, спасибо. Но распределяем ли мы память динамически при использовании второго примера cudaMemspyToSymbol? И я попытался выяснить, какой размер постоянной памяти для вычислительной способности 2.1. Я пробовал документы, но без результата. Поэтому я нашел googled и нашел только [это «оборудование NVIDIA обеспечивает 64 Кбайт постоянной памяти»] (http://cuda-programming.blogspot.ru/2013/01/what-is-constant-memory-in-cuda.html). Для CC 2.1 ничего не сказано. Правильно ли это для CC 2.1? –

+0

Постоянная память - это кеш, имеющий некоторые функции. В первом фрагменте используется постоянный кеш памяти, во втором - нет. В последнем случае вы просто резервируете глобальное пространство памяти для указателя. – JackOLantern

ответ

2

Разработчик может объявить до 64 КБ постоянной памяти в области файлов. В SM 1.0 постоянная память, используемая toolchain (например, для хранения констант времени компиляции), была отдельной и отличной от постоянной памяти, доступной для разработчиков, и я не думаю, что это изменилось с тех пор. Драйвер динамически управляет переключением между различными видами постоянной памяти, когда он запускает ядра, которые находятся в разных единицах компиляции. Хотя вы не можете динамически распределять постоянную память, этот шаблон достаточно, потому что предел 64K не является общесистемным, он применяется только к единицам компиляции.

Используйте первый шаблон, процитированный в вашем запросе: статически объявляйте постоянные данные и обновляйте его с помощью cudaMemcpyToSymbol перед запуском ядер, ссылающихся на него. Во втором шаблоне только чтение самого указателя будет проходить через постоянную память. Считывает с использованием указатель будет обслуживаться обычной иерархией кеша L1/L2.

+0

В главе N-body Руководства CUDA этот шаблон используется для хранения данных 4000 тел в постоянной памяти за раз. Джон Стоун использует аналогичную модель для некоторых своих ядер молекулярного моделирования, когда у него было другое использование для общей памяти. https://github.com/ArchaeaSoftware/cudahandbook/blob/master/nbody/nbody_GPU_AOS_const.cuh – ArchaeaSoftware

+0

Спасибо, теперь это понятно. –

Смежные вопросы