Доступ к члену структуры в CUDA? - PullRequest
0 голосов
/ 27 февраля 2011

Для упрощения, скажем, у меня есть эта структура:someheader.h

typedef struct
{
    float x
}someStruct;

в Cuda, как функция устройства получит доступ к члену структуры, если структура используется приложением C ++?

Например:

__global__ void stuff( someStruct *g ) {
    g[0].x = 0.4f;
}

это правильный способ сделать это?Кажется, он не работает.

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Вам нужно будет перенести массив структур в графический процессор.например, чтобы получить доступ к массиву с плавающей точкой внутри ядра, вам нужно будет сделать следующее </p> <pre>__global__ static void myKernel(float *val) { val[0] = 0.4f; } int main() { ... cudaMemcpy(d_Val, h_Val, n * sizeof(float), cudaMemcpyHostToDevice); ... }

Это, конечно, базовые знания.Вы можете заменить float любым типом данных и получить такое же поведение.Структуры - это не что иное, как определяемые пользователем типы данных.

Это отличается от отправки в единственном числе (и, следовательно, в единой структуре), поскольку все входы в ядро ​​помещаются в некоторую часть системы памяти графического процессора при запуске.время (в зависимости от карты), откуда GPU может получить доступ к этим значениям.Таким образом, если входные данные являются структурой, вся структура находится в графическом процессоре, когда ядро ​​пытается получить к нему доступ.Но если вы отправляете указатель на структуры, которые были сгенерированы на хосте, GPU имеет значение указателя, но не фактические данные.

1 голос
/ 27 февраля 2011

Сама Struct является абстрактной сущностью и не имеет физического представления на стороне хоста или устройства.

Структура памяти объекта на стороне устройства точно такая же, как на стороне хоста (если это то, что выдействительно спрашивает), так что вы можете безопасно копировать большие объекты структуры с хоста на устройство и наоборот.

Доступ к члену объекта - не что иное, как вычисление правильного смещения во время компиляции и добавление его к указателю объекта(this) во время выполнения.CUDA вполне может это сделать.

someStruct.x=2 будет переводиться на что-то вроде этого на языке ассемблера:

mov [someStruct]+0, 2

, где 0 - это смещение элемента x внутри вашегоstruct.

Обновление:

Память хоста и устройства полностью разделена (одна находится в вашей ОЗУ, другая на вашем GPU).Ничто не передается, все должно быть отправлено туда и обратно (что может занять довольно много времени).Используйте CudaMemcpy для копирования данных.

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