Поведение reintepret_cast указателей CUDA?
Учитывая следующую функцию хоста:
uint64_t * SomeDevPtr =...
/* Where SomeDevPtr is a pointer pointed to some device memory address allocated by cudaMalloc(); */
uint32_t * SomeDevIntPtr = reintepret_cast<uint32_t *>(SomeDevPtr);
Из-за функции, cudaMalloc
автоматически выполнит некоторые требования aligment (я думаю, что он выровнен с некоторой 128-байтовой границей памяти), поэтому я думаю, что оба SomeDevIntPtr
а также SomeDevPtr
должен начинаться с точно такого же физического адреса памяти в глобальной памяти графического процессора, я прав?
Я просто хочу убедиться в этом, так как некоторые функции, которые я написал, зависят от этого.
1 ответ
reinterpret_cast
указателя на указатель не изменяет (т. е. не должно) базовое числовое значение (представление битового шаблона) указателя.
Поэтому, какие бы ни были условия выравнивания, этот тип приведения не будет затронут.
Конечно, возможно привести правильно выровненный указатель к типу, который больше не имеет правильного выравнивания. Например, правильно выровненный float
указатель, который не находится на 4 float
Смещение (индекс) не может быть правильно приведено к float4
указатель для использования устройства CUDA. Некоторые указатели CUDA должны быть естественно выровнены.
Вас также может заинтересовать этот вопрос.