Подтвердить что ты не робот

CUDA внешняя связь класса и нерешенная функция extern в файле ptxas

Я работаю с CUDA, и я создал класс int2_ для обработки комплексных целочисленных чисел.

Объявления классов в файле ComplexTypes.h следующим образом:

namespace LibraryNameSpace
{
    class int2_ {

        public:
            int x;
            int y;

            // Constructors
            __host__ __device__ int2_(const int,const int);
            __host__ __device__ int2_();
            // etc.

            // Equalities with other types      
            __host__ __device__ const int2_& operator=(const int);
            __host__ __device__ const int2_& operator=(const float);
            // etc.

    };
}

Реализации классов в файле ComplexTypes.cpp следующим образом:

#include "ComplexTypes.h"

__host__ __device__         LibraryNameSpace::int2_::int2_(const int x_,const int y_)           { x=x_; y=y_;}
__host__ __device__         LibraryNameSpace::int2_::int2_() {}
// etc.

__host__ __device__ const   LibraryNameSpace::int2_& LibraryNameSpace::int2_::operator=(const int a)                        { x = a;            y = 0.;             return *this; }
__host__ __device__ const   LibraryNameSpace::int2_& LibraryNameSpace::int2_::operator=(const float a)                      { x = (int)a;       y = 0.;             return *this; }
// etc.

Все работает хорошо. В main (который включает ComplexTypes.h) я мог бы иметь дело с цифрами int2_.

В файле CudaMatrix.cu теперь я включаю ComplexTypes.h и определяю и правильно создаю функцию __global__:

template <class T1, class T2>
__global__ void evaluation_matrix(T1* data_, T2* ob, int NumElements)
{
    const int i = blockDim.x * blockIdx.x + threadIdx.x;
    if(i < NumElements) data_[i] = ob[i];
}

template __global__ void evaluation_matrix(LibraryNameSpace::int2_*,int*,int);

Ситуация в файле CudaMatrix.cu кажется симметричной функции main. Тем не менее, компилятор жалуется:

Error   19  error : Unresolved extern function '_ZN16LibraryNameSpace5int2_aSEi'    C:\Users\Documents\Project\Test\Testing_Files\ptxas simpleTest

Пожалуйста, считайте, что:

  • Перед переносом реализации в отдельные файлы все работало корректно, включая как объявления, так и реализации в файле main.
  • Проблематичная инструкция data_[i] = ob[i].

Кто-нибудь имеет представление о том, что происходит?

4b9b3361

Ответ 1

Процедура, которую я выполнил в моем сообщении выше, имеет две проблемы:

  • ComplexTypes.cpp имя файла должно быть обращено к ComplexTypes.cu, чтобы nvcc мог перехватить ключевые слова CUDA __device__ и __host__. Это было отмечено в его комментариях Talonmies. Фактически, перед публикацией я уже менял имя файла с .cpp до .cu, но компилятор жаловался и показывал ту же ошибку. Поэтому я изобретательно отступил,

  • В Visual Studio 2010 нужно использовать Вид → Страницы свойств; Свойства конфигурации → CUDA C/С++ → Common → Сгенерировать код переключаемого устройства → Да (-rdc = true). Это необходимо для отдельной компиляции. Действительно, в NVIDIA CUDA Compiler Driver NVCC говорится, что:

CUDA работает путем встраивания кода устройства в объекты хоста. Во всей компиляции программы он внедряет код исполняемого устройства в объект-хост. В отдельной компиляции мы вставляем код перемещаемого устройства в объект-хост и запускаем компоновщик устройств (nvlink), чтобы связать весь код устройства вместе. Затем вывод nvlink соединяется вместе со всеми объектами хоста компоновщиком хоста для формирования окончательного исполняемого файла. Генерация перемещаемого и исполняемого кода устройства управляется параметром - relocatable-device-code = {true, false}, который можно сократить до - RDC = {истина, ложь}.