在Windows CUDA项目无效的资源

我已经问世的CUDA项目从Linux到窗口(基本上只是添加一些定义和类型定义在头文件)。 我使用Visual Studio 2008和CUDA运行时API自定义生成从SDK规则。 该代码是C,不是C ++(我编译/不TC / TP)

我有,我没有在linux下有范围的问题。 在我的头文件中全局变量不是.c文件和文件.CU之间共享。

我创建了一个简单的项目,这里是所有的代码:

main.h:

#ifndef MAIN_H #define MAIN_H #include <stdio.h> #include <cuda.h> #include <cuda_runtime.h> cudaEvent_t cudaEventStart; #if defined __cplusplus extern "C" void func(void); #else extern void func(void); #endif #endif

main.c中:

#include "main.h" int main(void) { int iDevice = 0; cudaSetDevice(iDevice); cudaFree(0); cudaGetDevice(&iDevice); printf("device: %d\n", iDevice); cudaEventCreate(&cudaEventStart); printf("create event: %d\n", (int) cudaEventStart); func(); cudaEventDestroy(cudaEventStart); printf("destroy event: %d\n", (int) cudaEventStart); return cudaThreadExit(); }

kernel.cu:

#include "main.h" void func() { printf("event in cu: %d\n", (int) cudaEventStart); }

输出:

device: 0 create event: 44199920 event in cu: 0 event destroy: 441999920

关于我做错了什么在这里的任何想法? 如何我需要改变我的设置,使工作在视觉工作室? 理想情况下,我想的作品多平台的设置。

CUDA 3.2,GTX 480,64位的Win7,263.06一般

--------------解决方案-------------

你所要做的

  1. 不会没有CUDA连工作 - 尝试重命名kernel.cu到kernel.c并重新编译。 你会得到一个链接错误,因为cudaEventStart将被多次定义-在每个编译单元(.c文件),其中包括它。 您需要做的静态变量,并且只在一个编译单元初始化。
  2. 编译CUDA中因为CUDA没有接头,因此在由NVCC(.CU文件)编译编译单元的代码不能引用其它编译单元的符号。 CUDA不支持静态当前全局变量。 在未来的CUDA将有一个连接体,但目前没有。

正在发生的事情是每个编译单元越来越自身,不冲突的情况下cudaEventStart

你可以做的就是摆脱全局变量(使其在局部变量main()加cudaEvent_t参数,需要使用的事件,然后通过周围的事件变量的函数。

顺便说一句,在你的第二个职位,你有圆形#include小号...

所以,你所提出的建议,这个例子:

#include <cstdio>

int main(void)
{
int iDevice = 0;
cudaSetDevice(iDevice);
cudaFree(0);
cudaGetDevice(&iDevice);
printf("device: %d\n", iDevice);

cudaEvent_t cudaEventStart;
cudaEventCreate(&cudaEventStart);
printf("create event: %d\n", (int) cudaEventStart);

cudaEventDestroy(cudaEventStart);
printf("create destroy: %d\n", (int) cudaEventStart);

return cudaThreadExit();
}

将失败在你的Windows中? 如果是这样,你可能已经发现了一个bug。 什么是您使用的驱动程序吗?

编辑:这一定是一个符号的范围问题。 尝试在一个编译文件中定义的事件,并通过引用传递它的其他职能。

我通过包括在标题中的.CU文件并除去.CU文件函数的前向声明修改了简化例子(成功)。

main.h:

#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime.h>

#include "kernel.cu"

cudaEvent_t cudaEventStart;

main.c中:

#include "main.h"

int main(void)
{
int iDevice = 0;

cudaSetDevice(iDevice);
cudaFree(0);
cudaGetDevice(&iDevice);
printf("device: %d\n", iDevice);

cudaEventCreate(&cudaEventStart);
printf("create event: %d\n", (int) cudaEventStart);

func();

cudaEventDestroy(cudaEventStart);
printf("destroy event: %d\n", (int) cudaEventStart);

return cudaThreadExit();
}

kernel.cu:

#ifndef KERNEL_CU
#define KERNEL_CU

#include "main.h"

void func(void);

void func()
{
printf("event in cu: %d\n", (int) cudaEventStart);
}

#endif

输出:

device: 0
create event: 42784024
event in cu: 42784024
event destroy: 42784024

要看看它是否工作在我的实际项目中,以及是否解决方案是便携式回Linux操作系统。

分类:CUDA 时间:2015-03-15 人气:0
本文关键词: CUDA
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.229 (s). 10 q(s)