2013-04-17 4 views
4

Я пишу моделирование молекулярной динамики, и некоторые ядра будут вычисляться с помощью CUDA. Я начал свой код с простой реализации ЦП с использованием некоторых возможностей C++ 11. Теперь, когда мне нужно добавить код CUDA, мне нужно использовать компиляторы, которые не поддерживают функции C++ 11 (gcc < = 4.6).Объединение MPI с C++ 11 и CUDA

В моем файле makefile я создаю объекты из всех cpp-файлов отдельно и связывая их все вместе в конце. Кроме того, мой код разбивается таким образом, что можно было бы компилировать детали без CUDA с «современным» компилятором, а остальное (используя CUDA) со старым компилятором.

Мой вопрос сейчас, если это нормально, или если бы я мог/мог столкнуться с проблемами с этим путем?

+0

Быстрое примечание: вы можете использовать более свежие версии 'gcc' с CUDA (например, я использую' gcc' 4.7.2 с CUDA 5.0). Однако, как вы сказали, вы не сможете использовать функции C++ 11 в коде, обработанном 'nvcc'. – BenC

+0

Насколько я знаю, это связано с изменением файла заголовка CUDA, но у меня нет доступа для записи к этим файлам на кластерах. – vivaeltopo

+0

Да, это хорошая настройка. Я использую его для всего моего кода (не из-за C++ 11, а для того, чтобы иметь возможность комбинировать мой код хоста с любыми библиотеками, которые могут плохо взаимодействовать с предварительной обработкой CUDA). – tera

ответ

1

Я не знаю о Cuda, но я знаю, что связывание объектных файлов C++ 98 и C++ 11 очень опасно, поскольку экземпляры шаблонов выделяются только один раз в финальный исполняемый файл. Дело в том, что ABI, возможно, изменился.

Я столкнулся с этой проблемой с std::complex<double>::real() и g ++. Один из двух экземпляров возвращал указатель на double, а другой - double. Линкером выбрано только одно из двух экземпляров (тот, который возвращает сразу два) в конечный исполняемый файл, а вызывающий C++ 98-код впоследствии ошибочно принимается в качестве указателей, что приводит к segfault.

Для почему это произошло, просто посмотреть в <complex>: В зависимости от Wheter __cplusplus >= 201103L или нет, real() либо объявлен следующим образом:

constexpr _Tp real(); 

или так:

const _Tp& real() const { return _M_real; } 

I сомневаюсь, что примеров больше, чем просто std::complex.

Смежные вопросы