Cuda смешанная связь C проекта - PullRequest
2 голосов
/ 18 февраля 2012

У меня большой проект на C, и я пытаюсь интегрировать в него некоторые ядра Cuda.Я компилирую мои c-файлы с помощью "gcc -c main.c", а мои .cu файлы с помощью "nvcc -c cuda_GMRES.cu", а затем пытаюсь связать 2 объектных файла с помощью nvcc: "nvcc -o main.o cuda_GMRES.o "и получите следующую ошибку:

/ usr / lib / gcc / x86_64-redhat-linux / 4.1.2 /../../../../ lib64 / crt1.o: В функции _start': (.text+0x20): undefined reference to main 'collect2: ld вернул 1 состояние выхода

Я впервые пытаюсь объединить cuda с файлами C, и я мог сделать что-то не так. Может кто-нибудь помочь мне, пожалуйста.Я нахожусь на кластере GPU с ОС Rocks.

Мой файл main.c:

#include <stdio.h>
#include <math.h> 
#include "cuda_wrapper.h"   //header containing wrapper function
//cuda_GMRES that calls the kernel   cuda_dot

int main (int argc,char* argv[])
{
//content  
//bla bla bla
//cuda Function call  
  cuda_GMRES(50); 
   return 0;
}

Мой файл cuda_wrapper.h:

#ifndef Cuda_GMRES_cuda_wrapper_h
#define Cuda_GMRES_cuda_wrapper_h
//wrapper function declaration

void cuda_GMRES(double a);
#endif

Мой cuda_GMRES.Файл cu, содержащий функцию вызова ядра:

#include <stdio.h>
#include "cuda_wrapper.h"
#include "cuda_dot.cu"   

//kernel declaration
__global__ void cuda_dot();

//kernel calling function
extern "C"
void cuda_GMRES(double a)
{
double b;

double *dev_a;
double *res;

cudaMemcpy(dev_a, &a, sizeof(double), cudaMemcpyHostToDevice );
cuda_dot<<< 1, 1 >>>(*dev_a, res );
cudaMemcpy(&b, res, sizeof(double), cudaMemcpyDeviceToHost );
}    

Мой файл cuda_dot.cu, содержащий ядро:

__global__ void cuda_dot(double a, double *help)
{
   *help=2*a;
}

1 Ответ

4 голосов
/ 18 февраля 2012

Ваша команда связывания содержит фатальную ошибку.Предположим, вы сначала скомпилировали два объекта, например:

gcc -c main.c
nvcc -c cuda_GMRES.cu 

, у вас должно быть два объектных файла main.o и cuda_GMRES.o.Затем вы делаете это:

nvcc -o main.o cuda_GMRES.o

Эта команда говорит "связать программный файл с именем main.o, используя cuda_GMRES.o", т.е.перезаписать main.o.Именно по этой причине компоновщик жалуется на отсутствующую основную подпрограмму, вы не предоставляете ее (и одновременно уничтожаете объектный файл, в котором она есть).

Вы хотите что-то вроде этого:

nvcc -o executable main.o cuda_GMRES.o

, где executable - это имя последней связанной программы, или

nvcc main.o cuda_GMRES.o

, которая будет генерировать связанную по умолчанию программу под названием a.out

...