Вызов кода CUDA из обычного кода C ++ - сортировка внешнего "C" - PullRequest
5 голосов
/ 04 ноября 2010

Я пытаюсь вызвать функцию CUDA (хоста) из файла C ++, скомпилированного отдельно:

sample.cpp Файл C ++:

extern "C" void cuda_function(int a, int b);
int main(){
  //statements
  cuda_function(23, 34);
  //statements
}

cuda.cu файл:

#include <cuda.h>
__global__ void kernel(int a, int b)
{
  //statements
}
void cuda_function(int a, int b){
  //cuda_function
}

Команды сборки:

g++ -c sample.cpp
nvcc -c cuda.cu
nvcc -o sample sample.o cuda.o

Но это дает ошибку компоновщика:

sample.o: In function `main':
sample.cpp:(.text+0x163): undefined reference to `cuda_function'
collect2: ld returned 1 exit status

Что не так в этом методе интеграции C ++ и CUDA?

1 Ответ

11 голосов
/ 05 ноября 2010

Вы объявили cuda_function() как extern "C", но затем определили его с помощью C ++. Удалите extern "C" из вашего delcaration, и он будет работать.

В качестве альтернативы, но бессмысленно, вы можете добавить такое же объявление в файл cuda.cu.

Чтобы уточнить, nvcc - это оболочка, которая разбивает файл на код хоста и код устройства, а затем вызывает компилятор хоста и компилятор устройства соответственно. В старые времена программирования на CUDA nvcc вызывал компилятор хоста в режиме «C», что означало, что вам нужно было поставить extern "C" на делкарации при вызове из C ++. Возвращаясь к настоящему времени, nvcc по умолчанию использует C ++ для хост-кода, что означает, что вам не нужны эти внешние объекты (если, конечно, остальная часть вашего хост-кода не находится в C).

...