#python #c #thrust
Вопрос:
У меня есть функция в библиотеке, которой нужно работать с данными, поступающими из python
Сначала я создаю кортеж vec3
typedef thrust::tuplelt;double,double,doublegt; vec3;
void thrust_decimation( double* x, double* y, double* z, long number_of_vertex) { auto data2workwith=thrust::make_tuple(x, y,z); std::vectorlt;vec3gt; local(number_of_vertex); for (int64_t i = 0; i lt; number_of_vertex; i ) { local[i]= vec3(x[i],y[i],z[i]); } thrust::device_vectorlt;vec3gt; keys1 =local; thrust::device_vectorlt;vec3gt; keys2(number_of_vertex); thrust::sort(keys1.begin(), keys1.end()); thrust::transform(keys1.begin(), keys1.end(), keys2.begin(), gridTransform(gridscale)); ... work with local ... work on x, y, z ... return x, y z }
Я не знаю, как передавать данные с помощью работы. Я сделал цикл, но так как я получил большой объем данных, продолжительность будет такой, сколько мне нужно, чтобы сделать это дважды.
Комментарии:
1. Я в замешательстве. Вам были переданы УКАЗАТЕЛИ на двойников, а не на двойников. data2workwith не относится к тому же типу, что и vec3. Кроме того, что такое «тяга»? Это ваш код?
2. Я добавляю часть кода, работающего с данными @Jellyboy
3. @Jellyboy Thrust-это параллельная замена STL с поддержкой GPU, которая поставляется вместе с набором инструментов CUDA.
4. Я бы рекомендовал использовать
thrust::zip_iterator
, что означает, что вы не переводите из SoA в AoS, а вместо этого используете триthrust::device_vectorlt;doublegt;
вектораx_d
y_d
иz_d
, которые затем объединяются в один итератор , который дает этиvec3
кортежи при разыменовании. Таким образом, вам не нужно создавать копию в памяти хоста.5. Спасибо @PaulG, я попробую это решение.