1

基本上,我让编译器编译我的 .cu 文件,并且(我认为)在这些 .cu 文件中有完整的操作,但是当我尝试调用它们(kernel<<<1,1>>>(void))时,编译器会由于 CUDA 语法而注册语法错误。此外,像 cudaMalloc 这样的调用在 c 文件中也会失败。

这里有三个非常短的文件,所以我可以告诉你哪里出错了。

//kernel.cu    
#include "kernel.h"
#include <cuda.h>
#include <cuda_runtime_api.h>

__global__ int kernel(void){     
    return 5;
}

//kernel.h
#ifndef _KERNEL_h_
#define _KERNEL_h_

extern "C" int kernel(void);

#endif

//main.c
#include "kernel.h"
#include <cuda.h>
#include <cuda_runtime_api.h>

int main() {
   int* device_a;

   cudaMalloc( (void**)&device_a, sizeof(int) );

   kernel<<<1,1>>>();
}

我从一些 SDK 示例中获得了头文件。另外,我使用 CUDA 4.2 设置了我的构建配置,因此为什么 .cu 文件可以编译。如果我犯了任何偶然的语法错误,那是因为我为了发布而简化了它,而不是它实际上在源代码中,尽管请提及它以防万一。

kernel.cu 编译良好。

kernel.h 在“extern...”行有一个错误:“error C2059: syntax error: 'string'”。(这可能是因为我是从一个 c++ 示例中获取的吗?)

main.c 有一个错误:“错误 C2065:‘内核’:未声明的标识符”

和:“错误 C2059:语法错误:'<'”

但是当我注释掉内核调用时,它只是 cudaMalloc,我得到:“错误 LNK2019:未解析的外部符号 _cudaMalloc@8 在函数 _main 中引用”

和:“致命错误 LNK1120:1 个未解决的外部问题”

是 Visual Studio 2010 的东西,还是我不包括的东西?从 SDK 示例中,我无法判断我做错了什么,除此之外,我认为他们找到了一种不使用三方括号的方法(CTRL+F 没有找到任何方法)。任何帮助表示赞赏。先感谢您!

编辑:在查看了更多示例之后,他们确实使用三括号语法就好了。

编辑:对于那些使用 this 作为参考__global__函数只能返回 void。如果您像我一样尝试返回任何其他内容,您将收到编译器错误。

4

1 回答 1

3
  1. 将调用 CUDA 内核的函数放在.cu文件中。

  2. 设置 VS2010 以使用 CUDA 编译器编译 CU 文件,而不是内置编译器(使用位于 CUDA SDK 中的 CUDA 规则文件(Cuda.props、Cuda.xml、Cuda.targets))。

  3. 我建议将内核放在具有不同扩展名的文件中(例如.curnel文件),这样它们就不会被直接编译(仅在调用时)。

  4. 我建议将调用 CUDA 内核的函数声明放在.cuh文件中。

于 2012-06-04T18:25:50.347 回答