Обновлено на основе вашего комментария к @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 для каждого объекта данных (было бы ужасно медленным). Ваш вычислительный код, вероятно, будет быстрее, если вы также используете отдельные массивы ,
Обычно организация ваших данных как структуры массивов вместо массива структур предпочтительнее по нескольким причинам, включая выравнивание и простоту слияния нагрузки.
Указатели могут быть скопированы точно так же, как и другие значения, но предположительно вы хотите использовать указатели разыменования в коде графического процессора. Правильный способ передачи данных зависит от того, что вы делаете с указателями. Что означает 'ptr'? Данные считываются или записываются на графический процессор? Возможно ли, что несколько экземпляров «Данные» содержат указатели на один и тот же объект? – Heatsink
@Heatsink: 'ptr' - указатель на индивидуальную память устройства для каждого объекта Data. Я только сейчас понял, что могу написать что-то вроде 'cudaMalloc (& h [i] .ptr, ...)' и позже назначить 'd = h'. Это правда? Я не могу сказать, почему это меня сбивало с толку.) Вы хотите получить принятый ответ? Пожалуйста, сформулируйте свой комментарий в качестве ответа. – AdelNick