【问题标题】:Self Referencing Pointer in OpenCLOpenCL 中的自引用指针
【发布时间】:2017-05-24 14:52:09
【问题描述】:

我有一个在英特尔平台上运行的 OpenCL C++ 代码。我确实有一个想法,即内核端的结构中不接受指针。但是,我有一个类在其中使用自引用指针选项。现在,我可以使用一个结构并在主机端复制相同的结构,但我不能在设备端做同样的事情。

例如如下:

 Class Classname{  
    Classname *SameClass_Selfreferencingpointer;  
    }  
On the Host side I have done the same for the structure as well:  
    struct Structurename{  
    Structurename *SameStructure_Selfreferencingpointer;  
    }  

有人可以为设备端的这种实现提供一个替代选项吗?
提前感谢您的帮助。

【问题讨论】:

    标签: opencl gpu intel gpgpu self-reference


    【解决方案1】:

    由于 opencl 设备中没有 malloc 并且结构体在缓冲区中用作结构体数组,因此您可以添加它的索引,以便它知道它在数组中的位置。您可以在内核之前分配一个大缓冲区,然后使用原子函数来增加假 malloc 指针,就好像它是从缓冲区分配的一样,但只是返回一个指向最后“分配”结构索引的整数。然后,主机端将只使用索引而不是指针。

    如果结构对齐成为主机设备之间的问题,您也可以添加字段索引。例如字段 A 的起始字节,字段 B 的起始字节,所有压缩为一个 4 字节整数,用于具有 4 个已用字段(索引除外)的结构。

    也许你可以添加一个预处理阶段:

    • 主机将人工数字写入 3.1415 等字段
    • 设备检查结构中所有字节偏移的浮点数,直到找到 3.1415
    • 设备将找到的字节偏移量放入一个数组并发送给主机
    • 然后主机从该字节偏移量开始在结构中写入浮点字段
    • 因此主机和设备变得兼容对齐,在从主机获取结构的所有内核中使用相同的偏移量

    也许相反更好

    • 设备将 3.14 放入结构字段中
    • 设备将结构写入结构数组
    • 主机获取缓冲区
    • 主机检查 3.14 并找到字节偏移
    • 主机写入和 fp 数从该偏移量开始以供将来工作

    这将需要您的类及其在主机+设备端的复制结构。

    您还应该寻找“sycl api”。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多