Преобразование вектора тяги с участием соседних элементов

У меня есть вектор, и я хотел бы сделать следующее, используя преобразования 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;

Я думаю, что вы узнаете о "функторе", и несколько примеров толчка даст вам хорошее руководство.

Надеюсь, что это поможет вам решить вашу проблему.:)

Другие вопросы по тегам