小编krc*_*ols的帖子

在Julia中优化剩余堆分配

我运行julia --track-allocation prof.jl导致以下输出:

    - using FixedSizeArrays
    - 
    - immutable KernelVals{T}
    -     wavenumber::T
    -     vect::Vec{3,T}
    -     dist::T
    -     green::Complex{T}
    -     gradgreen::Vec{3,Complex{T}}
    - end
    - 
    - function kernelvals(k, x, y)
    -     r = x - y
    0     R2 =  r[1]*r[1]
    0     R2 += r[2]*r[2]
    0     R2 += r[3]*r[3]
    0     R = sqrt(R2)
    - 
    0     ? = im*k
    0     expn = exp(-? * R)
    0     fctr = 1.0 / (4.0*pi*R)
    0     green = fctr * expn
   64     gradgreen = -(? + …
Run Code Online (Sandbox Code Playgroud)

optimization profiling allocation julia

6
推荐指数
1
解决办法
151
查看次数

不允许使用依赖于Julia中类型定义中的整数类型参数的表达式

我想在FixedSizeArrays.Vec {N,T}周围定义一个类型,其中N是type参数的函数:

using FixedSizeArrays

type MT{N}
    x::Vec{N,Int}
    y::Vec{N+1,Int}
end
Run Code Online (Sandbox Code Playgroud)

这会导致错误消息:

ERROR: MethodError: `+` has no method matching +(::TypeVar, ::Int64)
Closest candidates are:
  +(::Any, ::Any, ::Any, ::Any...)
  +(::Int64, ::Int64)
  +(::Complex{Bool}, ::Real)
  ...
Run Code Online (Sandbox Code Playgroud)

显然,即使在编译时可以知道结果,也不允许使用整数类型参数进行简单算术.有没有人知道这个限制的解决方法?

templates julia

5
推荐指数
1
解决办法
166
查看次数

Julia中的运行时多态性开销

据我所知,Julia严重依赖于即时静态类型派生(基本上所有代码都需要被认为是c ++模板).我也知道这意味着在不同类型的对象上使用单个算法时只要在编译时知道这些类型就没有运行时开销.

谈到运行时多态性,我对事情的运作方式不太清楚.假设我们有以下情况:

abstract Shape

type Circle <: Shape
    radius::Float64
end

type Square <: Shape
    width::Float64
end

dist(x::Circle, y::Circle) = ...
dist(x::Circle, y::Square) = ...
dist(x::Square, y::Circle) = ...
dist(x::Square, y::Square) = ...


s = get_shape()
t = get_shape()
a = dist(s,t)
Run Code Online (Sandbox Code Playgroud)

这里,get_shape可以基于例如用户输入返回圆形或正方形.在c ++中,dispatch只需要进行虚拟表查找.这在朱莉娅是如何运作的?多次发送背后的机制是什么?虚拟表查找是否明显更昂贵?难道有两个获得任何好处Square,并Circle从同一个抽象类,或者这是完全不相干的在运行时调度的情况下?

EDT:在这个例子中运行@code_warntype给出:

Variables:
  s::Union{Circle,Square}
  t::Union{Circle,Square}

Body:
  begin  # none, line 2:
      s = (Main.get_shape)()::Union{Circle,Square} # none, line 3:
      t = (Main.get_shape)()::Union{Circle,Square} # none, line 4:
      return (Main.dist)(s::Union{Circle,Square},t::Union{Circle,Square})::ASCIIString
  end::ASCIIString
Run Code Online (Sandbox Code Playgroud)

所以编译器对s和t的类型并不完全无能为力.在打电话时,这些知识是否用于加快调度dist?

polymorphism performance julia

3
推荐指数
1
解决办法
259
查看次数