cudaMemcpyToSymbol не копировать данные - PullRequest
3 голосов
/ 11 августа 2009

Я хочу использовать __constant__ память, к которой будут обращаться все потоки всех моих ядер.

Объявление выглядит примерно так

extern __constant__ float smooth [8 * 1024];

Я копирую данные в эту переменную, используя

cudaMemcpyToSymbol("smooth", smooth_local, smooth_size, 0, cudaMemcpyHostToDevice);

smooth_size = 7 Кбайт

Это дало мне неправильный вывод

но когда я запустил его в режиме -deviceemu и попытался распечатать содержимое обеих этих переменных внутри ядра, я получил все нули для smooth и smooth_local были правильными.

Я попытался распечатать вывод сразу после cudaMemcpyToSymbol, но он по-прежнему давал мне 0.

Кто-нибудь может пролить свет на мою проблему?

1 Ответ

6 голосов
/ 22 августа 2009

Чтобы объявить постоянную память CUDA, это выглядело бы так:

__constant__ float smooth[8 * 1024];

Обратите внимание, что постоянная память CUDA является локальной для ее единицы перевода (то есть она неявно объявляется статической). Это одно из досадных ограничений CUDA, поэтому, если вам нужно разделить эти значения между отдельными файлами .cpp / .cu, вам придется заново объявить память в каждом файле .cpp / .cu, в котором он необходим. снова вызвать cudaMemCopyToSymbol. И, наконец, вы ограничены до 64 КБ постоянной памяти во всей вашей программе CUDA.

...