Простите, если это нетривиально.
У меня есть небольшой класс, оборачиваясь 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
компиляции?
Или ничего из этого не нужно?
Вы должны иметь в виду, что cusp — это библиотека шаблонов, построенная поверх тяги, которая также является библиотекой шаблонов. Методы класса cusp и thrust содержат много кода устройства, поэтому, если вы наследуете их, вы также наследуете много кода устройства.
Это означает, что как бы вы ни структурировали код в «классической» компиляции CUDA, точка создания экземпляра вашего класса и весь включенный код шаблона cusp и thrust должны находиться в одной единице перевода и должны быть представлены nvcc в форме он распознает как требующий компиляцию кода устройства (т. е. в файле .cu или с соответствующим переключателем компилятора).
Итак, эта последовательность определения производного класса и его создания:
class CuspMatrix
: public cusp::csr_matrix<int,float,cusp::device_memory>
{
...
}
...
{
CuspMatrix A;
...
}
должен быть скомпилирован с nvcc.
Других решений пока нет …