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
答案 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__
。