thrust :: min_element не работает на float4 device_vector, а работает на host_vector - PullRequest
1 голос
/ 12 февраля 2012

Я пытаюсь найти минимальное число в массиве, используя 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 работает с тем же предикатом.

1 Ответ

5 голосов
/ 13 февраля 2012

К сожалению, nvcc не согласен с некоторыми хост-компиляторами (некоторые 64-битные версии MSVC, если я правильно помню) относительно размера определенных выровненных типов.float4 является одним из них.Это часто приводит к неопределенному поведению.

Обходной путь - использовать типы без выравнивания, например my_float4:

struct my_float4
{
  float x, y, z, w;
};
...