Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设置代码/VS10以识别.c文件中的CUDA函数调用?_C_Visual Studio 2010_Build_Compiler Errors_Cuda - Fatal编程技术网

如何设置代码/VS10以识别.c文件中的CUDA函数调用?

如何设置代码/VS10以识别.c文件中的CUDA函数调用?,c,visual-studio-2010,build,compiler-errors,cuda,C,Visual Studio 2010,Build,Compiler Errors,Cuda,基本上,我让编译器编译我的.cu文件,并且(我认为)在这些.cu文件中有完整的操作,但是当我尝试调用它们时(kernel(void)),编译器会注册由于CUDA语法而导致的语法错误。此外,像cudamaloc这样的调用在c文件中失败 这里有三个很短的文件,所以我可以告诉你哪里出错 //kernel.cu #include "kernel.h" #include <cuda.h> #include <cuda_runtime_api.h> __global__ i

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

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

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

__global__ int kernel(void){     
    return 5;
}

//main.c
#包括“kernel.h”
#包括
#包括
int main(){
int*设备_a;
Cudamaloc((void**)和设备_a,sizeof(int));
内核();
}
我从一些SDK示例中获得了头文件。此外,我的构建配置设置为CUDA 4.2,因此.cu文件可以编译。如果我偶然犯了语法错误,那是因为我为了发布而简化了它,而不是因为它实际上在源代码中,尽管为了以防万一请提及它

kernel.cu编译得很好

h有一个错误:“错误C2059:语法错误:'string'”在“extern…”行上。(这是因为我从C++例子中得到的吗?)< /P> c有一个错误:“错误C2065:‘内核’:未声明的标识符”

和:“错误C2059:语法错误:”
  • 将调用CUDA内核的函数放入.cu文件中

  • 将VS2010设置为使用CUDA编译器而不是内置编译器编译CU文件(使用CUDA SDK中的CUDA规则文件(CUDA.props、CUDA.xml、CUDA.targets))

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

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


  • 搜索结果产生了这个指南(我没有读过,所以我对它的正确性不承担任何责任):我想,我已经设置了编译配置,可以用CUDA编译器编译.cu文件。我在.cu文件中放了一个调用内核的函数,但该函数的括号中仍然有语法错误。在我看来,.cu和.c文件似乎互不了解,因为即使在.cu文件编译时,主要的乐趣还是存在的Action无法调用.cu和.c文件中的普通c函数。这些.cu和.c文件应该只看到它们在includes部分中引用的.cuh和.h文件。链接器将它们连接起来。添加35; ifdef CUDACC(不记得确切的语法-检查SDK)请在每个.cu文件的上方单击以确保编译定义正确。@EricThoma:您是否记得为.cu文件中的函数创建一个头文件并#将其包含在您的.c文件中?@EricThoma:Re.语法错误,只要该文件编译.VC++就可以像检查.c文件一样检查该文件的语法错误。您可以可以让它保持原样,但如果您想修复它:您如何成功编译并运行内核不会返回void?我没有。这是我后来发现的另一个缺陷。不过它注册了一个非常明显的编译器错误。
    //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>>>();
    }