2012-04-23 3 views
2

У меня есть следующие структуры данных:Упорного вектор, содержащих указатели структур

struct Data { 
    int* ptr; 
    int a; 
    int b; 
} 

мне нужен массив таких структур на GPU передается от хоста. Самый простой способ сделать это

thrust::host_vector<Data> h; 
... // fill vector 'h' 
thrust::device_vector<Data> d = h; 

хитрый момент, как выделить память для ptr и как копировать данные там. Есть ли предложения?

+0

Указатели могут быть скопированы точно так же, как и другие значения, но предположительно вы хотите использовать указатели разыменования в коде графического процессора. Правильный способ передачи данных зависит от того, что вы делаете с указателями. Что означает 'ptr'? Данные считываются или записываются на графический процессор? Возможно ли, что несколько экземпляров «Данные» содержат указатели на один и тот же объект? – Heatsink

+0

@Heatsink: 'ptr' - указатель на индивидуальную память устройства для каждого объекта Data. Я только сейчас понял, что могу написать что-то вроде 'cudaMalloc (& h [i] .ptr, ...)' и позже назначить 'd = h'. Это правда? Я не могу сказать, почему это меня сбивало с толку.) Вы хотите получить принятый ответ? Пожалуйста, сформулируйте свой комментарий в качестве ответа. – AdelNick

ответ

1

Обновлено на основе вашего комментария к @Heatsink, если я правильно понимаю, что вы хотите сказать, что данный

struct Data { 
    int* ptr; 
    int a, b; 
}; 

и

vector<Data> data; 

data[0].ptr указывает на память GPU, содержащий data[0].a и data[0].b If это правильно, тогда я рекомендовал бы следующую организацию:

struct Data { 
    int a, b; 
}; 

thrust::host_vector<Data> h; 
thrust::device_vector<Data> d = h; 

Память GPU для h[i] - это просто d[i]. Я бы не рекомендовал хранить указатель на элемент в памяти GPU и не хотел бы выделять отдельную память GPU для каждого объекта данных (было бы ужасно медленным). Ваш вычислительный код, вероятно, будет быстрее, если вы также используете отдельные массивы ,

Обычно организация ваших данных как структуры массивов вместо массива структур предпочтительнее по нескольким причинам, включая выравнивание и простоту слияния нагрузки.

+0

Что касается моей проблемы, известно, что каждый блок будет иметь доступ только к одному элементу массива, поэтому я могу пожертвовать универсальностью для ясности кода) – AdelNick

+0

@AdelNick Я обновил свой ответ, чтобы отразить разъяснение, которое вы предоставили Heatsink выше. –

+0

нет, 'ptr' не хранит' a' и 'b'. Это отдельный независимый фрагмент памяти, поэтому для каждого объекта Data необходимо выделить память для 'ptr' и заполнить его данными, а также присвоить значения для' a' и 'b'. – AdelNick

Смежные вопросы