2012-02-12 2 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''', то есть' '' STRUCT my_float4 {флоат х, Y, Z, W; }; '' '? –

+0

, который сделал трюк! я узнал, что решение несколько минут после того, как я написал исходный пост ... Я фактически определил новую собственную структуру float4, синус, новая структура в основном равна float4 (в байтах), поэтому мне пришлось почти ничего не менять –

ответ

5

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

Обработку вокруг использовать типы без выравнивания, например my_float4:

struct my_float4 
{ 
    float x, y, z, w; 
}; 
Смежные вопросы