【问题标题】:Cannot place kernel's prototype in header无法将内核的原型放在标题中
【发布时间】:2015-07-04 06:23:03
【问题描述】:

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

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

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

nvcc main.c io.o -o main nvcc 警告:“compute_10”和“sm_10” 不推荐使用架构,并且可能会在将来的版本中删除。 在 main.c:1:0 中包含的文件中:io.cuh:12:12: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘void’ global void transformToGrayKernel(rgb_image *img); ^ makefile:6: 目标 'main' 的配方失败 make: *** [main] 错误 1

【问题讨论】:

  • C 函数默认不是全局的吗?
  • @WeatherVane 在 CUDA 中,'global' 属性是在 GPU 上运行并从主机调用的函数的标签,所以我不认为它是多余的。
  • 不要在 main.c 中包含包含 CUDA 的标头。 C 编译器不理解它。
  • @talonmies 我知道。 main.c 文件中没有“cuda.h”。

标签: c cuda makefile


【解决方案1】:

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

那是因为编译器nvcc会解释它的输入文件,并选择相应的规则来编译它。虽然你使用 nvcc 来编译“main.c”,但它会被当作 C 源文件,而不是 CUDA 源代码。所以编译器在编译“main.c”文件时无法识别CUDA关键字__global__

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

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2013-06-21
    相关资源
    最近更新 更多