您正在浏览:主页 > 游戏新闻 > 如何在Julia编程中实现GPU加速
作者:雷霆之怒公益服 来源:http://www.edmi.com.cn 时间:2018-11-03 08:00
x::Float32 map!($kernel, $xgpu, $ygpu) struct Test # an immutable struct y::Float32 function Base.map!(f::Function, A::GPUArray, B::GPUArray) end custom_types = cu(Point[(1, 2), (4, 3), (2, 2)]) # convert to Array or CuArray - moving the calculation to CPU/GPU 内核通常是用 C/ C++语言编写的,但这并不是写算法的最好语言。 t = Base.@elapsed begin m = Chain( 结论 using CuArrays, FileIO, Colors, GPUArrays, BenchmarkTools # let's create a point type to further illustrate what can be done: log2.(x), [speedup, fill(1.0, length(speedup))], from_iter = CuArray(1:10) 让我们直接看一些很酷的实例。 FFT,使用与 julia 的 FFT 相同的 API 创建位置描述对象是在 CPU 上创建的,然后转移到 GPU 内核上,或者本身就由内核内部的 GPU 创建。该表显示创建类型的实例是否可行,对于从 CPU 到 GPU 的转移,雷霆之怒变态公益服,该表还说明了对象是否能通过参照进行复制或传递。 让我们通过一个简单的机器学习示例,看看如何使用 GPUArrays: t = (threadidx_x( state), threadidx_y( state)) # So the above is equal to (minus all the allocations): GPU 函数(内核)本质上是并行的,所以编写 GPU 内核不比编写并行 CPU 代码容易,而且硬件上的差异增加了一定的复杂性。 blocks = ( 2, 2) 用一个简单的交互式代码示例来快速说明:为了计算 julia 集合(曼德勃罗集合),我们必须要将计算转移到 GPU 上。 true 大多数高度并行的算法都需要同时处理大量数据,以克服所有的多线程和延迟损耗。因此,大多数算法都需要数组来管理所有数据,这就需要一个好的 GPU 数组库作为关键的基础。 Vector{Test2} # <- An Array with mutable elements is basically an array of heap pointers. Since it just contains cpu heap pointers, it won't work on the GPU. single_t = @belapsed map!($kernel, $x, $y) x = zeros(4, 4) # 4x4 array of zeros # Non array types are broadcasted and repeated for the whole length loss(x, y) = crossentropy(m(x), y) Base.convert(::Type{Point}, x::NTuple{2, Any}) = Point(x[1], x[2]) N = 22 train = [(cat(float.(imgs[i])..., dims = 4), labels[:,i]) # now this works: x::Float32 GPUArrays.synchronize($xgpu) bdim = (blockdim_x( state), blockdim_y( state)) test(a::T) where T = a * convert(T, 2) # convert to same type as `a` end gpu_call(kernel, A, (f, A, B)) last_jl, last_cu = nothing, nothing 还有更多的例子,包括求微分方程、FEM 模拟和求解偏微分方程。 注册地址:https://nextjournal.com/signup # Let's go back to our Point type and define addition for it x::Vector{Float32} # the below is equal to `broadcast(+, broadcast(+, xx, y), z)` 希望 Julia 能降低人们在 GPU 编程的门槛,我们可以为开源 GPU 计算开发可扩展的平台。第一个成功案例是通过 Julia 软件包实现自动微分解决方案,这些软件包甚至都不是为 GPU 编写的,因此可以相信 Julia 在 GPU 计算领域的扩展性和通用设计中一定会大放异彩。 Conv((2,2), 1=>16, relu), 首先让我们看一下 Julia 的类型: i = linear_index(state) x = repeat(range, inner = 10) # on the GPU:
<<上一篇:天津市初等英语水平考试试卷及答案解析(新东方版) >>
<<下一篇:美团点评上市:市值超500亿美元成为第四大互联网公司 >>