2014-11-12 4 views
2

У меня есть проект, который скомпилирован с помощью autotools и до этой недели должен быть только скомпилирован с поддержкой OpenMP и MPI. Теперь я добавил ядро ​​CUDA, которое я хочу скомпилировать в код при определенных обстоятельствах. Компиляция кода идет хорошо, и все объектные файлы создаются. Когда речь идет о компоновке объектов в исполняемый файл используется следующая команда:Проблемы с Autotools при связывании с OpenMP, MPI и CUDA

/бен/Баш ../libtool --tag = CXX --mode = ссылка NVCC -ccbin = mpicxx -I/USR/local/cuda/include -Xcompiler -std = C++ 0x -Xcompiler -fopenmp -L/usr/local/cuda/lib64 -lcuda -lcudart -lcufft -o utrplauncher utrplauncher-UTRP.o crossovers/libcrossovers.a Инициализаторы/libinitialisers . мутаторы/проблема libmutators.a/libproblem.a общего/libcommon.a переменных/libvariables.a ../libraries/framework/libmoeaframework.a ../libraries/ticpp/libticpp.a

Который в turn генерирует следующую команду связи

libtool: ссылка: nvcc -ccbin = mpicxx -I/usr/local/cuda/include -std = C++ 0x -fopenmp -o utrplauncher utrplauncher-UTRP.o -L/usr/local/cuda/lib64 -lcuda -lcudart -lcufft crossovers/libcrossovers.a initialisers/libinitialisers.a mutators/libmutators.a problem/libproblem.a common/libcommon.a variables/libvariables.a ../libraries/framework/libmoeaframework.a ../libraries /ticpp/libticpp.a

этого генерирует следующее сообщение об ошибке, потому что -std = C++ 0x и -fopenmp интерпретируются компилятором CUDA и не mpicxx компилятор.

nvcc fatal : Value 'c++0x' is not defined for option 'std' 

Я могу опубликовать свой файл configure.ac, если это поможет, но хотелось бы, чтобы на данный момент вопрос был кратким.

Вопрос в том, можно ли пересылать флаги -Xcompiler в компилятор mpicxx, а не лишать их libtool?

ответ

1

Один из способов передать как -Xcompiler=-std=c++0x и -Xcompiler=-fopenmp непосредственно компилятором с использованием -Wc,, таким образом -Xcompiler не раздели libtool. Например, следующие всухую:

Libtool -n --tag = CXX --mode = ссылка NVCC -ccbin = mpicxx-I/USR/местные/CUDA/включают -Wc, -Xcompiler = -std = C++ 0x -Wc, -Xcompiler = -fopenmp -L/usr/local/cuda/lib64 -lcuda -lcudart -lcufft -o utrplauncher utrplauncher-UTRP.o crossovers/libcrossovers.a initialisers/libinitialisers.a мутаторы/libmutators .a проблема/libproblem.a общие/libcommon.a переменных/libvariables.a ../libraries/framework/libmoeaframework.a ../libraries/ticpp/libticpp.a

генерирует:

Libtool: ссылка: NVCC -ccbin = mpicxx-I/USR/местные/CUDA/включают -Xcompiler = -std = C++ 0x -Xcompiler = -fopenmp -o utrplauncher utrplauncher-UTRP.o -L/usr/local/cuda/lib64 -lcuda -lcudart -lcufft crossovers/libcrossovers.a initialisers/libinitialisers.a мутаторы/libmutators.a проблема/libproblem.a common/libcommon.a переменные/libvariables.a ../ библиотеки/рамки/libmoeaframework.a ../libraries/ticpp/libticpp.a

+0

Приведенные выше работы при связывании, однако, приводят к ошибке при компиляции объектных файлов, поскольку nvcc не распознает параметр -Wc. Есть ли способ настроить autotools для компиляции кода с помощью -Xcompiler, а затем -Wc, -Xcompiler для связывания? –

+0

@MattJohn: Позже я заметил, что вы даже можете опустить '-Wc ', и опция все еще сохраняется, поскольку она написана как' option = value' вместо 'option value' (поскольку я проверил, что он действителен для' nvcc'). Я не знаю, зарегистрировано ли это 'libtool', поэтому я не упоминал об этом. –

+0

Это работало как шарм! Благодаря :) –