Передача thrust :: device_vector в функцию по ссылке - PullRequest
2 голосов
/ 08 июля 2011

Я пытаюсь передать device_vector структур

struct point 
{
    unsigned int x;
    unsigned int y;
}

функции следующим образом:

void print(thrust::device_vector<point> &points, unsigned int index)
{
    std::cout << points[index].y << points[index].y << std::endl;
}

myvector был правильно инициализирован

print(myvector, 0);

Я получаю следующие ошибки:

error: class "thrust::device_reference<point>" has no member "x"
error: class "thrust::device_reference<point>" has no member "y"

Что с ним не так?

Ответы [ 2 ]

5 голосов
/ 09 июля 2011

К сожалению, device_reference<T> не может выставить членов T, но может преобразоваться в T.

Для реализации print создайте временную копию каждого элемента, преобразовав ее во временную temp:

void print(thrust::device_vector<point> &points, unsigned int index)
{
    point temp = points[index];
    std::cout << temp.y << temp.y << std::endl;
}

Каждый раз, когда вы вызываете print, он вызывает передачу из графического процессора в системную память для создания временной. Если вам нужно распечатать всю коллекцию points за раз, более эффективный метод скопирует весь вектор points массово в host_vector или std::vector (используя thrust::copy), а затем проведет итерацию по коллекции как обычно.

1 голос
/ 08 июля 2011

С http://thrust.googlecode.com/svn/tags/1.1.0/doc/html/structthrust_1_1device__reference.html:

device_reference действует как ссылка на объект, сохраненный в памяти устройства.device_reference не предназначен для непосредственного использования;скорее этот тип является результатом защиты device_ptr.Точно так же, взяв адрес device_reference, вы получите device_ptr.

Может быть, вам нужно что-то вроде

(&points[index]).get()->x

вместо

points[index].x

Это немного уродливо, но CUDAнужен механизм для передачи данных между оперативной памятью и графическим процессором.

...