Поведение 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 должны быть естественно выровнены.

Вас также может заинтересовать этот вопрос.

Другие вопросы по тегам