Как выделить память устройства для моего массива указателей в CUDA?

0

На моем хосте у меня есть следующие структуры данных:

typedef struct point{
   int x;
   int y;
}Point;

 typedef struct pair{
     Point i;
     Point j;
     float cost;
 }Pair;

Pair* pairs[n];   // allocates an array of pointers to pair

Теперь я должен скопировать "пары" на GPU. Итак, я объявляю следующий указатель:

Pair **d_pair;

и выделите память, используя следующее:

cudaMalloc((void**)d_pair,(sizeof(Pair)+sizeof(Pair*))*n);

Теперь я копирую с хоста на устройство:

cudaMempy(d_pair,pair,(sizeof(Pair)+sizeof(Pair*))*n),cudaMemcpyHostToDevice);

Прототип ядра получает d_pair как:

__global__ my_kernel(Pair* d_pair[], ... ){ 
...
}

Должна ли следующая последовательность заявлений работать по назначению? Если нет, какие модификации я делаю? В принципе, я хочу скопировать пары пар [n]; как таковой для "d_pair". Как мне это сделать?

  • 1
    Если вы можете переключиться на массив Pair вместо массива указателей на Pair , то копирование данных может быть простым с относительно небольшими изменениями в последовательности, которую вы обрисовали. В противном случае процесс значительно усложняется и потребует цикла с несколькими этапами. Если вы будете искать в двумерном массиве cuda (массив указателей на данные фактически является двумерным массивом), вы получите представление о сложности.
Теги:
cuda

1 ответ

2

Это не сработает: вы отправляете массив указателей, но не сами объекты. У вас должен быть массив (или вектор) пары:

Pair pairs[n]; 

А потом:

Pair *d_pair;
cudaMalloc((void**)&d_pair,sizeof(Pair)*n);
cudaMempy(d_pair,pairs,sizeof(Pair)*n,cudaMemcpyHostToDevice);

Кстати, это:

cudaMempy(d_pair,pair,(sizeof(Pair)+sizeof(Pair*))*n),cudaMemcpyHostToDevice);

не имеет смысла, вы выделяете место для указателя AND a Pair. Ваша копия использует одно и то же выражение (sizeof (Pair) +sizeof (Pair *)) * n), но пары массивов (n * sizeof (Pair *)), поэтому вы копируете неопределенную память.

  • 0
    Подскажите, пожалуйста, какие изменения я должен внести в код?
  • 0
    Я обновил свой ответ
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню