Скажите NVCC, чтобы НЕ выполнялась предварительная обработка кода хоста, чтобы избежать переопределения BOOST_COMPILER.

У меня есть .cu-файл, содержащий код хоста и устройства:

// device code
__global__ void
myKernel() { ... }

// host code
#include <boost/thread/mutex.hpp>

boost::mutex myMutex;

int main() { ... }

Как видите, я включаю мьютекс-функции boost. Когда я компилирую файл, я получаю сообщение об ошибке из-за следующего предупреждения:

warning C4005: 'BOOST_COMPILER': Macro-Redefinition c:\boost\include\boost-1_49_0\boost\config\compiler\visualc.hpp

Поэтому я предполагаю, что nvcc выполняет всю предварительную обработку как для кода устройства, так и для кода хоста. Прав ли я, и если да, то как этого избежать и передать также предварительную обработку в cl.exe (MSVC 2010, Win7)?

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


person morph    schedule 18.07.2012    source источник


Ответы (1)


Это известное ограничение nvcc (технически cudafe, я думаю). nvcc использует расширение файла, чтобы определить, должен ли данный исходный файл обрабатываться для кода устройства или передаваться препроцессорам CUDA, а затем компилятору устройств. Эта траектория компиляции не может правильно проанализировать некоторые из очень сложных объявлений, которые содержит boost, и компиляция завершается ошибкой.

Решение состоит в том, чтобы не импортировать заголовки boost внутри файла .cu. Поместите код повышения хоста в файл .cc, код устройства и запуск ядра в отдельный файл .cu и сделайте несколько тонких оболочек для доступа к вызовам ядра из файла .cc. Вы по-прежнему можете передать весь исходный код в nvcc для компиляции, но отделение импорта boost от кода устройства устраняет проблему, связанную с тем, что внешний интерфейс задыхается от объявлений boost.

person talonmies    schedule 18.07.2012
comment
Спасибо, что ответили на мой вопрос! У меня есть связанная проблема с поверхностной ссылкой: я вызову cudaBindSurfaceToArray в хост-коде (.cc-файл) и использую его с surf3Dread в ядре (.cu-файл). Как я могу поделиться этой ссылкой? Я могу только определить поверхность‹void, cudaSurfaceType3D› в коде устройства, но тогда я не мог использовать его в коде хоста. Если я включу файл .hpp, который определяет ссылку на поверхность, в файл .cu, я снова получаю ошибку BOOST... - person morph; 18.07.2012