5

ポイント(x、y)を含む特定の配列の平均を計算しようとしています。
推力を使用して、(x、y)点として表される平均点を見つけることは可能ですか?thrust::device_vector<int>また、各セルにポイントの絶対位置が含まれている場合、配列をaとして表すこともできi*numColumns + jます。つまり、平均数が平均セルを表すかどうかはわかりません。
ありがとう!

4

2 に答える 2

8
#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/reduce.h>

struct add_int2 {
  __device__
  int2 operator()(const int2& a, const int2& b) const {
    int2 r;
    r.x = a.x + b.x;
    r.y = a.y + b.y;
    return r;
  }
};

#define N 20

int main()
{
  thrust::host_vector<int2> a(N);
  for (unsigned i=0; i<N; ++i) {
    a[i].x = i;
    a[i].y = i+1;
  }

  thrust::device_vector<int2> b = a;

  int2 init;
  init.x = init.y = 0;

  int2 ave = thrust::reduce(b.begin(), b.end(), init, add_int2());
  ave.x /= N;
  ave.y /= N;

  std::cout << ave.x << " " << ave.y << std::endl;
  return 0;
}
于 2012-02-20T20:19:14.860 に答える
6

Kevemanの答えは正解です。コードを必要とする便利なヒントを追加したいので、コメントではなくここに配置します。

Thrust 1.5はラムダプレースホルダーを追加します。これにより、@kevemanのアプローチがさらに簡単になります。ファンクターの代わりに、を定義operator+してint2から、ファンクターのインスタンス化を_1 + _2ラムダプレースホルダー式に置き換えます。の明示的な宣言を(CUDAが提供する)initへの呼び出しに置き換えることもできます。make_int2()注:int2 operator+CUDAコードサンプルSDKの「vector_math.h」ヘッダーで定義されていますが、明確にするために以下で定義します(このファイルはCUDAの標準部分ではないため)。

#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/reduce.h>

using namespace thrust::placeholders;

__device__
int2 operator+(const int2& a, const int2& b) {
  return make_int2(a.x+b.x, a.y+b.y);
}

#define N 20

int main()
{
  thrust::host_vector<int2> a(N);
  for (unsigned i=0; i<N; ++i) {
    a[i].x = i;
    a[i].y = i+1;
  }

  thrust::device_vector<int2> b = a;

  int2 ave = thrust::reduce(b.begin(), b.end(), make_int2(0, 0), _1 + _2);
  ave.x /= N;
  ave.y /= N;

  std::cout << ave.x << " " << ave.y << std::endl;
  return 0;
}
于 2012-02-20T22:55:49.050 に答える