Каковы реальные С++ языковые конструкции, поддерживаемые кодом устройства 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
Некоторые функции класса С++ будут работать, однако руководство по программированию в основном говорит о том, что оно не полностью поддерживается, и поэтому не все функции класса С++ будут работать. Если вы можете делать то, что хотите, тогда вам нужно идти вперед!