Windows cuda项目中的资源无效

时间:2011-05-16 19:19:57

标签: cuda

我已经将一个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一般

2 个答案:

答案 0 :(得分:1)

你想做什么

  1. 即使没有CUDA也行不通 - 尝试将kernel.cu重命名为kernel.c并重新编译。您将收到链接器错误,因为cudaEventStart将被多重定义 - 在包含它的每个编译单元(.c文件)中。您需要将变量设置为static,并仅在一个编译单元中初始化它。
  2. 在CUDA中编译因为CUDA没有链接器,因此由nvcc(.cu文件)编译的编译单元中的代码不能引用其他编译单元中的符号。 CUDA目前不支持静态全局变量。在未来,CUDA将有一个链接器,但目前它没有。
  3. 正在发生的事情是每个编译单元都在获得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。