CUDA указатели на константы устройства - PullRequest
1 голос
/ 19 марта 2011

У меня есть следующая константа, определенная на устройстве CUDA:

__constant__ int deviceTempVariable = 1;

Теперь я попытался получить адрес deviceTempVariable, используя два метода, и я получаю разные результаты.Первый - это прямой доступ к памяти из ядра CUDA следующим образом:

__global__ void cudaPointers(pointerStruct* devicePointer)
{
    devicePointer->itsPointer = &deviceTempVariable;
}

Другой - через код хоста следующим образом:

cudaGetSymbolAddress((void**) &pointerCuda, "deviceTempVariable");

Мне было любопытно, и я проверил значения адресов;первый дает что-то вроде 00000008, а второй - 00110008.Смещение кажется одинаковым во всех случаях (число 8), но остальное отличается.Что здесь происходит и какой адрес мне нужно использовать?

Ответы [ 2 ]

4 голосов
/ 20 марта 2011

Указатель, созданный в ядре, явно пригоден для использования на устройстве. Вероятно, это физический адрес, хотя некоторые графические процессоры могут добавлять виртуализацию (MMU и TLB).

Похоже, cudaGetSymbolAddress дает вам адрес, который можно использовать с хост-процессора. Это отличается тем, что память устройства отображена в виртуальном адресном пространстве хоста со смещением.

Код хоста должен использовать адрес, возвращаемый cudaGetSymbolAddress, код ядра должен использовать оператор адреса &.

Указатели, встроенные в структуры совместно используемых данных, должны использовать основанную адресацию (в основном, как и при индексировании массива, вы сохраняете смещение от известного местоположения, которое могут найти и хост, и ядро).

0 голосов
/ 20 марта 2011

Это интересно.Как вы печатаете два адреса?Вы уверены, что не печатаете адрес указателя?

Вам необходимо передать

void * address;

на

cudaGetSymbolAddress( &address, "deviceTempVariable");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...