我有三個文件: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
爲什麼ñ像全局主機變量一樣工作?我應該如何創建一個可由所有編譯單元訪問的全局設備變量?
您需要將設備鏈接合併到編輯序列中。否則,a.cu和b.cu具有* d_debug設備變量的*獨立*副本。這裏討論的'cuda'標籤有很多問題。 –
謝謝。知道問什麼問題有很大幫助:) –
這[問題](http://stackoverflow.com/questions/24617318/cuda-constant-memory-value-not-correct)和鏈接的重複項通常涵蓋相同的基礎。 '__device__'變量與'__constant__'變量具有相同類型的默認*編譯單元範圍,解決方案方法相同。 –