2013-08-20 35 views
0

我有一個簡單的內核,在我使用malloc分配一些空間,簡稱爲:CUDA調試與VS - 不能檢查__restrict__指針(操作無效)

__global__ void chainKernel() { 
    float* __restrict__ boo = (float*)malloc(sizeof(float)); 
    *boo = 0; 
    *boo = *boo + 100; 
    return; 
} 

如果我把*boo = *boo + 100上的斷點我看不到* boo的內容。相反,我在調試器窗口中將變量旁邊的Operation is not valid due to the current state of the object。但是,如果我刪除了__restrict__,則該值顯示正確。這是正常的行爲嗎?

我的系統:CUDA 5.5.20,Nsight 3.1.0.13141,Windows 7 x64,VS2010,GeForce GTX Titan。

+0

不確定,但'__restrict__'關鍵字的目的是爲了避免*指針別名*也許NSight需要創建別名...我的猜測是這是一個正常的行爲。 – Michael

+0

@Michael:如果我想調試,我必須重新定義 '#define __restrict__'? – user2412789

回答

3

__restrict__的好處之一是它允許編譯器在優化方面更具侵略性。當你有像這樣簡單的代碼,編譯器可以完全優化掉,關鍵字__restrict__可以幫助編譯器做到這一點。

無法在調試器中檢查變量的常見原因之一,是由於編譯器優化,無論是本地(當您不期望它時超出範圍的變量)或全局變量(一個變量完全優化)。

請注意,您在此問題中顯示的內核定義沒有任何用處。因此編譯器可能會將事情優化掉。

要解決此問題(對於這種情況),請在最後的boo賦值後立即輸入printf("%f", *boo);語句,編譯器將無法優化變量。您還應該使用-G開關進行調試。