2012-02-12 16 views
1

ThrustとCUDAを使用して配列内の最小値を探しようとしています。
次のデバイスの例は、0で返します。thrust :: min_elementはfloat4のdevice_vectorでは機能しませんが、host_vectorでは機能しません

thrust::device_vector<float4>::iterator it = thrust::min_element(IntsOnDev.begin(),IntsOnDev.end(),equalOperator());  
int pos = it - IntsOnDev.begin(); 

しかし、このホストのバージョンが完璧に動作します:

thrust::host_vector<float4>arr = IntsOnDev; 
thrust::host_vector<float4>::iterator it2 = thrust::min_element(arr.begin(),arr.end(),equalOperator()); 
int pos2 = it2 - arr.begin(); 

comperatorタイプ:

struct equalOperator 
{ 
    __host__ __device__ 
    bool operator()(const float4 x,const float4 y) const 
    { 
     return (x.w < y.w); 
    } 
}; 

を私はちょうどその推力を追加したいです:: sortは同じ述語で動作します。

+1

あなたが '' 'my_float4'''、すなわち' ''構造体my_float4 {float型のXでこれを試すとどうなりますか、 y、z、w; }; '' '? –

+0

そのトリックをした!私は、元の投稿を書いた後、その解決策がほんの少し分かった...私は実際に自分自身の新しいfloat4構造体を定義しました。新しい構造体は基本的にfloat4(バイト単位)に等しいので、ほとんど何も変更しなくてはなりませんでした –

答えて

5

残念ながら、nvccは、特定の整列タイプのサイズについて、一部のホストコンパイラ(MSVCの一部の64ビットバージョン、正しくリコールすれば)と一致しません。 float4がこれらの1つです。これにより、定義されていない動作がしばしば発生します。

回避策は、たとえばmy_float4ため、アライメントなしのタイプを使用することです:

struct my_float4 
{ 
    float x, y, z, w; 
}; 
関連する問題