我無法在編譯時(甚至是運行時)重現錯誤。我不熟悉JOCL,因此無法在這方面提供幫助。 我正在使用Windows,NVIDIA和JIT編譯OpenCL內核。
您是否還在內核中使用分配的內存?new_vars
或者您是否只聲明__local cl_var new_vars[10];
並且發生錯誤?
另外你是什麼意思與「我試圖改變結構定義包括本地在不同的地方」?您是否已將local
地址空間限定符添加到「下一個」指針? 如果是這樣,那麼我的以下解釋可能不是解決方案。
從我所看到的,錯誤的潛在原因是缺少地址空間限定符(無法驗證,因爲我無法重現錯誤)。您的問題是OpenCL中的指針類型始終帶有地址空間限定符private
,local
,global
或constant
(請參閱here)。如果將它保留,OpenCL默認選擇private:「如果未指定地址空間限定符,則聲明爲指針的變量被視爲指向__私有地址空間」(請參閱Notes)。
這就是你的結構發生了什麼。在struct中聲明瞭一個指向結構本身的指針,但是你沒有指定任何地址空間限定符,所以private被默認設置。
寫作
typedef struct cl_var{
int var;
struct cl_var* next;
} cl_var;
相當於寫
typedef struct cl_var{
int var;
private struct cl_var* next;
} cl_var;
當寫__local cl_var new_vars[10];
靜態分配在本地內存10個cl_var對象,地址空間限定符不匹配,因爲對象駐留在本地內存,但期望在私有內存中指向一個對象(「下一個」)。因此,在對象中使用指針時,程序應該會崩潰,但只能在運行時而不是編譯時(除非編譯器非常敏感 - 在這種情況下實際上是一件好事)。
通過編寫
typedef struct cl_var{
int var;
local struct cl_var* next;
} cl_var;
你應該能夠分配內存。注意:儘量避免使用「新」來命名你的數組,因爲它與動態內存分配的聯繫(並且動態內存分配不在你的示例代碼中發生的事情),它可能會讓人困惑。
我不認爲你可以包含一個指向自己的指針。由於它尚未定義。此外,它正在生成無限遞歸問題。 – DarkZeros 2014-12-05 10:23:26
@DarkZeros我最初確實有這個問題,但包括struct關鍵字固定,我猜它是一個不同的命名空間。此外,它在任何地方都可以,除非將它用作本地數組。 – 2014-12-05 10:48:06
'我在編譯時遇到seg錯誤。'你的意思是你在編譯時**得到一個段錯誤**? – 2014-12-05 10:48:48