ArrayFire 性能提升优化技巧

为了让你的CUDA或者OpenCL代码有更好的性能,这里将有一些有用的优化性能的技巧.注意:在这里说的加速器是指GPUAPU、协处理器、FPGA和所有可以支持CUDAOpenCL的设备。 


· 向量化代码Vectorized Code加速器执行向量化代码性能会很好因为计算自然地映射到硬件的运算内核上。ArrayFire函数本质上是量化的,因此,如果您使用ArrayFire,你正在编写向量化代码。 


· 内存传输:避免过多的内存传输。每个casting操作CPU存储器和加速器存储器之间来回移动数据。 ArrayFire已经做了很多自动优化,以尽量减少这些存储器之间的传输有在万不得已才传输数据。

 

· 串行对比并行运算: CPU是串行计算设备,而加速器是并行计算设备。对于小的或者并行运算,在CPU上就可以实现最好的性能。而对于大型或者并行运算,可能在加速器上能实现很好的性能。经验之谈是对于只有几百元素的数据就用CPU,如果你的数据规模 >10,000 元素,就用加速器。有了ArrayFire,你可以通过创建矩阵数据类型来控制运行在每个设备的代码段。 


· 循环循环通常意味着串行处理。但是,如果迭代间没有数据依赖关系,有了CUDA或者OpenCL,就可以同时运行所有的迭代。ArrayFire GFOR 函数可以很容易地实现。


· Lazy ExecutionCUDAOpenCL很重要的一点是构建内核,这些内核执行适量的计算,没有太多的超时,也不会降低吞吐量。ArrayFire 采用了一个lazy execution,可以根据你的算法自动构建最佳的内核。Lazy Execution也意味着无论是在显示或随后的基于CPU的计算ArrayFire不启动GPU的内核,直到请求结果。如果你想强制一个ArrayFire计算,可以用ArrayFire synceval函数。


· 一个好的计时代码: 计时代码写的不好,常可引起人为加速器性能下降。 ArrayFire配备了一个方便的计时功能,以确保适当的基准。


· 定期访问模式:当执行下标时,请记住,加速器内存控制器是不像在CPU上那么多用途。实现最佳性能时,你的下标访问模式是定期和统一。例如,A[1 4 2 3 5 1 2...]会变慢,而A[1 2 3 4 5 6...]将更快。使用ArrayFire,下标是很容易的。 ArrayFire是列主序的,所以它是更快地访问列A[span,i],而不是行A[i,span]


· Timeit SolveLU:Timeit函数和ArrayFire的LU分解函数同时使用,数据中间结果发生异常变化,但是程序不报错!


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值