openCL内核中的复杂结构

问题描述:

所以我知道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

OpenCL C在内核中使用,基于C99标准,但有一些限制。只要结构只描述其元素在内存中的位置,嵌套结构就没有问题。

OpenCL的规格可以在Khronos site

嵌套结构在OpenCL中是合法的,但padding is device and compiler specific。所以如果将它们用作内核的参数会导致问题。在某些系统上,主机和设备上的padding会有所不同,这会导致数据损坏。如果你想在设备端使用结构体,你总是可以用数组移动数据并在设备端构建结构体。

+0

好吧,但结构是否将其他结构包含为字段是合法的?我知道结构通常是合法的,但我想知道包含结构的结构的特定场景。 – user1782677 2014-10-01 20:04:52

+0

我说的是结构时,我的意思是嵌套结构。我已经编辑了答案。 – maZZZu 2014-10-02 05:23:47