Преобразование вектора тяги с участием соседних элементов
У меня есть вектор, и я хотел бы сделать следующее, используя преобразования CUDA и Thrust:
// thrust::device_vector v;
// for k times:
// calculate constants a and b as functions of k;
// for (i=0; i < v.size(); i++)
// v[i] = a*v[i] + b*v[i+1];
Как мне правильно это реализовать? Один из способов сделать это - использовать вектор w, применить thrust::transform к v и сохранить результаты в w. Но k заранее неизвестно, и я не хочу создавать w1, w2, ... и тратить много памяти на GPU. Желательно минимизировать объем копирования данных. Но я не уверен, как реализовать это, используя один вектор, когда значения не наступают друг на друга. Есть ли что-то, что предлагает Thrust, способное сделать это?
2 ответа
Если v.size()
достаточно большой, чтобы полностью использовать графический процессор, вы можете запустить k
ядра для этого, с дополнительным буфером mem и без дополнительной передачи данных.
thrust::device_vector u(v.size());
for(k=0;;)
{
// calculate a & b
thrust::transform(v.begin(), v.end()-1, v.begin()+1, u.begin(), a*_1 + b*_2);
k++;
if(k>=K)
break;
// calculate a & b
thrust::transform(u.begin(), u.end()-1, u.begin()+1, v.begin(), a*_1 + b*_2);
k++;
if(k>=K)
break;
}
Я на самом деле не понимаю "k раз", но следующий код может вам помочь.
struct OP {
const int a, b;
OP(const int p, const int q): a(p), b(q){};
int operator()(const int v1, const int v2) {
return a*v1+b*v2;
}
}
thrust::device_vector<int> w(v.size());
thrust::transform(v.begin(), v.end()-1, //input_1
v.begin()+1, //input_2
w.begin(), //output
OP(a, b)); //functor
v = w;
Я думаю, что вы узнаете о "функторе", и несколько примеров толчка даст вам хорошее руководство.
Надеюсь, что это поможет вам решить вашу проблему.:)