Указатель на член объекта устройства - PullRequest
0 голосов
/ 24 февраля 2020

Я знаю, что не следует разыменовывать указатель на устройство. Но является ли следующее разыменованием?

struct example{
 int a;
 float b;
};

void test(){
 example* p_e; 
 cudamalloc(&p_e,sizeof(example));
 float* db = &p_e->b; // is this line valid?
}

Это работает на моем компьютере, но верно ли это?

edit:

С этим работает, я имел в виду, что это держит в моем тесте, что:

reinterpret_cast<void*>(&p_e->b) == reinterpret_cast<void*>(reinterpret_cast<unsigned char*>(p_e)+sizeof(int))

1 Ответ

3 голосов
/ 24 февраля 2020

Относительно этого:

float db = &p_e->b;

Я не могу представить ситуацию, когда адрес объекта в C или C ++ является значением float. Так что с точки зрения языка это не имеет смысла. Если мы изменим это на:

float *db = &p_e->b;

Это разумная конструкция, хотя, будет ли она "полезной", зависит от того, как вы собираетесь ее использовать. Для получения адреса местоположения p_e->b необходимо взять значение указателя, содержащегося в p_e (место в памяти хоста, поэтому разыменование устройства там не происходит) и добавить к нему смещение к местоположению b в пределах объект. Это смещение не требует разыменования. Это может быть вычислено просто проверкой определения класса / структуры. Так что ничего из этого не требует разыменования указателей.

Созданный указатель (db) теперь указывает на местоположение в памяти устройства, поэтому указатель должен использоваться (разыменовываться) только в коде устройства. Но вы можете передать этот указатель по значению ядру CUDA и разумно его «использовать».

Если вы действительно намеревались заполнить значение db содержимым float, на которое указывает указатель p_e->b, во-первых, ваш код этого не делает, и, во-вторых, обычно в коде хоста невозможно напрямую получить эти данные с устройства, когда указатель базовой структуры (b_e) выделен с использованием cudaMalloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...