以前在cuda c ++

时间:2016-07-07 16:25:26

标签: c++ cuda global-variables header-files

我有三个文件:a.cu,b.cu和c.h.我希望所有编译单元都可以访问调试变量,所以我在c.h中将它们声明为extern,并且仅在a.cu中定义,根据Global Variable within Multiple Files的答案:

  

a.cu

#include "c.h"
#include <stdio.h>
#include <iostream>

bool h_debug;                                                                       //works fine
//__device__ bool d_debug;                     //POINT A

int main(int argc, char* argv[])
{
    h_debug = (argc > 1 ? true : false);
    std::cout<<"Host: "<<(h_debug ? "true" : "false")<<std::endl;
    cudaMemcpyToSymbol(d_debug, &h_debug, sizeof(bool));  
    std::cout<<cudaGetErrorString(cudaGetLastError())<<std::endl; 
    cudaDeviceSynchronize();
}
  

b.cu

#include "c.h"
#include "stdio.h"

__global__ 
void myKernel(){
    if(d_debug){
        printf("device debug on\n");
    }
    else{
        printf("device debug off\n");
    }
}
  

c.h

#ifndef MAIN_H
#define MAIN_H

extern __device__ bool d_debug;
extern bool h_debug;

#endif  /* MAIN_H */

在标记为POINT A的行中,如果我对其进行了注释,则代码会编译,但在运行时会出现cuda错误,正如人们所预料的那样:

$ nvcc a.cu b.cu -o globalTest
$ globalTest
Host: true
invalid device symbol

如果我取消注释该行以定义d_debug,我会收到一个对我没有意义的编译错误...

$ nvcc a.cu b.cu -o globalTest
a.cu:1:32: warning: unknown option after ‘#pragma GCC diagnostic’ kind [-Wpragmas]
a.cu:6:13: error: redefinition of ‘bool d_debug’
c.h:4:13: error: ‘bool d_debug’ previously declared here

为什么它不像全局主变量那样工作?我应该如何创建一个可供所有编译单元访问的全局设备变量?

1 个答案:

答案 0 :(得分:1)

来自Robert Crovella的评论和答案:CUDA constant memory value not correct,问题是a.cu和b.cu有d_debug的单独副本。为防止这种情况,必须使用单独的编译和链接;为此,创建可重定位的设备代码(而不是可执行的设备代码)。

  

- relocatable-device-code {true | false}
  -rdc启用(禁用)可重定位设备代码的生成。如果禁用,则执行设备   代码生成。可重定位设备代码必须在它之前链接   可以执行。

     

此选项的允许值:true,false。

     

默认值:false

将nvcc参数更改为:

nvcc -rdc=true a.cu b.cu -o globalTest

解决了这个问题。