Cuda 二元函数和多种类型的推力减小

Cuda 二元函数和多种类型的推力减小,cuda,thrust,Cuda,Thrust,如何将推力减少与多种类型的二进制函数结合使用?在我的例子中,我有一个struct FaceUV,它有一个成员“distance”。我想用一段距离计算所有的FaceUV!=0我该怎么做 我以为是这样,但它没有编译: struct FaceHasUVCmp : public thrust::binary_function<FaceUV, uint32_t, uint32_t> { __device__ uint32_t operator()(const FaceU

如何将推力减少与多种类型的二进制函数结合使用?在我的例子中,我有一个struct FaceUV,它有一个成员“distance”。我想用一段距离计算所有的FaceUV!=0我该怎么做

我以为是这样,但它没有编译:

struct FaceHasUVCmp : public thrust::binary_function<FaceUV, uint32_t, uint32_t> {
    __device__
        uint32_t operator()(const FaceUV& o1, const uint32_t& count) const {
        return count + (o1.distance != 0);
    }
};

float get_percent_of_FACES_with_UVs(thrust::device_ptr<FaceUV> face_uvs, unsigned int size){


    uint32_t num_with_UVs = thrust::reduce(thrust::cuda::par, face_uvs, face_uvs + size, 0, FaceHasUVCmp());

    return num_with_UVs / (float)size;

}
struct FaceHasUVCmp:public-推力::二进制函数{
__装置__
uint32_t运算符()(常数面UV&o1,常数uint32_t&count)常数{
返回计数+(o1.distance!=0);
}
};
浮点获取带有UV的面的百分比(推力::设备ptr面,无符号整数大小){
uint32_t num_with_UVs=推力::减小(推力::cuda::par,face_UVs,face_UVs+大小,0,face HASUVCMP());
返回num_和_UVs/(float)大小;
}

这似乎与此问题类似:

正如Talonmes所指出的,您的归约不会编译,因为推力::归约要求二进制运算符的参数类型与其结果类型匹配

因此,使用推力::减少是不可能的。我还没有弄清楚如何完成我想做的事


编辑:我可能需要使用推力::转换_reduce,但我也不知道如何使用。

事实上,可以使用
推力::reduce
,但您需要为您的类型实现自定义迭代器,而不是自定义二进制函数