Каковы реальные С++ языковые конструкции, поддерживаемые кодом устройства CUDA?

Приложение D версии 3.2 документа CUDA относится к поддержке С++ в коде устройства 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 generation classes. Мое единственное предположение: я могу это сделать благодаря автоматической вставке __device__ отмеченной функции, но это не объясняет обработку переменных-членов withal.

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

Ответ 1

В частности, CUDA не поддерживает классы на устройствах до 2.0.

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

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

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

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

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

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

Ответ 2

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