我有三个文件: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
为什么它不像全局主变量那样工作?我应该如何创建一个可供所有编译单元访问的全局设备变量?
答案 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
解决了这个问题。