Heterogeneous Compute SDK Data and Storage

一、Data Structures

1)HetComputeSDK并行架构的无锁队列。

(1)HetCompute提供了两种变体。一种是同时访问的无所FIFO数据架构队列:记录一个可执行的固定大小的bounded_lfqueue和一个记录一个无边界的lfqueue版本。

(2)HetCompute支持两种操作变体:push和pop。

         a、Push插入一个数值进入队列,如果成功会返回一个true。如果队列是bounded_lfqueue,当队列被填满的时候,Push操作           仅仅会返回false。

         b、Pop操作会从一个非空队列移除一个值,如果成功会返回true。假如队列是空,Pop操作将返回false。在多线程的情况      下,push和pop可以并行操作队列,可以同步写入和移除同一队列,不需要加锁。

(3)HetCompute所有的lfqueue API被整合到#include <hetcompute/lfqueue.hh>头文件中。

(4)HetCompute所有的lfqueue API被整合到#include<hetcompute/bounded_lfqueue.hh>头文件中。

(5)在软件上层, bounded_lfqueue被作为一个固定尺寸的循环数组来执行,他通过一个输入参数来定义这个队列的尺寸。特别指出在HetCompute中,通过将大小的对数(基数为2)作为输入,数组的大小被强制为2的幂。参考如下的bounded_lfqueue实例: hetcompute::bounded_lfqueue<size_t> q(8); 这个例子设置bounded_lfqueue队列有2^8 = 256个元素。当这个队列满了的时候,不能push一个新的值到这个队列中,值到队列移除一个值后,才可以进行push操作。

(6)这个lfqueue可以视为一个链表,每一个节点都是一个bounded_lfqueue,并且是没有边界的。lfqueue链表与bounded_lfqueue情况是一样的,在实例化期间传入的尺寸参数用于初始化。如果需要,lfqueue链表可以以bounded_lfqueue块的大小进行扩展。

(7)参考下方lfqueue链表的例子

                                   

(8)在上述的例子中,首先创建两个group,一个是producer,一个是consumer。launch两个任务到group。每一个producer group的任务push 100个值到q队列,并且在consumer group同时将值pop出来。程序结束会在200个数值都被pop出来之后。因此,等待consumer group完成就可以了,因此消费者任务只有在每个都弹出100个任务后才能完成。

二、Storage

1)Task-Local Storage

(1)与线程相似的任务可以与本地任务相关联,通过hetcompute::task_storage_ptr。使用模式包括声明一个全局变量,比如存储,它保存一个指向实际任务本地数据的指针。然后在该任务内,变量被关联到一个本地指针,或者一个新分配的内存堆。最后在该任务内可以动态的使用这个存储。

       

(2)NOTE:访问存储的值仅影响当前任务。尝试在任务之外修改task_storage_ptr的值会产生未定义的行为。

(3)另外,可以使用析构函数(或者更确切地说:终结器)来处置资源。析构函数将在每个具有分配给全局变量的值的任务中运行

2)Scheduler-Local Storage

(1)另一个用例是scratchpads:跨任务边界持久化的数据,通常用于避免每个任务都进行内存分配或初始化。如果每个调度程序创建自己的暂存器(然后可以像任务本地存储一样使用),HetCompute可以避免同步访问scratchpads。作为进一步优化,hetcompute::scheduler_storage_ptr<T>在写入任务的时候,被附带性的创建了出来。请注意,变量初始化和销毁通过T的构造函数和析构函数发生。

                 

(2)Scheduler-local存储不受上下文切换的影响(例如:通过hetcompute::task<>::wait_for)

                            

(3)一个完整的例子

                 

3)Thread-Local Storage

       (1)如果一个任务组需要scratchpads,但不要求数据在上下文切换中持续存在,对于hetcompute::scheduler_storage_ptr,hetcompute::thread_storage_ptr是一个有效的替代品。由于HetCompute Thread-Local存储与HetCompute的设备线程是关联的,因此,HetCompute分配了比较少的T实例(用更早期的一个例子对比hetcompute::scheduler_storage_ptr)。

              

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值