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中?如果它是合法的,我是否应该注意到有什么特别的记忆问题?
嵌套结构在OpenCL中是合法的,但padding is device and compiler specific。所以如果将它们用作内核的参数会导致问题。在某些系统上,主机和设备上的padding会有所不同,这会导致数据损坏。如果你想在设备端使用结构体,你总是可以用数组移动数据并在设备端构建结构体。
好吧,但结构是否将其他结构包含为字段是合法的?我知道结构通常是合法的,但我想知道包含结构的结构的特定场景。 – user1782677 2014-10-01 20:04:52
我说的是结构时,我的意思是嵌套结构。我已经编辑了答案。 – maZZZu 2014-10-02 05:23:47
找到你可以尝试,如果他们做了深拷贝或浅的一个复制两个结构和调试。如果它适用于多个128位长度的结构体,则应使用这些结构体。 – 2014-10-01 20:35:11