2013-05-17 46 views
0

我有很難確定爲什麼分割故障在我的代碼下面的行隨機發生:的OpenCL clEnqueueReadBuffer段錯誤隨機

rc = clEnqueueReadBuffer(ompctx->clctx->queue, 
       ompctx->result, CL_TRUE, 0, sizeof(int), &pos, 
       1, &ompctx->clctx->ev1, NULL); 

ompctx->結果是用作整數數組的存儲對象並且pos是一個主對象,聲明爲:

int pos 

我嘗試在堆棧和全局空間中聲明pos,結果不會改變。 我試着等待最後一個內核完成(如上所述,儘管我不應該因爲我有一個按順序的命令隊列)並且沒有等待,但結果仍然是一樣的。

我使用的是AMD APP v2.8,我嘗試過使用8個CPU的i7和AMD FirePro v8800。兩者都表現出同樣的問題。

我錯過了一些明顯的東西嗎?我還應該檢查什麼?

+0

也許你解引用了一個'null'指針?沒有看到更多的代碼,這將很難說。 –

+0

我打印指針,並且在調用ReadBuffer之前它們都看起來沒問題。這個隊列在調用之前就被使用了,並且它總是成功的,結果也被成功地使用,pos是一個全局變量,如果它們在那裏或者沒有,這些事件沒有什麼區別。所以我不認爲這是一個空指針解引用。 –

+0

您是否嘗試過使用英特爾OpenCL平臺?它會給你同樣的錯誤嗎? – Ani

回答

4

由於您將阻塞參數設置爲CL_TRUE,因此clEnqueueReadBuffer在傳輸完成之前不會返回,這意味着傳輸之前排隊的所有先前命令也必須完成。很有可能您以前的OpenCL調用中有一個出現了寫出邊界或其他內容的命令(因爲它是隨機發生的),並且只有在調用clEnqueueReadBuffer之後纔會執行該命令。嘗試在每次執行OpenCL調用之後,在您的命令隊列中調用clFinish以強制每個命令在排入隊列後立即完成,然後插入一對printf語句,以便確定哪個命令確實失敗。

+0

我最終這樣做,然後在amd的cl blas庫中崩潰。忘了在這裏添加解決方案,謝謝你的:-) –