Компиляция Eigen библиотеки с помощью nvcc (CUDA)
Я попытался скомпилировать следующую программу (main.cu) с помощью nvcc (CUDA 5.0 RC):
#include <Eigen/Core>
#include <iostream>
int main( int argc, char** argv )
{
std::cout << "Pure CUDA" << std::endl;
}
К сожалению, я получаю кучу предупреждений и ошибок, которые могу объяснить только с помощью nvcc вместо компиляции Microsoft.
Это предположение верно? Есть ли способ скомпилировать Eigen с nvcc? (Я на самом деле не хочу передавать матрицы Eigen в GPU, просто получить доступ к их членам)?
Если это не должно работать для компиляции Eigen с nvcc, есть ли хорошее руководство / руководство по умным способам разделения кода хоста и устройства?
Я использую CUDA 5.0 RC, Visual Studio 2008, Eigen 3.0.5. Для компиляции файла.cu я использовал оба, файл правил, включенный в CUDA, а также пользовательский шаг сборки, созданный CMake. Используя файл правил CUDA, я настроил сборку на вычислительные возможности 3.0.
Спасибо за совет.
PS: если я скомпилирую тот же код с компилятором хоста, он будет работать отлично.
3 ответа
NVCC вызывает нормальный хост-компилятор, но не раньше, чем он выполнил некоторую предварительную обработку, поэтому вероятно, что NVCC изо всех сил пытается правильно проанализировать Eigen-код (особенно, если он использует функции C++11, но это маловероятно, поскольку вы говорите, что VS2008 работает).
Я обычно советую разделить код устройства и оболочки в .cu
файлы и оставляя остальную часть вашего приложения в обычном .c
/.cpp
файлы, которые будут обрабатываться компилятором хоста напрямую. Посмотрите этот ответ для некоторых советов по настройке VS2008.
Похоже, что один из основных участников Eigen переносит его на совместимость с CUDA. Идея состояла бы в том, чтобы вызвать его из кода ядра.
Начиная с Eigen 3.3, nvcc (7.5) успешно передает код Eigen в cl (MSVC 2013) (почти?) Правильно. Например, следующий код выдает только 11 предупреждений:
#include <Eigen/Core>
#include <iostream>
int main()
{
std::cout << "Hello Eigen\t";
std::cout << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << "." << EIGEN_MINOR_VERSION << "\n";
std::cout << "Hello nvcc\t";
std::cout << __CUDACC_VER_MAJOR__ << "." << __CUDACC_VER_MINOR__ << "." << __CUDACC_VER_BUILD__ << "\n";
return 0;
}
Выход как и ожидалось (Eigen 3.3rc1):
Привет Эйген 3.2.94
Привет nvcc 7.5.17
Но длинный список предупреждений (смотрите историю сообщений, если вы действительно хотите их видеть).
Обновить:
К сожалению, использование CUDA 8.0 и VS2015 (с Eigen 3.2.9 и Eigen 3.3rc1) снова приводит к ошибкам компиляции:
"operator =" уже был объявлен в текущей области видимости eigen \ src \ Core \ Block.h 111
"operator =" уже объявлен в текущей области видимости eigen\src\Core\Ref.h 89
Так близко...
Обновление 2:
Это было исправлено в коммите 59db051 и доступно либо с помощью ветки разработки, либо с ожиданием выхода версии 3.3 (или 3.3rc2).