OK, wow! I tried following the advice in  
https://github.com/staticfloat/homebrew-julia
specifically,

$ brew rm gcc openblas-julia suite-sparse-julia arpack-julia
$ brew install gcc openblas-julia suite-sparse-julia arpack-julia


Now, there is a difference: the non-SIMD version is *much slower* than 
before:

GFlop        = 0.39122184254142406

GFlop (SIMD) = 1.7337076986157214

The SIMD version is basically the same speed as before, but according to 
code_llvm there is no vectorization.

I think I need to lie down.

Here's the code_llvm outputs:

*julia> **code_llvm(innersimd, Tuple{Vector{Float32},Vector{Float32}})*



define float @julia_innersimd_21416(%jl_value_t*, %jl_value_t*) {

L:

  %2 = bitcast %jl_value_t* %0 to %jl_array_t*

  %3 = getelementptr inbounds %jl_array_t* %2, i32 0, i32 1

  %4 = load i64* %3

  %5 = icmp sle i64 1, %4

  %6 = xor i1 %5, true

  %7 = select i1 %6, i64 0, i64 %4

  %8 = insertvalue %UnitRange.1 { i64 1, i64 undef }, i64 %7, 1

  %9 = extractvalue %UnitRange.1 %8, 1

  %10 = load %jl_value_t** @jl_overflow_exception

  %11 = call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %9, i64 1)

  %12 = extractvalue { i64, i1 } %11, 1

  %13 = xor i1 %12, true

  br i1 %13, label %pass, label %fail



fail:                                             ; preds = %L

  call void @jl_throw_with_superfluous_argument(%jl_value_t* %10, i32 67)

  unreachable



pass:                                             ; preds = %L

  %14 = extractvalue { i64, i1 } %11, 0

  %15 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %14, i64 1)

  %16 = extractvalue { i64, i1 } %15, 1

  %17 = xor i1 %16, true

  br i1 %17, label %pass2, label %fail1



fail1:                                            ; preds = %pass

  call void @jl_throw_with_superfluous_argument(%jl_value_t* %10, i32 67)

  unreachable



pass2:                                            ; preds = %pass

  %18 = extractvalue { i64, i1 } %15, 0

  %19 = icmp slt i64 0, %18

  %20 = xor i1 %19, true

  br i1 %20, label %L11, label %L5.preheader



L5.preheader:                                     ; preds = %pass2

  %sunkaddr = ptrtoint %jl_value_t* %0 to i64

  %sunkaddr19 = inttoptr i64 %sunkaddr to i8**

  %21 = load i8** %sunkaddr19

  %sunkaddr20 = ptrtoint %jl_value_t* %1 to i64

  %sunkaddr21 = inttoptr i64 %sunkaddr20 to i8**

  %22 = load i8** %sunkaddr21

  br label %L5



L5:                                               ; preds = %L5, %L5.
preheader

  %lsr.iv16 = phi i8* [ %22, %L5.preheader ], [ %scevgep17, %L5 ]

  %lsr.iv = phi i8* [ %21, %L5.preheader ], [ %scevgep, %L5 ]

  %"##i#7098.0" = phi i64 [ %27, %L5 ], [ 0, %L5.preheader ]

  %s.1 = phi float [ %26, %L5 ], [ 0.000000e+00, %L5.preheader ]

  %lsr.iv1618 = bitcast i8* %lsr.iv16 to float*

  %lsr.iv15 = bitcast i8* %lsr.iv to float*

  %23 = load float* %lsr.iv15

  %24 = load float* %lsr.iv1618

  %25 = fmul float %23, %24

  %26 = fadd fast float %s.1, %25

  %27 = add i64 %"##i#7098.0", 1

  %scevgep = getelementptr i8* %lsr.iv, i64 4

  %scevgep17 = getelementptr i8* %lsr.iv16, i64 4

  %28 = icmp slt i64 %27, %18

  br i1 %28, label %L5, label %L11



L11:                                              ; preds = %L5, %pass2

  %s.3 = phi float [ 0.000000e+00, %pass2 ], [ %26, %L5 ]

  ret float %s.3

}



*julia> **code_llvm(inner, Tuple{Vector{Float32},Vector{Float32}})*



define float @julia_inner_21415(%jl_value_t*, %jl_value_t*) {

top:

  %2 = bitcast %jl_value_t* %0 to %jl_array_t*

  %3 = getelementptr inbounds %jl_array_t* %2, i32 0, i32 1

  %4 = load i64* %3

  %5 = icmp sle i64 1, %4

  %6 = xor i1 %5, true

  %7 = select i1 %6, i64 0, i64 %4

  %8 = insertvalue %UnitRange.1 { i64 1, i64 undef }, i64 %7, 1

  %9 = extractvalue %UnitRange.1 %8, 1

  %10 = add i64 %9, 1

  %11 = icmp eq i64 1, %10

  br i1 %11, label %L3, label %L.preheader



L.preheader:                                      ; preds = %top

  %12 = bitcast %jl_value_t* %0 to %jl_array_t*

  %13 = bitcast %jl_array_t* %12 to i8**

  %14 = load i8** %13

  %15 = bitcast %jl_value_t* %1 to %jl_array_t*

  %16 = bitcast %jl_array_t* %15 to i8**

  %17 = load i8** %16

  %18 = add i64 %9, -1

  br label %L



L:                                                ; preds = %L, %L.preheader

  %lsr.iv6 = phi i8* [ %14, %L.preheader ], [ %scevgep7, %L ]

  %lsr.iv4 = phi i8* [ %17, %L.preheader ], [ %scevgep, %L ]

  %lsr.iv = phi i64 [ %18, %L.preheader ], [ %lsr.iv.next, %L ]

  %s.0 = phi float [ %22, %L ], [ 0.000000e+00, %L.preheader ]

  %lsr.iv68 = bitcast i8* %lsr.iv6 to float*

  %lsr.iv45 = bitcast i8* %lsr.iv4 to float*

  %19 = load float* %lsr.iv68

  %20 = load float* %lsr.iv45

  %21 = fmul float %19, %20

  %22 = fadd float %s.0, %21

  %23 = icmp eq i64 %lsr.iv, 0

  %24 = xor i1 %23, true

  %lsr.iv.next = add i64 %lsr.iv, -1

  %scevgep = getelementptr i8* %lsr.iv4, i64 4

  %scevgep7 = getelementptr i8* %lsr.iv6, i64 4

  br i1 %24, label %L, label %L3



L3:                                               ; preds = %L, %top

  %s.1 = phi float [ 0.000000e+00, %top ], [ %22, %L ]

  ret float %s.1

}


Reply via email to