Перегрузка & quot; + & quot; оператор для тяги, есть идеи?

Я работаю с CUDA и Thrust. Я нахожу набрав thrust::transform [plus/minus/divide] утомительно, поэтому я просто хочу перегрузить некоторые простые операторы.

Было бы здорово, если бы я мог сделать:

thrust::[host/device]_vector<float> host;
thrust::[host/device]_vector<float> otherHost;
thrust::[host/device]_vector<float> result = host + otherHost;

Вот пример фрагмента для +:

template <typename T>
__host__ __device__ T& operator+(T &lhs, const T &rhs) {
thrust::transform(rhs.begin(), rhs.end(),
lhs.begin(), lhs.end(), thrust::plus<?>());
return lhs;
}

Тем не менее thrust::plus<?> не правильно перегружен, или я не делаю это правильно … один или другой. (Если перегрузка простых операторов для этого является плохой идеей, пожалуйста, объясните почему). Сначала я думал, что смогу перегрузить ? заполнитель с чем-то вроде typename T::iterator, но это не сработало.

Я не уверен, как перегрузить + оператор с обоими типом вектора а также тип векторного итератора. Имеет ли это смысл?

Спасибо за вашу помощь!

2

Решение

Это, кажется, работает, у других могут быть лучшие идеи:

#include <ostream>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/functional.h>
#include <thrust/copy.h>
#include <thrust/fill.h>

#define DSIZE 10template <typename T>
thrust::device_vector<T>  operator+(thrust::device_vector<T> &lhs, const thrust::device_vector<T> &rhs) {
thrust::transform(rhs.begin(), rhs.end(),
lhs.begin(), lhs.begin(), thrust::plus<T>());
return lhs;
}

template <typename T>
thrust::host_vector<T>  operator+(thrust::host_vector<T> &lhs, const thrust::host_vector<T> &rhs) {
thrust::transform(rhs.begin(), rhs.end(),
lhs.begin(), lhs.begin(), thrust::plus<T>());
return lhs;
}
int main() {thrust::device_vector<float> dvec(DSIZE);
thrust::device_vector<float> otherdvec(DSIZE);
thrust::fill(dvec.begin(), dvec.end(), 1.0f);
thrust::fill(otherdvec.begin(), otherdvec.end(), 2.0f);
thrust::host_vector<float> hresult1 = dvec + otherdvec;

std::cout << "result 1: ";
thrust::copy(hresult1.begin(), hresult1.end(), std::ostream_iterator<float>(std::cout, " "));  std::cout << std::endl;

thrust::host_vector<float> hvec(DSIZE);
thrust::fill(hvec.begin(), hvec.end(), 5.0f);
thrust::host_vector<float> hresult2 = hvec + hresult1;std::cout << "result 2: ";
thrust::copy(hresult2.begin(), hresult2.end(), std::ostream_iterator<float>(std::cout, " "));  std::cout << std::endl;

// this line would produce a compile error:
// thrust::host_vector<float> hresult3 = dvec + hvec;

return 0;
}

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

Также обратите внимание, что thrust::transform параметры функции, которые вы имели в своем определении шаблона, были не совсем правильными.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]