Мой опыт работы с CUDA только начинается, но я считаю, что ошибка такова:
cudaMalloc
- это функция host , которая хочет записать указатель в хост память.Тем не менее, вы передаете ему указатель в device memory!
Чтобы исправить это, вы должны сначала создать указатели устройства и заполнить их в структуре вашего хост-объекта, и только потом скопироватьвсе это на устройство, а также скопировать отдельные пары на устройство.
Схематично:
struct Bar;
struct Foo
{
int tag;
Bar * bp;
};
void setup()
{
Foo * hFoo = new Foo[10];
Foo * dFoo;
cudaMalloc(dFoo, sizeof(Foo) * 10);
for (size_t i = 0; i != 10; ++i)
{
Bar * dBar;
cudaMalloc(&dbar, sizeof(Bar));
Bar b; // automatic temporary -- we never keep a host copy of this
cudaMemcpy(dBar, &b, sizeof(Bar));
hFoo[i].bp = dBar; // this is already a device pointer!
}
cudaMemcpy(dFoo, hFoo, sizeof(Foo) * 10);
}
При возврате не забудьте, что Foo::bp
device указатели, которые вам все еще нужно копировать обратно один за другим!
Вероятно, было бы проще иметь только один автономный класс, который вы можете перемещать за один раз, но это можетне быть практичным или желательным по соображениям локальности памяти.Вы должны тщательно об этом говорить.Если член - просто пара, почему бы не поместить два элемента в основной класс напрямую?