Компиляция 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: если я скомпилирую тот же код с компилятором хоста, он будет работать отлично.

5

Решение

NVCC вызывает нормальный хост-компилятор, но не раньше, чем он выполнил некоторую предварительную обработку, поэтому вероятно, что NVCC изо всех сил пытается правильно проанализировать Eigen-код (особенно, если он использует функции C ++ 11, но это маловероятно, поскольку вы говорите, что VS2008 работает).

Я обычно советую разделить код устройства и оболочки в .cu файлы и оставляя остальную часть вашего приложения в обычном .c/.cpp файлы, которые будут обрабатываться компилятором хоста напрямую. Увидеть этот ответ некоторые советы по настройке VS2008.

2

Другие решения

Похоже, что одним из основных участников Eigen является портирование для совместимости с CUDA. Идея состояла бы в том, чтобы вызвать его из кода ядра.

2

Начиная с 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).

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector