Как сделать объектный файл CUDA со связью C?

Я пытаюсь включить некоторый код CUDA в C-проект. Для этого я собираю исходный код CUDA (файл .cu) в статическую библиотеку (.lib, я разрабатываю в Windows). Затем я хочу связать эту статическую библиотеку с моим C-проектом. Тем не менее, мой компоновщик жалуется на этот шаг, и я полагаю, что это связано с проблемой компоновки C / C ++. Конкретные ошибки, которые я получаю, выглядят примерно так:

 Undefined symbol '_cudaMallocHost@8' referenced in "cufft object file.lib".

Я использую CUDA 5.0 и работаю в Visual Studio 10 для написания и компиляции исходного кода CUDA на компьютере с Windows 7.

Во-первых, у меня есть исходный файл .cu, который прекрасно компилируется в статическую библиотеку («cufft object file.lib»). Я завернул все это в extern C { }, Это выглядит примерно так:

extern "C" {

#include <cuda.h>
#include <cufft.h>

int myCUDAfunction()
{
//Some CUDA code
}

}

Для этого я создал заголовочный файл со списком функций, определенных в источнике .cu («myCUDAheader.h»), содержимое которого представляет собой просто серию прототипов функций:

int myCUDAfunction();

так далее

Наконец, в моем C-проекте я добавляю статическую библиотеку и включаю заголовочный файл.

Прежде чем я начал объявлять функции в исходном .cu файле CUDA с extern "C"компоновщик пожаловался на отсутствие символов для этих функций. Теперь они должны быть правильно скомпилированы для связи C, но фактические функции CUDA (такие как cudaMalloc), кажется, все еще есть связь C ++. Как мне обойти это?

1

Решение

Вы включили заголовки CUDA и связали cudart.lib с вашим C-приложением? Если нет, то вам, вероятно, потребуется сделать это, поскольку ваша статическая библиотека не будет включать фактическую реализацию библиотеки CUDA. Кроме того, я думаю, что порядок, в котором вы связываете их, имеет значение, я не могу вспомнить, если это ваша библиотека, затем cudart.lib или наоборот. Если худшее приходит к худшему, вам, возможно, придется настроить свой проект C как проект CUDA.

2

Другие решения

Вы не можете изменить связь библиотек CUDA, но вам это и не нужно. Итак, это:

extern "C" {

#include <cuda.h>
#include <cufft.h>

int myCUDAfunction();

.....

}

неверно, потому что вы заявляете, что библиотека времени выполнения CUDA имеет связь C, хотя, вероятно, ее нет. Это было бы правильно:

#include <cuda.h>
#include <cufft.h>

extern "C" {

int myCUDAfunction();
.....

}

Сюда myCUDAfunction имеет связь с C и будет связываться при вызове из кода, скомпилированного и связанного с помощью цепочки инструментов C. Весь смысл в том, чтобы предоставить функции вызываемой оболочки C для ваш Код CUDA и библиотечные функции, которые он вызывает. Таким образом, ваш код на C может быть полностью неосведомлен об основах C ++ кода CUDA.

6

По вопросам рекламы [email protected]