Относительно этого:
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
.