如何在包含.cpp文件中main()的cuda项目中使用cuPrintf?

时间:2012-04-30 04:21:51

标签: cuda g++ sdl nvcc

所以我正在尝试加速一些碰撞检测代码,该代码使用SDL在Mac OS X中将一些碰撞球绘制到表面/窗口。我可以完成碰撞并以顺序方式绘制内容。我希望能够使用cuPrintf调试cuda版本,但由于我的main()不在.cu文件中,所以我无法使用它。所以我无法初始化cuPrintf,也无法打印缓冲区。如果我创建一对extern“C”函数并将它们构建到.cpp文件中,我什么也得不到。如果我尝试将包装函数放在.cu文件中,并使用其余的cuda代码,我会得到一个“错误:不支持使用外部函数...”。 我已经在较小的项目中使用它,所有内容都在一个大的.cu文件中,并且效果很好。但这次我不能这样做,因为我必须将SDL和cuda代码分开,SDL也必须进入main()。

其他人有过这个问题吗?

1 个答案:

答案 0 :(得分:1)

我基本上为cuPrintf提供的3个调用创建了一个包装器,需要放在main函数中。在我的kernel.cu文件中,我定义了一些extern“C”函数。然后在main.cpp中我声明它们将它们放在范围内。

在kernel.cu中:

// Include section
#include "cuPrintf.cu"

//define all __device__ and __global__ functions for the kernel here
extern "C"
{
void LaunchKernel(<type> *input) { kernel<<< grid, dim >>>(input); }

void InitCuPrintf() { cudaPrintfInit(); }

void DisplayCuPrintf() { cudaPrintfDisplay(stdout, 1); }

void EndCuPrintf() { cudaPrintfEnd(); }
}

在main.cpp中:

// you do NOT need to include any cuPrintf files here. Just in the kernel.cu file
#include <SDL.h>  // this is the library requiring me to do this stuff ...
#include "SDL_helper.h"  // all of the SDL functions I defined are separated out
#include <cuda_runtime.h>

// in global space
extern "C" {
void LaunchKernel(struct circle *circles);
void InitCuPrintf();
void DisplayCuPrintf();
void EndCuPrintf();
}

int main(nt argc, char **argv)
{
    // put these where you would normally place the cuPrintf functions they correspond to
    InitCuPrintf();

    // I left his in here because if you're needing to do this for cuPrintf, you prolly need
    // need a wrapper to lauch your kernel from outside the .cu file as well.
    LaunchKernel( input );

    DisplayCuPrintf();

    // SDL functions from SDL.h and SDL_helper.h would be in here somewhere

    EndCuPrintf()
}

就是这样!我在我的项目目录中制作了cuPrintf.cu和cuPrintf.cuh的副本,所以我没有必要链接到编译中的一些随机目录。我的nvcc / g ++命令如下。我在MAC上编码,因此它们是特定于Mac OS X的......

nvcc ./kernel.cu -I./ -I/usr/local/cuda/include/ -c -m64
g++ ./main.cpp -I./ -I/usr/include/ -I/usr/local/cuda/include/ -L/usr/local/cuda/lib/ -lcudart -LSDLmain -lSDL -framework Cocoa ./SDL_helper.o ./kernel.o

注意:我将所有SDL函数分离为一个单独的SDL_helper.c文件,我在运行nvcc之前编译了

g++ ./SDL_helper.c -I./ -c

我希望这有助于其他人。