2016-07-07 47 views
0

我有三個文件:a.cu,b.cu和c.h.我希望有所有編譯單元訪問調試變量,所以我宣佈他們在CH EXTERN,只有在a.cu定義,每個答案在這裏Global Variable within Multiple Files先前在cuda C++中定義的extern全局設備變量

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"); 
    } 
} 

CH

#ifndef MAIN_H 
#define MAIN_H 

extern __device__ bool d_debug; 
extern bool h_debug; 

#endif /* MAIN_H */ 

在生產線標記點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

您需要將設備鏈接合併到編輯序列中。否則,a.cu和b.cu具有* d_debug設備變量的*獨立*副本。這裏討論的'cuda'標籤有很多問題。 –

+0

謝謝。知道問什麼問題有很大幫助:) –

+0

這[問題](http://stackoverflow.com/questions/24617318/cuda-constant-memory-value-not-correct)和鏈接的重複項通常涵蓋相同的基礎。 '__device__'變量與'__constant__'變量具有相同類型的默認*編譯單元範圍,解決方案方法相同。 –

回答

1

從Robert Crovella的評論和這裏的答案:CUDA constant memory value not correct,問題是a.cu和b.cu有單獨的d_debug副本。爲了防止這種情況,必須使用單獨的編譯和鏈接;爲此,創建可重定位設備代碼(而不是可執行設備代碼)。

--relocatable器件用代碼{TRUE | FALSE}
-rdc啓用(禁用)的產生的重定位裝置的代碼。如果禁用,則生成可執行設備 代碼。在執行可重置設備代碼之前,必須將其鏈接到 。

此選項的允許值:true,false。

默認值:false

更改NVCC參數:

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

解決問題。