Я попытался скомпилировать следующую программу (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: если я скомпилирую тот же код с компилятором хоста, он будет работать отлично.
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
Так близко…
Это было исправлено в коммите 59db051 и доступен либо с помощью ветки разработки, либо в ожидании выхода версии 3.3 (или 3.3rc2).