Компиляция кода наследуемого класса и * .cu устройства

Простите, если это нетривиально.
У меня есть небольшой класс, оборачиваясь cusp::csr_matrix<int,float,cusp::device_memory> вот так:

class CuspMatrix
: public cusp::csr_matrix<int,float,cusp::device_memory>
{
...
}

Пока что я не делаю ничего, что, как мне кажется, должно было бы быть скомпилировано для устройства.
Однако я планирую написать код в этом конкретном классе, как член / функцию, который должен выполняться на устройстве, но если я правильно понимаю, cusp уже предоставляет эту функциональность для меня?
Например:

ValueType v_nrm2 = cusp::blas::nrm2(V);
cusp::transpose(M,M_t);

вычисление нормы или транспонирование, в идеале, должно компилироваться для выполнения устройства.
Что мне делать в этом случае, если это является частью метода класса?

Я делаю весь *.hpp заголовочный файл класса, а *.cu и добавить его для nvcc компиляции? Я отмечаю только фактический код (а не объявление заголовка) в *.cu и добавить его для nvcc компиляции?
Или ничего из этого не нужно?

0

Решение

Вы должны иметь в виду, что cusp — это библиотека шаблонов, построенная поверх тяги, которая также является библиотекой шаблонов. Методы класса cusp и thrust содержат много кода устройства, поэтому, если вы наследуете их, вы также наследуете много кода устройства.

Это означает, что как бы вы ни структурировали код в «классической» компиляции CUDA, точка создания экземпляра вашего класса и весь включенный код шаблона cusp и thrust должны находиться в одной единице перевода и должны быть представлены nvcc в форме он распознает как требующий компиляцию кода устройства (т. е. в файле .cu или с соответствующим переключателем компилятора).

Итак, эта последовательность определения производного класса и его создания:

class CuspMatrix
: public cusp::csr_matrix<int,float,cusp::device_memory>
{
...
}

...

{
CuspMatrix A;
...
}

должен быть скомпилирован с nvcc.

2

Другие решения

Других решений пока нет …