Fortran与Julia的问题

如何定义一门成功的语言是个问题,好多domain specific language非常成功,但是用户不多。如果说语言的成功和用户数量挂钩的话,从历史看来,设计上占优势的语言不一定会成功。我从Julia 0.4 开始用,非常同意你提到的这些优点。However, these merits do not necessarily translate to ultimate success. 请看这个:
https://www.jwz.org/doc/worse-is-better.html

不过,我对Julia的未来还是很乐观的。

我觉得需要有killer application才能流行起来。但是Julia实际上目前的用户数量已经足够支撑它不死掉了。(according to Quora)

所以我们是可以放心用,不用担心以后死掉。至于流行不流行就随缘吧。

别被大公司用才是成功的这句话洗脑了就行…

代码执行上的效率还是很难达到的,目前Julia的BLAS库还是调的Fortran代码,虽然现在社区里也有人正在研究用纯Julia实现BLAS,但感觉一时半会还是赶不上Fortran优化多年的成熟库,对这块感兴趣可以关注一下官方slack的#linear-algebra频道。 如果考虑开发效率,Julia有着显著的优势,在实际开发中,对于效率要求很高的部分,可以用Fortran实现,然后从Julia调Fortran。由于Julia调Fortran的FFI非常简洁,所以这里产生的two language problem不是那么的明显。

优化了的BLAS不是Fortran写的。优化BLAS用的是C和汇编(真正的计算部分)写的。Level 3 BLAS的结构是这样的。
http://apfel.mathematik.uni-ulm.de/~lehn/sghpc/gemm/page02/index.html

Julia要写BLAS的话,可以用纯Julia写packing的部分,然后复制粘贴优化的汇编到 Base.llvmcall 调用汇编作为microkernel。

前面提到的纯Julia BLAS是指这个:https://github.com/chriselrod/jBLAS.jl

只知道Base.llvmcall是用来调用LLVM IR的,如何用它调汇编呢?具体有例子么?

可以这样用汇编

julia> function foo(a, b)
           Base.llvmcall("""
           %X = call i32 asm "leal (\$1,\$1,4), \$0", "=r,r,r"(i32 %0, i32 %1)
           ret i32 %X""",
           Cint, Tuple{Cint,Cint}, a, b)
       end
foo (generic function with 2 methods)

julia> foo(Cint(1), Cint(2))
5
2 个赞

DifferentialEquations 其实比Fortran快的 :wink:

6 个帖子被分离到了新主题:Fortran 与 Julia 之间的性能问题

X-ref: https://discourse.julialang.org/t/julia-vs-fortran-complaint/4366