Мое приложение использует ядра 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
, который содержит инструкции, которые не зависят от конкретной архитектуры графического процессора?
Я знаю, что рекомендуется использовать ту же версию компилятора для построения и компоновки. Опять же, у меня есть веские причины, по которым нельзя создавать общие объекты на том же компьютере, на котором они выполняются.
Правильно, я использовал слово CUBIN синонимом для «любых скрытий в файле .o». Хорошо, хорошо. Наверное, я перейду на API-интерфейс драйвера. Благодаря! – ritter