首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用CUDA在2012中构建OpenCV

用CUDA在2012中构建OpenCV
EN

Stack Overflow用户
提问于 2013-05-26 19:18:51
回答 1查看 2.4K关注 0票数 4

我需要用Visual 2012编译OpenCV 2.4.5。特别是,我对用Cuda 5.0编译gpu模块很感兴趣。

为了在VS2012中启用CUDA编译,我遵循了本指南

我使用CMake创建VS2012解决方案,然后对每个.cu文件将元素类型从“自定义构建规则”更改为"CUDA C/C++“

我可以编译大部分的项目文件,但在某些文件上,我遇到了一个恼人的问题。

例如,fgd_bgfg.cu原因

错误C2039:'ParameterType':不是'cv::gpu::device::TypeTraits‘的成员

但在type_traits.hpp里我能读懂

代码语言:javascript
复制
typedef typename type_traits_detail::Select<IsSimpleParameter<UnqualifiedType>::value,
            T, typename type_traits_detail::AddParameterType<T>::type>::type ParameterType;

这是一个非常烦人的问题,我无法摆脱!

我不敢相信还没有人用VS2012和GPU构建opencv,有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2013-07-02 18:52:25

看来CUDA编译器无法处理模板特性技术。一种简单的方法是使用三种基本类型指定TypeTraits模板: double、float、int。我不确定这种方式是否正确,但CUDA编译器不会抱怨。

代码在这里列出:

代码语言:javascript
复制
template<> struct TypeTraits<double>
{
    typedef type_traits_detail::UnConst<double>::type                                                NonConstType;
    typedef type_traits_detail::UnVolatile<double>::type                                             NonVolatileType;
    typedef type_traits_detail::UnVolatile<typename type_traits_detail::UnConst<double>::type>::type UnqualifiedType;
    typedef type_traits_detail::PointerTraits<double>::type                            PointeeType;
    typedef type_traits_detail::ReferenceTraits<double>::type                                        ReferredType;

    enum { isConst          = type_traits_detail::UnConst<double>::value };
    enum { isVolatile       = type_traits_detail::UnVolatile<double>::value };

    enum { isReference      = type_traits_detail::ReferenceTraits<double>::value };
    enum { isPointer        = type_traits_detail::PointerTraits<typename type_traits_detail::ReferenceTraits<double>::type>::value };

    enum { isUnsignedInt    = type_traits_detail::IsUnsignedIntegral<double>::value };
    enum { isSignedInt      = type_traits_detail::IsSignedIntergral<double>::value };
    enum { isIntegral       = type_traits_detail::IsIntegral<double>::value };
    enum { isFloat          = type_traits_detail::IsFloat<double>::value };
    enum { isArith          = isIntegral || isFloat };
    enum { isVec            = type_traits_detail::IsVec<double>::value };

    typedef double ParameterType;
};
template<> struct TypeTraits<float>
{
    typedef type_traits_detail::UnConst<float>::type                                                NonConstType;
    typedef type_traits_detail::UnVolatile<float>::type                                             NonVolatileType;
    typedef type_traits_detail::UnVolatile<typename type_traits_detail::UnConst<float>::type>::type UnqualifiedType;
    typedef type_traits_detail::PointerTraits<float>::type                            PointeeType;
    typedef type_traits_detail::ReferenceTraits<float>::type                                        ReferredType;

    enum { isConst          = type_traits_detail::UnConst<float>::value };
    enum { isVolatile       = type_traits_detail::UnVolatile<float>::value };

    enum { isReference      = type_traits_detail::ReferenceTraits<float>::value };
    enum { isPointer        = type_traits_detail::PointerTraits<typename type_traits_detail::ReferenceTraits<float>::type>::value };

    enum { isUnsignedInt    = type_traits_detail::IsUnsignedIntegral<float>::value };
    enum { isSignedInt      = type_traits_detail::IsSignedIntergral<float>::value };
    enum { isIntegral       = type_traits_detail::IsIntegral<float>::value };
    enum { isFloat          = type_traits_detail::IsFloat<float>::value };
    enum { isArith          = isIntegral || isFloat };
    enum { isVec            = type_traits_detail::IsVec<float>::value };

    typedef float ParameterType;
};

template<> struct TypeTraits<int>
{
    typedef type_traits_detail::UnConst<int>::type                                                NonConstType;
    typedef type_traits_detail::UnVolatile<int>::type                                             NonVolatileType;
    typedef type_traits_detail::UnVolatile<typename type_traits_detail::UnConst<int>::type>::type UnqualifiedType;
    typedef type_traits_detail::PointerTraits<int>::type                            PointeeType;
    typedef type_traits_detail::ReferenceTraits<int>::type                                        ReferredType;

    enum { isConst          = type_traits_detail::UnConst<int>::value };
    enum { isVolatile       = type_traits_detail::UnVolatile<int>::value };

    enum { isReference      = type_traits_detail::ReferenceTraits<int>::value };
    enum { isPointer        = type_traits_detail::PointerTraits<typename type_traits_detail::ReferenceTraits<int>::type>::value };

    enum { isUnsignedInt    = type_traits_detail::IsUnsignedIntegral<int>::value };
    enum { isSignedInt      = type_traits_detail::IsSignedIntergral<int>::value };
    enum { isIntegral       = type_traits_detail::IsIntegral<int>::value };
    enum { isFloat          = type_traits_detail::IsFloat<int>::value };
    enum { isArith          = isIntegral || isFloat };
    enum { isVec            = type_traits_detail::IsVec<int>::value };

    typedef int ParameterType;
};

复制type_traits.hpp中的代码,在原始的TypeTraits定义后面。Build...then的猎物。

祝你好运!-D

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16762822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档