【问题标题】:In Julia is Int64 slower than Int32?在 Julia 中,Int64 比 Int32 慢吗?
【发布时间】:2021-07-28 09:41:42
【问题描述】:

我是 Julia 的新手。只是一个简单的问题,在 Julia 中,与使用 Int32 相比,使用 Int64 类型会减慢计算速度吗? 喜欢,

i=1::Int64
j=1::Int64

我想计算

i+j

如果我将 i 和 j 定义为 Int32,这会使 i+j 比 i 和 j 是 Int64 更快吗? 谢谢!

我知道在 Fortran 中,int 8 会比 int 4 慢得多。不确定在 Julia 中是否相同

【问题讨论】:

  • "我知道在 Fortran 中,int 8 会比 int 4 慢得多。" - 你能为那个断言提供一个引用吗?如果现代 Fortran 编译器和现代硬件确实如此,我会感到惊讶。至少它将取决于i + j 计算出现的上下文。

标签: julia


【解决方案1】:

时间取决于对象的大小。

考虑以下对整数进行乘法、加法和比较的函数:

min200(T) = minimum(x*x+x for x in UnitRange{T}(1:200))

这里是时间using BenchmarkTools

julia> @btime min200(Int16);
  9.409 ns (0 allocations: 0 bytes)

julia> @btime min200(Int32);
  14.329 ns (0 allocations: 0 bytes)

julia> @btime min200(Int64);
  47.267 ns (0 allocations: 0 bytes)

julia> @btime min200(Int128);
  256.160 ns (0 allocations: 0 bytes)

请注意,这种差异归结为汇编代码。让我们看看如何编译两个整数的加法。

julia> @code_native +(Int32(5), Int32(7))
        .text
; ┌ @ int.jl:87 within `+`
        pushq   %rbp
        movq    %rsp, %rbp
        leal    (%rcx,%rdx), %eax
        popq    %rbp
        retq
        nopl    (%rax)
; └

julia> @code_native +(5,7)
        .text
; ┌ @ int.jl:87 within `+`
        pushq   %rbp
        movq    %rsp, %rbp
        leaq    (%rcx,%rdx), %rax
        popq    %rbp
        retq
        nopw    (%rax,%rax)
; └

在第二个代码中可以看到 32 位添加使用了 32 位注册表 %eax vs 64 位 %rax

此外,当您使用 @simd 或通过 CuArrays 进行 GPU 计算等功能时,这些差异可能会变得更加显着。

【讨论】:

    【解决方案2】:

    首先,所有这些都取决于架构。我将为此答案假设相对现代的 64 位 x86 CPU。 对于标量计算,Int64Int32 将具有相同的速度。 (Int16/Int8 大致相同,但偶尔会稍微慢一些)。对于向量化计算,即rand(Int64,100) .+ rand(Int64,100)Int64 将比Int32 慢约 2 倍,因为缓存使用更好,向量化宽度更高(对于 AVX-2/AVX-512 等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2020-03-26
      • 2020-11-27
      相关资源
      最近更新 更多