簡體   English   中英

CUDA代碼在Linux上編譯,但在Windows中不編譯(Visual Studio 2012)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM