我已经从linux移植了一个cuda项目到windows(基本上只是在头文件中添加了几个定义和typedefs)。我使用Visual Studio 2008,以及SDK中的cuda运行时api自定义构建规则。代码是C,而不是C++(我正在编译/ TC不是/ TP)windows cuda项目中的无效资源
我遇到了我在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
有关我在做什么错的任何想法吗?我该如何改变我的设置才能在Visual Studio中使用?理想情况下,我想要一个多平台的设置。
CUDA 3.2,GTX 480,64位的Win7,263.06一般
@harrism感谢这一点。你暗示这个设置无论如何都不会起作用,但它在我的linux版本中起作用。其次,请不要包括警卫阻止通知包括?事实上,在我的真实项目中,头球也包括守卫。 – jmilloy 2011-05-17 03:02:13
@harrism包括卫兵在linux和visual studio中的工作方式可能不同吗?也许在visual studio中,nvcc无法从cl.exe中看到定义,反之亦然,导致两个cudaEventStart实例。而在Linux中,守卫在两个编译器上都能工作,防止所有全局变量的双重实例? – jmilloy 2011-05-17 03:07:11
我不是暗示,我说。 :)目前,您不能以这种方式在CUDA编译单元和C++编译单元之间共享全局变量。如果您按照我的建议将kernel.cu重命名为kernel.c,您将*从g ++中得到如下链接器错误:“ld:duplicate symbol _foo in ...”。 至于通知包括,它可能会工作,但它不是一个好的编程习惯。另外,请注意,在任何编译器中,包括守护程序都不能在编译单元中工作,它们只会阻止两次将相同的头文件包含到同一个编译单元中。每个.c或.cu文件都是一个单独的编译单元。 – harrism 2011-05-17 03:22:02