当前位置:  开发笔记 > 编程语言 > 正文

如何将CUDA代码分成多个文件

如何解决《如何将CUDA代码分成多个文件》经验,为你挑选了1个好方法。

我正在尝试将CUDA程序分成两个独立的.cu文件,以便更接近于在C++中编写真正的应用程序.我有一个简单的小程序:

在主机和设备上分配内存.
将主机阵列初始化为一系列数字.将主机阵列复制到设备阵列使用设备内核查找阵列中所有元素的平方将设备阵列复制回主机阵列打印结果

如果我把它全部放在一个.cu文件中并运行它,这很有效.当我将它分成两个单独的文件时,我开始得到链接错误.像我最近的所有问题一样,我知道这很小,但它是什么?

KernelSupport.cu

#ifndef _KERNEL_SUPPORT_
#define _KERNEL_SUPPORT_

#include 
#include 

int main( int argc, char** argv) 
{
    int* hostArray;
    int* deviceArray;
    const int arrayLength = 16;
    const unsigned int memSize = sizeof(int) * arrayLength;

    hostArray = (int*)malloc(memSize);
    cudaMalloc((void**) &deviceArray, memSize);

    std::cout << "Before device\n";
    for(int i=0;i>> (deviceArray);
    cudaMemcpy(hostArray, deviceArray, memSize, cudaMemcpyDeviceToHost);

    std::cout << "After device\n";
    for(int i=0;i

MyKernel.cu

#ifndef _MY_KERNEL_
#define _MY_KERNEL_

__global__ void TestDevice(int *deviceArray)
{
    int idx = blockIdx.x*blockDim.x + threadIdx.x;
    deviceArray[idx] = deviceArray[idx]*deviceArray[idx];
}


#endif

构建日志:

1>------ Build started: Project: CUDASandbox, Configuration: Debug x64 ------
1>Compiling with CUDA Build Rule...
1>"C:\CUDA\bin64\nvcc.exe"    -arch sm_10 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin"    -Xcompiler "/EHsc /W3 /nologo /O2 /Zi   /MT  "  -maxrregcount=32  --compile -o "x64\Debug\KernelSupport.cu.obj" "d:\Stuff\Programming\Visual Studio 2008\Projects\CUDASandbox\CUDASandbox\KernelSupport.cu" 
1>KernelSupport.cu
1>tmpxft_000016f4_00000000-3_KernelSupport.cudafe1.gpu
1>tmpxft_000016f4_00000000-8_KernelSupport.cudafe2.gpu
1>tmpxft_000016f4_00000000-3_KernelSupport.cudafe1.cpp
1>tmpxft_000016f4_00000000-12_KernelSupport.ii
1>Linking...
1>KernelSupport.cu.obj : error LNK2005: __device_stub__Z10TestDevicePi already defined in MyKernel.cu.obj
1>KernelSupport.cu.obj : error LNK2005: "void __cdecl TestDevice__entry(int *)" (?TestDevice__entry@@YAXPEAH@Z) already defined in MyKernel.cu.obj
1>D:\Stuff\Programming\Visual Studio 2008\Projects\CUDASandbox\x64\Debug\CUDASandbox.exe : fatal error LNK1169: one or more multiply defined symbols found
1>Build log was saved at "file://d:\Stuff\Programming\Visual Studio 2008\Projects\CUDASandbox\CUDASandbox\x64\Debug\BuildLog.htm"
1>CUDASandbox - 3 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我在Windows 7 64bit上运行Visual Studio 2008.


编辑:

我想我需要详细说明一点.我在这里寻找的最终结果是有一个普通的C++应用程序,其中包含Main.cpp和int main()事件,并从那里运行.在我的.cpp代码的某些点上,我希望能够引用CUDA位.所以我的想法(如果有更标准的约定,请纠正我)是我将CUDA内核代码放入他们的.cu文件中,然后有一个支持.cu文件,它将负责与设备通话并调用内核函数和什么不是.



1> Scott Wales..:

你是包括mykernel.cukernelsupport.cu,当你尝试链接编译器看到mykernel.cu两次.您必须创建一个定义TestDevice的标头并包含它.

评论:

这样的事情应该有效

// MyKernel.h
#ifndef mykernel_h
#define mykernel_h
__global__ void TestDevice(int* devicearray);
#endif

然后将包含文件更改为

//KernelSupport.cu
#ifndef _KERNEL_SUPPORT_
#define _KERNEL_SUPPORT_

#include 
#include 
// ...

重新编辑

只要你在C使用的头++代码没有任何CUDA具体的东西(__kernel__,__global__,等),你应该罚款链接C++和CUDA代码.


你的MyKernel.h应该有`void TestDeviceWrapper(dim3 grid,dim3 block,int*devicearray)`因为当KernelSupport.cu变成KernelSupport.cpp时,cl.exe将无法理解__global__语法.然后在MyKernel.cu中,`TestDeviceWrapper()`只调用`TestDevice <<< >>>`.
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有