Каковы реальные языковые конструкции C ++, поддерживаемые кодом устройства CUDA? - PullRequest
10 голосов
/ 04 февраля 2011

Приложение D к версии 3.2 документации CUDA ссылается на поддержку C ++ в коде устройства CUDA.
Очевидно, что CUDA поддерживает «Классы для устройств с вычислительными возможностями 2.x».Тем не менее, я работаю с устройствами с вычислительными возможностями 1.1 и 1.3 и могу использовать эту функцию!

Например, этот код работает:

// class definition voluntary simplified
class Foo {
  private:
    int x_;

  public:
    __device__ Foo() { x_ = 42; }
    __device__ void bar() { return x_; }
};


//kernel using the previous class
__global__ void testKernel(uint32_t* ddata) {
    Foo f;
    ddata[threadIdx.x] = f.bar(); 
}

Я также могу использоватьшироко распространенные библиотеки, такие как классы Thrust :: random random random.Мое единственное предположение, что я могу сделать это благодаря автоматическому встраиванию отмеченной функции __device__, но это не объясняет обработку переменных-членов с помощью.

Вы когда-нибудь использовали такие функции в одинаковых условиях, или вы можете объяснить мне, почему мой код CUDA ведет себя так?Что-то не так в справочном руководстве?

Ответы [ 2 ]

11 голосов
/ 26 февраля 2011

Официально, CUDA не поддерживает классы на устройствах до 2.0.

Практически, по моему опыту, вы можете использовать все функции C ++ на всех устройствах, если эти функции могут быть разрешены во время компиляции. Устройства до версии 2.0 не поддерживают вызовы функций (все функции встроены), и ни одна программа не переходит на переменный адрес (только переходы по постоянному адресу).

Это означает, что вы можете использовать следующие конструкции C ++:

  • Видимость (общедоступная / защищенная / личная)
  • не виртуальное наследование
  • полное программирование шаблонов и метапрограммирование (до тех пор, пока вы не столкнетесь с ошибками nvcc; на версии 3.2 их довольно много)
  • конструкторы (кроме случаев, когда объект объявлен в __ общей __ памяти)
  • пространств имен * * 1016

Вы не можете использовать следующее:

  • операторы new & delete (я думаю, что устройства> = 2.0 могут это сделать)
  • виртуальные методы (требуются переходы по переменному адресу)
  • рекурсия функции (требуется вызов функции)
  • Исключения

На самом деле, все примеры в главе D.6 Руководства по программированию CUDA могут компилироваться для устройств <2.0 </p>

0 голосов
/ 05 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...