Реализация нового класса в PyCuda

Я новичок в использовании pycuda, пока что я изучил некоторые базовые вещи, как писать ядра из книги "Cuda на примере", и моя следующая задача - использовать класс, который уже написан на C++, внутри ядер. Как я могу импортировать этот файл .h в pycuda? Должен ли я использовать boost python для передачи этого .h, чтобы его можно было импортировать, как и любой другой модуль в python? Дело в том, что мне нужны эти специальные переменные только внутри ядра. Этот класс используется для вычисления производных, и я напишу вам пару строк, чтобы вы могли увидеть, как он устроен:

adoublecuda.h:

namespace adtl {
class adouble {
public:
    // ctors
    __device__ __host__ inline adouble();
    __device__ __host__ inline adouble(const double v);
    __device__ __host__ inline adouble(const adouble& a);

    __device__ __host__ inline adouble operator - () const;
    __device__ __host__ inline adouble operator + () const;

...и т.д.

Я использую этот класс внутри C-CUDA, просто набрав #include «adoublecuda.h», и теперь я хочу включить то же самое в PyCUDA. Я использую этот класс только внутри ядер (мне не нужны двойные переменные внутри основного). Итак, мне придется использовать boost python, чтобы включить этот заголовочный файл в PyCuda?

Буду признателен за любой совет, спасибо за помощь!


person Banana    schedule 29.06.2012    source источник
comment
Поскольку вы новичок, я подумал, что упомяну, что для кодирования Python я считаю, что сочетание PyCuda и ArrayFire для Python было отличным для меня. В последнее время я много занимался прототипированием в Python, а не в MATLAB, и обнаружил, что это сочетание — самый быстрый способ добиться хорошей производительности. Может быть, попробуйте это, когда вы начнете.   -  person Ben Stewart    schedule 29.06.2012


Ответы (1)


Если он используется только внутри кода устройства, и вы не собираетесь заниматься каким-либо метапрограммированием, вам фактически не нужно ничего делать с Python или PyCUDA, чтобы заставить его работать. Просто скомпилируйте код своего устройства в объект CUBIN (поэтому используйте nvcc -cubin), а затем загрузите этот файл CUBIN, используя driver.module_from_file().

Вы можете увидеть полный пример этого в этот мой старый ответ.

person talonmies    schedule 29.06.2012
comment
Хорошо, я прочитал ваш пример, поэтому каждый раз, когда я хочу использовать какую-то функцию, мне нужно будет искать в этом двоичном файле код функции, поэтому в конце мой код будет не так читаем. :) Но все равно спасибо за этот совет, я думаю, что я буду использовать boostpython и переносить свои классы C++ с его помощью. - person Banana; 29.06.2012