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