Heterogeneous Compute in Action

大家好,今天给大家介绍我们将演示如何写一个简单的并行HetCompute应用,在系统的多个设备中执行任务,并且将以前描述的许多HetCompute结构连贯汇集到一起。

1)、一般,写一个并行HetCompute应用遵循如下步骤:

  (1)、为驱动的设备写一些有用的功能函数。

  (2)、创建一些基于HetCompute并行架构的buffers,用于不同处理器之间的数据交换。

  (3)、创建一些适用于指定处理器的kernel渠道和buffers。

  (4)、使用HetCompute的kernel渠道创建一个任务。

  (5)通过任务构造和启动HetCompute程序。

2)、特别之处,上面的list中最后一部对于任何程序都是相同的,不局限了只有CPU或者异构。因此主要介绍上述list里边的前4步。为了解释这些步骤,我将通过设计一个简单的HetCompute demo来说明。这个应用拿到一个是个浮点数指针的数组x[i],并且计算x[i] * x[i] + 1 / x[i]给每一个元素。有一个1.0, 2.0, ..., 10.0的输入,并且将产生2.0, 4.5, ..., 100.01的输出。

3)、首先,要写一个设备功能函数。目前CPU、GPU、DSP在HetCompute中以不同语言编程。如下例子列举了3个处理器使用的功能函数:

      

4)、下一步是考虑如何在这些函数之间传递数据并相应地创建数据容器。HetCompute的buffers就是用于这个目的的。特别是,缓冲区抽象了传统异构编程环境中的大部分手动数据编组,大大简化了多设备编程。

5)、通过创建kernel渠道和任务,设置任务间依赖,并且运行他们。

     

6)、NOTE: 值得再次强调的是,HetCompute任务在不同设备上是通用的。 虽然任务可能包含为不同设备定制的内核,但在任务级别及以上,程序员不应该区分这些任务。

7)、虽然上面的示例在功能上是正确的,但是通过一些简单的技术可以改善其性能。

  (1)、述示例中的GPU和DSP内核是顺序执行的。 但是,通过使用其他缓冲区,它们可以异步启动,从而使它们有机会根据调度结果同时执行。 需要注意的是,通过使用组wait_for确保它们汇聚在同一主机线程中。

  (2)、虽然默认缓冲区构造函数需要很少的参数来生成功能正确的行为,但是通过向构造函数提供额外的提示可以提高它们的性能。例如,hetcompute::in,hetcompute::out和hetcompute::inout可用于限定缓冲区并避免不必要的副本。此外,有关可能设备的提示可以指导缓冲区的存储分配。

  (3)、优化后的代码如下:

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值