Я работаю с 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
, но это не сработало.
Я не уверен, как перегрузить +
оператор с обоими типом вектора а также тип векторного итератора. Имеет ли это смысл?
Спасибо за вашу помощь!
Это, кажется, работает, у других могут быть лучшие идеи:
#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
параметры функции, которые вы имели в своем определении шаблона, были не совсем правильными.
Других решений пока нет …