Я только начинающий с CUDA и Nsight и хочу использовать отличную производительность графического процессора с линейными операциями алгебры (например, CUBLAS). У меня есть много пользовательского кода, написанного с помощью собственный и есть много операций умножения матриц, поэтому я хотел, чтобы мой код оставался неизменным, просто делайте эти операции на GPU.
Я создал пример проекта с Visual Studio Nsight, и он работал нормально, но когда я добавляю
#include <Eigen/Dense>
Линия к этому проекту, у меня есть следующие ошибки
1>------ Build started: Project: MatrixPerformanceCompare, Configuration: Debug Win32 ------
1> Compiling CUDA source file kernel.cu...
1>
1> C:\CUDA\Progs\VS\SampleProject\MatrixPerformanceCompare>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2010 -ccbin "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin" -Ic:\CUDA\Progs\VS\SampleProject\MatrixPerformanceCompare\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -G --keep-dir Debug -maxrregcount=0 --machine 32 --compile -cudart static -g -DWIN32 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd " -o Debug\kernel.cu.obj "C:\CUDA\Progs\VS\SampleProject\MatrixPerformanceCompare\kernel.cu"1>c:\cuda\progs\vs\sampleproject\matrixperformancecompare\include\eigen\src/Core/Block.h(102): error : "operator=" has already been declared in the current scope
1>c:\cuda\progs\vs\sampleproject\matrixperformancecompare\include\eigen\src/Core/Ref.h(122): error : "operator=" has already been declared in the current scope
1>c:\cuda\progs\vs\sampleproject\matrixperformancecompare\include\eigen\src/Core/products/Parallelizer.h(20): warning : variable "m_maxThreads" was set but never used
1>c:\cuda\progs\vs\sampleproject\matrixperformancecompare\include\eigen\src/Geometry/RotationBase.h(76): error : function template "Eigen::operator*(const Eigen::EigenBase<OtherDerived> &, const Eigen::Quaternion<_Scalar, _Options> &)" has already been defined
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 5.5.targets(592,9): error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2010 -ccbin "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin" -Ic:\CUDA\Progs\VS\SampleProject\MatrixPerformanceCompare\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -G --keep-dir Debug -maxrregcount=0 --machine 32 --compile -cudart static -g -DWIN32 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd " -o Debug\kernel.cu.obj "C:\CUDA\Progs\VS\SampleProject\MatrixPerformanceCompare\kernel.cu"" exited with code 2.
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========
Я знаю, что это ошибка, связанная с определенными охранниками, но те, что в Eigen, кажутся нормальными, и в простом проекте c ++ код с тем же исходным кодом Eigen компилируется нормально.
Не могли бы вы помочь мне?
Анализатор внешнего интерфейса CUDA для кода C ++ не способен правильно анализировать чрезвычайно сложные определения шаблонов хостов во всех ситуациях. Его задача — просматривать код в .cu
файл и попробуйте разделить код, который должен быть скомпилирован цепочкой инструментов GPU, из кода, который должен пройти к компилятору хоста. Известно, что происходит сбой при импорте заголовков Boost и QT в .cu
файлы. Держу пари, шаблоны Eigen вызывают ту же проблему.
Единственное известное мне решение — это рефакторинг вашего кода для выделения кода хоста, основанного на шаблонах, в другой файл с .cc
расширение. Внешний интерфейс CUDA никогда не видит код в .cc
файл и проблема исчезает. На практике такого рода разбиение кода на самом деле не является проблемой, поскольку код шаблона хоста на самом деле нельзя использовать внутри кода CUDA GPU, и в худшем случае вам может потребоваться небольшая функция-обертка или дополнительный уровень абстракции для сохранения вашего GPU и код хоста отдельный.
Других решений пока нет …