![](/img/trans.png)
[英]CUDA compile error on Linux, but Windows Visual Studio succeed
[英]CUDA code compile on Linux but not in Windows ( Visual Studio 2012)
我正在開發一個使用CUDA開發工具包版本10.1的程序,並且正在使用Visual Studio2012。我正在Windows上工作,但與Linux用戶共享代碼。 所有代碼在這兩種情況下都可以正常工作,除了某些行代碼可以在linux上運行,而不能在Windows上運行。 因此,每次我必須更改這些行。 我會避免這樣做,因為在Linux上代碼可以很好地編譯,我認為有一些原因導致Windows上的代碼無法編譯,但是這些原因一定是與代碼無關,而是與某些Visual Studio設置有關,或者類似。 你能幫助我嗎? 特別是以下代碼行:
int n_devices = 0;
cudaGetDeviceCount(&n_devices);
cudaDeviceProp props[n_devices];
在最后一行,我有錯誤:
錯誤:表達式必須具有恆定值
我可以修復定義const int n_devices = 1;
錯誤const int n_devices = 1;
並注釋函數cudaGetDeviceCount(&n_devices);
。 之所以有效,是因為我已經知道正確的設備數量,但是可以肯定的是,與上一個設備相比,正確的解決方案要少得多。
另一個問題是我有一個utils.cuh文件,其中定義了兩個const值
const float PI = 3.141592654f;
const float EPS = 1e-3f;
我在utils.cu文件中調用了這兩個值,並且在編譯時出現錯誤:
錯誤:設備代碼中未定義“ PI”
錯誤:設備代碼中未定義“ EPS”
我可以通過以下方式解決這兩個變量的聲明:
#define PI 3.141592654f
#define EPS 1e-3f
因此,即使我可以解決所有兩個問題,我也確實希望將代碼保留在第一個配置中(因為它在Linux上有效)。 可能是與編譯器版本有關的問題嗎? 我真的不知道這可能是原因。
僅通過更改編譯器版本或類似的內容,您將無法解決這些問題。
第一個問題在這里和這里描述,與CUDA無關,除非CUDA正在使用主機編譯器。 您顯示的代碼使用了VLA(可變長度數組),它是C99標准的一部分,而不是任何C ++標准的一部分。 CUDA主要基於C ++實現,並且利用C ++主機編譯器來編譯主機代碼,這已顯示出來。 在Windows上,它使用Microsoft編譯器。 因此,Microsoft編譯器禁止VLA是正確的,並且沒有辦法避免這種AFAIK。 您的代碼可在linux上使用,因為nvcc
在linux上使用g++
主機編譯器,並且允許(以非標准兼容的方式)在C ++主機代碼中使用VLA。
我不知道有什么方法可以解決此問題,並且不需要跨平台兼容性就可以對代碼進行一些更改。 但是,少量的C語言(或C ++)編程技能可以為您提供應在Linux或Windows上運行的解決方案:
int n_devices = 0;
cudaGetDeviceCount(&n_devices);
cudaDeviceProp *props = new cudaDeviceProp[n_devices];
(如果您想使用兼容C的方法,則可以類似的方式使用malloc
)
第二個問題是CUDA的局限性, 在此處記錄 。
據我所知,也沒有任何方法可以解決這個跨平台問題,而無需更改您的代碼。
您已經確定了一種可能的解決方法,該方法可以在Linux和Windows上以跨平台的方式工作:
#define PI 3.141592654f
#define EPS 1e-3f
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.