无法将内核的原型放入标题中

时间:2015-04-25 16:45:24

标签: c cuda makefile

io.cuh:

#ifndef IO_CUH
#define IO_CUH

#include <cuda.h>

typedef struct{
    unsigned width;
    unsigned height;
    unsigned char *image; //RGBA
}rgb_image;

__global__ void transformToGrayKernel(rgb_image *img);
void decodeTwoSteps(const char* filename, rgb_image *img);
void encodeOneStep(const char* filename, rgb_image *img);
void processImage(const char *filename, rgb_image *img);

#endif // IO_CUH

我尝试使用以下makefile编译简单程序:

lodepng.o: lodepng.h
        cc -c lodepng.c -o lodepng.o
io.o: io.cuh lodepng.o
        nvcc -c io.cu -o io.o
main: io.o
        nvcc main.c io.o -o main

&#39; main.c中&#39;使用io.cu中的一个函数,它依赖于lodepng.c。

在引用代码的一些小警告之后,我收到以下错误:

  

nvcc main.c io.o -o main nvcc警告:&#39; compute_10&#39;和&#39; sm_10&#39;   架构已弃用,可能会在将来的版本中删除。   在main.c中包含的文件中:1:0:io.cuh:12:12:错误:预期'=',   在'void'全局之前',',';','asm'或'属性'   transformToGrayKernel(rgb_image * img);               ^ makefile:6:目标&#39;主要&#39;的配方失败了:*** [主要]错误1

1 个答案:

答案 0 :(得分:2)

错误是由关键字__global__引起的,而不是内核的原型。

那是因为编译器nvcc将解释其输入文件,并选择相应的规则来编译它。虽然您使用nvcc编译&#34; main.c&#34;,但它将被视为C源文件,而不是CUDA源代码。因此编译器在编译文件&#34; main.c&#34;时无法识别CUDA关键字__global__

您可以从&#34; main.c&#34;更改文件类型to&#34; main.cu&#34;,它将被视为CUDA源代码。然后编译器可以识别关键字__global__