На моем хосте у меня есть следующие структуры данных:
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". Как мне это сделать?
Это не сработает: вы отправляете массив указателей, но не сами объекты. У вас должен быть массив (или вектор) пары:
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 *)), поэтому вы копируете неопределенную память.
Pair
вместо массива указателей наPair
, то копирование данных может быть простым с относительно небольшими изменениями в последовательности, которую вы обрисовали. В противном случае процесс значительно усложняется и потребует цикла с несколькими этапами. Если вы будете искать в двумерном массиве cuda (массив указателей на данные фактически является двумерным массивом), вы получите представление о сложности.