2012-05-07 2 views
1

Мое приложение использует ядра CUDA для большей части вычислений. По уважительным причинам (вне сферы действия этого вопроса) я использую общую модель объекта/связывания для динамической загрузки объектных файлов, каждая из которых содержит 1 главную функцию и 1 ядро ​​CUDA. Поскольку ядра не могут быть extern базовая структура такого ядра является:Являются ли CUDA CUBIN объектами обратной совместимости?

__global__ kernel() { ...code... } 

extern "C" void call_kernel() { 
    <<<GRID,BLOCK,SHMEM>>>kernel(); 
} 

Я использую функцию хоста, единственной целью которого является вызвать ядро. Для построения общего объекта я использую:

nvcc -arch=sm_20 -m64 --compiler-options -fPIC,-shared -link -o kernel0.o kernel0.cu 

Все приложение использует много этих ядер, и они загружаются с dlopen(). Все это прекрасно работает, если на одной машине остается все (строительство/загрузка/выполнение).

Но когда я компилирую/создаю общие объекты, скажем, на машине B (cuda 4.1, NVIDIA C2050) и dlopen их позже машина A (cuda 4.0, GTX 480) вычисление не дает такого же результата, как если бы общие объекты также были построены на машине A.

Это звучит странно для меня. Нет ли объекта CUBIN, встроенного в файл .o, который содержит инструкции, которые не зависят от конкретной архитектуры графического процессора?

Я знаю, что рекомендуется использовать ту же версию компилятора для построения и компоновки. Опять же, у меня есть веские причины, по которым нельзя создавать общие объекты на том же компьютере, на котором они выполняются.

ответ

3

Я предполагаю, что первое, что нужно сделать, это то, что вы вообще не используете файлы CUBIN в своем приложении, вы используете бинарные объекты CUDA. Две вещи не то же самое.

Но это не является источником вашей проблемы. Ваша проблема связана с библиотекой времени выполнения CUDA. API-интерфейс runtime поддерживается версией, и любой код, скомпилированный для данной версии API для запуска, должен быть запущен с этой версией. Кроме того, версии библиотеки API runtime имеют минимальные требования к версии драйвера. Вы не можете использовать приложение, созданное против библиотеки CUDA 4.1, и планируете запустить его на компьютере с библиотекой CUDA 4.0. Рекомендуемый способ распространения API-интерфейсов NVIDIA - это распространять библиотеку API среды выполнения (libcudart) с вашим приложением и указывать минимальную версию драйвера, которую требует ваш код. Это гарантирует, что приложение будет работать правильно (минимальная версия драйвера приносит минимальную версию API драйверов CUDA, а библиотека API распределенной среды выполнения дополняет требования).

Альтернативой было бы действительно использовать кубиновые файлы и использовать API-интерфейс драйвера CUDA. Он гораздо более портативен (в пределах минимальных требований к версии драйвера), но он также больше работает в вашем хост-коде. Выбор ваш.

+0

Правильно, я использовал слово CUBIN синонимом для «любых скрытий в файле .o». Хорошо, хорошо. Наверное, я перейду на API-интерфейс драйвера. Благодаря! – ritter

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