我已经将一个cuda项目从linux移植到了windows(基本上只是在头文件中添加了一些定义和typedef)。我正在使用visual studio 2008,以及来自SDK的cuda运行时api自定义构建规则。代码是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
关于我在这里做错了什么的想法?如何更改我的设置以便在Visual Studio中工作?理想情况下,我想要一个多平台工作的设置。
CUDA 3.2,GTX 480,64位Win7,263.06一般
答案 0 :(得分:1)
你想做什么
cudaEventStart
将被多重定义 - 在包含它的每个编译单元(.c文件)中。您需要将变量设置为static,并仅在一个编译单元中初始化它。正在发生的事情是每个编译单元都在获得cudaEventStart
的非冲突实例。
你可以做的是摆脱全局变量(使它成为main()
中的局部变量),将cudaEvent_t参数添加到需要使用该事件的函数中,然后传递事件变量。 / p>
顺便说一句,在你的第二篇文章中,你有圆形的#include
...
答案 1 :(得分:0)
我通过在标题中包含.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。