CUDA и classы

Я искал все, чтобы понять, как именно использовать classы с CUDA, и хотя существует общее мнение о том, что это можно сделать и, по-видимому, делают люди, мне было трудно узнать, как на самом деле сделай это.

У меня есть class, который реализует базовый битсет с перегрузкой оператора и т. П. Мне нужно иметь возможность создавать объекты этого classа как на хосте, так и на устройстве, копировать между ними и т. Д. Я определяю этот class в .cu? Если да, то каким образом я могу использовать его в своем коде на C ++ на стороне хоста? Функции classа не нуждаются в доступе к специальным переменным CUDA, таким как threadId; он просто должен быть способен использовать хост и устройство.

Спасибо за любую помощь, и если я подхожу к этому совершенно неправильно, я бы хотел услышать альтернативы.

Определите class в заголовке, который вы #include, как в C ++.

Любой метод, который должен вызываться из кода устройства, должен быть определен как с __device__ и с __host__ declspecs, включая конструктор и деструктор, если вы планируете использовать new / delete на устройстве (примечание new / delete требует CUDA 4.0 и вычислительной способности 2.0 или выше GPU).

Вероятно, вы хотите определить макрос как

 #ifdef __CUDACC__ #define CUDA_CALLABLE_MEMBER __host__ __device__ #else #define CUDA_CALLABLE_MEMBER #endif 

Затем используйте этот макрос для своих функций-членов

 class Foo { public: CUDA_CALLABLE_MEMBER Foo() {} CUDA_CALLABLE_MEMBER ~Foo() {} CUDA_CALLABLE_MEMBER void aMethod() {} }; 

Причина этого в том, что только компилятор CUDA знает __device__ и __host__ – ваш компилятор хоста C ++ вызовет ошибку.

Изменить: Примечание __CUDACC__ определяется NVCC при компиляции файлов CUDA . Это может быть либо при компиляции файла .cu с NVCC, либо при компиляции любого файла с параметром командной строки -x cu .

Другим хорошим ресурсом для этого вопроса являются некоторые примеры кода, поставляемые с инструментарием CUDA. В рамках этих образцов кода вы можете найти примеры практически любой вещи, которую вы могли бы себе представить. Один из вопросов, относящихся к вашему вопросу, – файл quadtree.cu. Удачи.

  • Ядро возврата Cuda
  • Требования к вычислительной способности CUDA
  • Как я могу добавить два массива 2d (стадия), используя вложенные для циклов?
  • nvidia-smi Неустойчивое использование GPU-использования?
  • Настройка VS Intellisense для вызовов ядра CUDA
  • Дифференцируйте процессор CUDA (NVIDIA) и Stream (ATI / AMD)
  • Передача функции хоста в качестве функции в функции __global__ OR __device__ в CUDA
  • Упор внутри написанных пользователем ядер
  • Ошибка связывания CUDA - Visual Express 2008 - nvcc фатальный из-за (нулевого) файла конфигурации
  • Как запустить приложение CUDA в Visual Studio 2010?
  • Скопировать объект на устройство?
  • Давайте будем гением компьютера.