CUDA:识别功能的存在并区分__host__和__device__

时间:2019-02-20 23:35:18

标签: c++ cuda template-meta-programming

我正在尝试检测某些类型的运算符的存在。但是我无法区分__host____device__函数。我已经有一个用于识别普通C ++中的运算符的简单实现,但是无法区分__host____device__

下面有一个最小的工作示例,该示例显示了对==运算符的检测,但它同时为AB打印了1。在做出区分方面的任何帮助将不胜感激。

#include <iostream>
using std::cout;

template<class X, class Y, class Op>
struct op_valid_impl
{
    template<class U, class L, class R>
    static auto test(int) -> decltype(std::declval<U>()(std::declval<L>(), std::declval<R>()),
                                      void(), std::true_type());

    template<class U, class L, class R>
    static auto test(...) -> std::false_type;

    using type = decltype(test<Op, X, Y>(0));

};

template<class X, class Y, class Op> using op_valid = typename op_valid_impl<X, Y, Op>::type;

template<class X, class Y> using has_equality = op_valid<X, Y, std::equal_to<>>;

class A {};
class B {};
class C {};

void __host__   operator==(A, A) {}
void __device__ operator==(B, B) {}

int main(int, char**) {
    cout <<  "A: " << has_equality<A, A>::value << '\n';
    cout <<  "B: " << has_equality<B, B>::value << '\n';
    cout <<  "C: " << has_equality<C, C>::value << '\n';
    return 0;
}

/* Output:
A: 1
B: 1
C: 0
*/

我使用GCC 7.3.1和CUDA 10进行了编译。

0 个答案:

没有答案