2014-04-02 29 views
0

我遇到了一個奇怪的問題。 我有一個簡單的內核。它工作正常。 我發現,如果我刪除一些行或在opencl內核文件中引入一些錯誤,然後嘗試運行該程序,則程序運行良好,就好像它具有更正的代碼並且不會給出任何錯誤。 但是由於內核有錯誤,它應該會報錯。 因此,它無法檢測到錯誤,並且如果它發現錯誤,它將以先前正確版本的代碼運行。 這是一個特色嗎?這裏有什麼不對?即使內核有錯誤,Opencl運行正常

+0

請發佈一些關於如何構建內核的代碼。 – DarkZeros

回答

1

這不是OpenCL的功能。我猜測原因是:

  1. 你沒有給你clCreateProgramWithSource你認爲你給它的內核。檢查這種方法的一個好方法是在打電話之前立即打印出您提供給clCreateProgramWithSource的字符串。
  2. 您的應用程序「緩存」內核,隨後的執行使用clCreateProgramWithBinary而不是(修改後的)內核源代碼。
+0

爲了簡單起見,我給內核分配了一些值和數組。像這樣:c [iGID] = 111;如果我刪除分號,程序仍會顯示111.如果我更改c [iGID] = 222;並把分號放回去,我看到222.程序獲得了相同的源代碼。我嘗試刪除可執行文件並重新編譯。但它仍然可以在內核中出現錯誤而完美運行。 – Luniam

+0

@Luniam似乎排除了我的第一個建議,然後 - 檢查第二個? – Oak

+0

我已刪除所有可執行文件並重新編譯。所以,它應該作爲一個新的開始,並應該得到在內核中所做的更改。順便說一句,我沒有在我的程序中使用clCreateProgramWithBinary。 – Luniam

2

我強烈地感覺到你忘了加OpenCL的錯誤檢查每個OpenCL的API在你的代碼,如果你沒有捕獲錯誤明確的OpenCL內核只會繼續,如果沒有問題。如果你還沒有做錯誤檢查,然後可以做如下(OpenCL中的程序應該不會錯過這個)

(變化的基礎上的API調用)

error=clGetPlatformIDs(1, &platform, &platforms); 
if (error != CL_SUCCESS) { 
     printf("\n Error number %d", error); 
} 

,你在你的評論中提及即使內核出現錯誤,也能獲得正確的值,這是因爲設備內存或主機內存具有上次運行的結果(這可能會發生一段時間)。初始化您的輸出緩衝區爲0,然後推到GPU並回讀,現在可能會看到亂碼輸出。

+0

初始化0沒有幫助。每當我運行內核時出錯,我都會得到以前結果的結果。 opencl的自然工作方式?我沒有使用clCreateProgramWithBinary。 – Luniam

+0

您是否應用了API錯誤檢查?如果有的話,是否有任何失敗?這不是OpenCL的工作方式,請轉儲您的代碼以供進一步調查。 – Meluha

+0

嗨薩加爾,這是OpenCL的工作方式。如果你的內核有錯誤並且它沒有運行,那麼設備內存仍然保存着上一次成功運行代碼的值。所以,你將擁有上一次運行的價值。 – Luniam

1

設備內存不會在內核運行或程序啓動之間清除。由於您正在評論實際寫入內存的代碼,因此您只能獲取上一次運行時寫入的代碼。使用NVIDIA GPU和較舊的驅動程序版本,我甚至在系統重啓時看到了內存持久性。

爲了證實這一點,您可以嘗試分配多個緩衝區並使用先前未觸及的緩衝區啓動錯誤的內核。