Если я создаю / назначаю разделяемую память в одной функции, я могу использовать ее внутри функции, которую я вызываю, не так ли? - PullRequest
0 голосов
/ 17 августа 2011

Итак, если у меня есть функция device (или global ), которая создает / копирует некоторые данные в общую память, а позже я вызываю другую функцию device , вот так:

__global__ void a(){ 
    __shared__ int blah=0;
    fun();
}
__device__ void fun(){
   blah = 1; //perform some operations
   //do whatever
}

Я немного заржавел с моей CUDA, думаю, вам, возможно, пришлось «переопределить» разделяемую переменную (я предполагаю, что операция проверена, если существует разделяемая переменная с таким именем, если так ее назначает) - это имело эффект создания контекста - так что в основном переменная не просто возникла из ниоткуда. В качестве альтернативы, если это похоже на наличие глобальной переменной в стандарте C / C ++, и я могу просто сослаться на нее, как я это делал выше, было бы замечательно.

Я знаком с иерархией памяти, я просто разбираюсь в семантике создания / обращения к памяти.

Пожалуйста, сообщите, будет ли работать вышеуказанный эскиз. Спасибо.

1 Ответ

2 голосов
/ 17 августа 2011

Нет, это не будет работать в CUDA, больше не будет работать в стандартном C99. В настоящее время предпочтительным методом __device__ компиляции функций является встроенное расширение (они также скомпилированы как автономные объекты кода для архитектуры Fermi), но даже в этом случае __device__ функции по-прежнему должны подчиняться стандартному синтаксису и соглашениям области видимости C99. Таким образом, вам нужно передать аргументы, которые не имеют объема блока компиляции, по ссылке на __device__ функции.

...