2014-10-01 82 views
1

所以我知道openCL在接受傳遞給內核的參數時有很多限制。例如,它不支持C++類類型,並且結構不能有指針作爲參數。但是,openCL是否支持將非指針結構作爲字段的結構?openCL內核中的複雜結構

舉例來說,如果我做了以下內容:

typedef struct 
{ 
    int a; 
    float b; 
} MyStruct1; 

typedef struct 
{ 
    float a; 
    MyStruct1 field; 
} MyStruct2; 

__kernel void MyKernel(const MyStruct2 *struct) 
{ 
    MyStruct1 innerStruct = struct->field; 
    //Do more stuff 
} 

^^請問這是合法的OpenCL中?如果它是合法的,我是否應該注意到有什麼特別的記憶問題?

+0

找到你可以嘗試,如果他們做了深拷貝或淺的一個複製兩個結構和調試。如果它適用於多個128位長度的結構體,則應使用這些結構體。 – 2014-10-01 20:35:11

回答

2

OpenCL C在內核中使用,基於C99標準,但有一些限制。只要結構只描述其元素在內存中的位置,嵌套結構就沒有問題。

OpenCL的規格可以在Khronos site

3

嵌套結構在OpenCL中是合法的,但padding is device and compiler specific。所以如果將它們用作內核的參數會導致問題。在某些系統上,主機和設備上的padding會有所不同,這會導致數據損壞。如果你想在設備端使用結構體,你總是可以用數組移動數據並在設備端構建結構體。

+0

好吧,但結構是否將其他結構包含爲字段是合法的?我知道結構通常是合法的,但我想知道包含結構的結構的特定場景。 – user1782677 2014-10-01 20:04:52

+0

我說的是結構時,我的意思是嵌套結構。我已經編輯了答案。 – maZZZu 2014-10-02 05:23:47