CUDA: распознавать существование функции и различать __host__ и __device__ - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь обнаружить существование операторов для некоторых типов.Но я не могу различить функции __host__ и __device__.У меня уже есть простая реализация для идентификации оператора в обычном C ++, но она не может провести различие между __host__ и __device__.

Ниже приведен минимальный рабочий пример, который показывает обнаружениеоператора ==, но выводит 1 для A и B.Буду признателен за любую помощь в создании дистрибутива.

#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.

...