Компиляция кода наследуемого класса и *.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 компиляции? Или ничего из этого не нужно?

1 ответ

Решение

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

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

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

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

...

{
    CuspMatrix A;
    ...
}

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

Другие вопросы по тегам