美文网首页
用julia GPU进行滚动窗口求和计算:rolling()

用julia GPU进行滚动窗口求和计算:rolling()

作者: 昵称违法 | 来源:发表于2021-06-12 13:51 被阅读0次

在回测的时候,需要计算很多的指标,对一个时间系列值进行滚动窗口求sum、mean、std......是非常常见的操作,如何提高他们的计算速度呢?

下面以滚动窗口取40,这些窗口里的系列值再求和,为案例进行。
主要目的,用于计算时间的对比

【计算任务】
1、数组有1亿3千万个元素
2、rolling windows = 40
3、function = sum

【结论】
1、CPU多线程后,提速10倍,
2、用GPU计算,比CPU多线程加速10倍
本机配置:AMD 3700X + RTX 2060

一、用CPU计算

(1)单线程计算

using BenchmarkTools

N = 2^27
ary =Array(1:N)
res =similar(ary)

function cpu_fn(ary,res)
    for index in ary
        size = 40
        if index < size
            res[index] = 0 #看业务需求,也可以:有多少就算多少
        else
            for i in index - size + 1 : index
                res[index] += ary[i]
            end
        end
    end


    return nothing
end

@btime cpu_fn(ary,res)  #  4.699s

耗时:4.699s

(2)多线程计算

function cpu_fn_threads(ary,res)
    Threads.@threads for index in ary
        size = 40
        if index < size
            res[index] = 0
        else
            for i in index - size + 1 : index
                res[index] += ary[i]
            end
        end
    end
    return nothing
end

@btime cpu_fn_threads(ary,res)  #439.207ms   

耗时:439.207ms (接近半秒)

二、用GPU进行计算

using CUDA
using Test
using BenchmarkTools

function gpu_fn!(ary,res)
    index = (blockIdx().x - 1) * blockDim().x + threadIdx().x

    size = 40
    if index < size
        res[index] = 0.0
    else
        for i in index - size + 1 : index
            res[index] += ary[i]
        end
    end

    return nothing
end

N = 2^27
ary = CUDA.CuArray(1:N)  # a vector stored on the GPU filled with 1.0 (Float32)
res = CUDA.CuArray(1:N)   # a vector stored on the GPU filled with 2.0

numblocks = ceil(Int, N/256)

@cuda threads=256 blocks=numblocks gpu_fn!(ary,res)

#测试计算时间
@btime CUDA.@sync begin   # 43.219ms
    @cuda threads=256 blocks=numblocks gpu_fn!(ary,res)
end

耗时:43.219ms

三、总结和注意事项

(1)本机的 CPU是 amd 3700x GPU是 rtx2060

(2)单线程耗时4.6秒,多线程耗时439.2ms,然而,如果用GPU计算,耗时为43.2ms

GPU计算时间是CPU多线程的十分之一,是单线程CPU的百分之一,关键是,利用GPU计算后,你可以把CPU解放出来,做别的事情

(3)同步GPU计算的时候用

#关键点 是 【begin】  和  【end】,省去begin和end的话,会出错
CUDA.@sync begin  
    @cuda threads=256 blocks=numblocks gpu_fn!(ary,res)
end

(4)在GPU上计算sum,mean,std等,你需要查看CUDA提供哪些函数,比如,他没有提供SUM函数,需要自己实现累加,但是提供了sin 、 cos等等,具体可以直接使用哪些函数,请查询CUDA.JL的官网。

相关文章

  • 用julia GPU进行滚动窗口求和计算:rolling()

    在回测的时候,需要计算很多的指标,对一个时间系列值进行滚动窗口求sum、mean、std......是非常常见的操...

  • pandas.rolling()简单使用

    pandas.rolling()函数提供滚动窗口计算的功能 (版本0.18.0中的新功能) 部分参数说明:wi...

  • 643-子数组最大平均数 I

    求长度为 k 的子数组的最大平均值,滑动窗口法,保持窗口大小为 k,进行滑动。 用累加数组来计算,对于子数组求和问...

  • Julia GPU 计算入门

    作为专门为科学计算设计的编程语言,Julia 在分布式、GPU 甚至 TPU 计算方面提供了许多丰富易用的特性。我...

  • pandas函数-rolling

    前面有说过一个累计计算的系列函数,参考:pandas cum系列函数 这个rolling函数是滚动计算 panda...

  • 用GPU进行TensorFlow计算加速

    将深度学习应用到实际问题中,一个非常大的问题在于训练深度学习模型需要的计算量太大。为了加速训练过程,本文将介绍如何...

  • tensorflow 使用CPU而不使用GPU的问题解决

    今天发现一个怪现象,在训练keras时,发现不使用GPU进行计算,而是采用CPU进行计算,导致计算速度很慢。用如下...

  • Flink -- Operator操作算子

    1.滚动聚合算子(Rolling Aggregation)

  • DOM——尺寸计算

    元素坐标计算 窗口滚动条 1. 滚动条偏移量的计算 window.pageXOffset() window.pag...

  • Flink_四大基石windows && Time

    Flink 流式计算引擎:四大基石Window窗口和Time时间基于时间窗口计算,尤其是事件时间窗口,其中滚动Tu...

网友评论

      本文标题:用julia GPU进行滚动窗口求和计算:rolling()

      本文链接:https://www.haomeiwen.com/subject/kaxieltx.html