2012-02-20 15 views
5

ポイント(x、y)を含む特定の配列の平均を計算しようとしています。
推力を使って平均点を(x、y)点として求めることは可能ですか? 平均値が平均セルを表しているとは確信していませんが、各セルにポイントの絶対位置が含まれている場合はi*numColumns + jという意味で配列をthrust::device_vector<int>として表すこともできます。
ありがとうございます!推力を使ってint2配列から平均を計算する方法

+2

がちょうど 'int2'タイプの加算演算子を定義計算できない(すなわち、 '+ B =' {a.x + BX、a.y +によって})、次いで標準を使用入力の総和を計算し、次に要素数で割りますか? – talonmies

+0

Thrust 1.5 +のラムダプレースホルダを使用している場合は、演算子を使用できます(下記の私のアドオンの回答を参照してください)。 – harrism

答えて

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; 
} 
6

Kevemanの答えは、私は単にコードを必要とする有益なヒントを追加したい、正しいですので、私はコメントではなく、それをここにあげますよ。

Thrust 1.5では、ラムダプレースホルダが追加されているため、@ kevemanのアプローチはさらに簡単になります。ファンクタの代わりにint2operator+を定義し、ファンクタのインスタンス化を_1 + _2ラムダプレースホルダ式に置き換えます。 initの明示的宣言をmake_int2()(CUDA提供)に置き換えることもできます。注: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; 
} 
関連する問題