Компиляция кода наследуемого класса и *.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.