1

ThrustとCUDAを使用して、配列内の最小数を見つけようとしています。
次のデバイスの例は0で返されます:

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();

コンパレータタイプ:

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

そのthrust::sortが同じ述語で機能することを追加したかっただけです。

4

1 に答える 1

5

残念ながら、nvcc特定の整列された型のサイズについて、一部のホストコンパイラ(私が正しく思い出せば、MSVCのいくつかの64ビットバージョン)に同意しません。float4これらの1つです。これにより、多くの場合、未定義の動作が発生します。

回避策は、位置合わせなしで型を使用することです。次に例を示しmy_float4ます。

struct my_float4
{
  float x, y, z, w;
};
于 2012-02-13T19:19:19.073 に答える