Cuda Thrust Custom функция - PullRequest
       9

Cuda Thrust Custom функция

0 голосов
/ 20 сентября 2011

Как я могу реализовать эту функцию в Thrust?

for (i=0;i<n;i++)
    if (i==pos)
        h1[i]=1/h1[i];
    else
        h1[i]=-h1[i]/value;

В CUDA я сделал это так:

__global__ void inverse_1(double* h1, double value, int pos, int N)
{
    int i = blockDim.x * blockIdx.x + threadIdx.x;
    if (i < N){
        if (i == pos)
            h1[i] = 1 / h1[i];
        else
            h1[i] = -h1[i] / value;
    }
}

Спасибо!

1 Ответ

4 голосов
/ 20 сентября 2011

Вам нужно создать бинарный функтор, чтобы применить операцию, а затем использовать итератор подсчета в качестве второго входа. Вы можете передать pos и value в конструктор функтора. Это будет выглядеть примерно так:

struct inv1_functor
{
  const int pos;
  const double value;

  inv1_functor(double _value, int _pos) : value(_value), pos(_pos) {}

  __host__ __device__
  double operator()(const double &x, const int &i) const {
    if (i == pos)
      return 1.0/x;
    else
      return -x/value;
  }
};

//...

thrust::transform(d_vec.begin(), d_vec.end(), thrust::counting_iterator<int>(),  d_vec.begin(), inv1_functor(value, pos));
...