2015-05-14 3 views
1

Я пытаюсь собрать и связать .c и .CU файлы и я получаю предупреждениеКомпиляция и компоновка чистого C и CUDA код [предупреждение: неявная декларация функции]

warning: implicit declaration of function 

У меня есть функция в .cu-файл, который мне нужно вызвать из файла .c. Файл .c скомпилирован с использованием файлов gcc и .cu, скомпилирован с использованием nvcc-компилятора. Поскольку файл заголовка для файла .cu содержит встроенные типы данных cuda, я не могу включить это в файл .c. Я все еще могу скомпилировать и связать все файлы, но я хочу избавиться от предупреждения, которое я не могу. Базовая структура кода:

gpu.cu 
    void fooInsideCuda(); 

cpu.c 
    fooInsideCuda(); //calling function in gpu.cu 

Любая помощь или предложение были бы высоко оценены.

+3

На первый взгляд вы можете просто использовать 'extern void fooInsideCuda (void);' либо в 'cpu.c', либо в заголовке, который он включает. В идеале заголовок (возможно, новый) будет использоваться в 'gpu.cu', а также в' cpu.c' для обеспечения перекрестной проверки. –

ответ

1

эта ссылка: https://devtalk.nvidia.com/default/topic/388072/calling-cuda-functions-from-a-c-file/

отвечает на ваш вопрос:. в основном:

в .c файле

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <cuda.h> 

extern void kernel_wrapper(int *a, int *b); 

int main(int argc, char *argv[]) 
{ 
    int a = 2; 
    int b = 3; 

    kernel_wrapper(&a, &b); 
    return 0; 
} 

и в файле .CU;

__global__ void kernel(int *a, int *b) 
{ 
    int tx = threadIdx.x; 

    switch(tx) 
    { 
    case 0: 
    *a = *a + 10; 
    break; 
    case 1: 
    *b = *b + 3; 
    break; 
    default: 
    break; 
    } 

} 

void kernel_wrapper(int *a, int *b) 
{ 
    int *d_1, *d_2; 

    dim3 threads(2, 1); 
    dim3 blocks(1, 1); 

    cudaMalloc((void **)&d_1, sizeof(int)); 
    cudaMalloc((void **)&d_2, sizeof(int)); 

    cudaMemcpy(d_1, a, sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(d_2, b, sizeof(int), cudaMemcpyHostToDevice); 

    kernel<<< blocks, threads >>>(a, b); 

    cudaMemcpy(a, d_1, sizeof(int), cudaMemcpyDeviceToHost); 
    cudaMemcpy(b, d_2, sizeof(int), cudaMemcpyDeviceToHost); 

    cudaFree(d_1); 
    cudaFree(d_2); 
} 

то .h файл похож на это:

#ifndef __B__ 
#define __B__ 

#include "cuda.h" 
#include "cuda_runtime.h" 

extern "C" void kernel_wrapper(int *a, int *b); 
#endif 

также отметить, что .cu компилятор использует C++ условности

так будет нужно что-то вроде следующего в файле .CU:

extern "C" void A(void) 
{ 
    ....... 
} 

так конвенции 'C' используются

+0

Это сработало, больше никаких предупреждений, спасибо! – anupshrestha

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