Компиляция 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).

Другие вопросы по тегам