# Matlab's matmul much faster than julia's

**URL:** <https://discourse.julialang.org/t/matlabs-matmul-much-faster-than-julias/112476>\
**Category:** New to Julia\
**Created:** [April 3, 2024, 4:56pm UTC](https://discourse.julialang.org/t/matlabs-matmul-much-faster-than-julias/112476 "2024-04-03T16:56:28Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![yhuang](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yhuang/32/42523_2.png) [@yhuang](https://discourse.julialang.org/u/yhuang)\
**Post date:** [April 3, 2024, 4:56pm UTC](https://discourse.julialang.org/t/matlabs-matmul-much-faster-than-julias/112476/1 "2024-04-03T16:56:28Z")

</div>

Hey,

I observed that on my machine matlab’s matmul faster than julia’s. I am quite confused since it seems I have already aligned all the different factors.

Here is a minimal working example.  
Julia code:

```julia
using MKL
using SparseArrays
using BenchmarkTools
using MAT

MKL.BLAS.set_num_threads(1)

n = 10^3 
A = randn(n, n)
B = randn(n, n)

@btime $A * $B;
matwrite(homedir()*"/matmul_data.mat",
    Dict("A" => A, "B" => B))

```

whose output is

```julia
46.958 ms (2 allocations: 7.63 MiB)

```

and matlab code:

```julia
function benchmark(reps)
    setenv("MKL_NUM_THREADS", "1");
    setenv("OMP_NUM_THREADS", "1");
    setenv("OPENBLAS_NUM_THREADS", "1");
    data = load('~/matmul_data.mat');
    A = data.A;
    B = data.B; 
    n = size(A, 1);
    times = zeros(1, reps);
    prod = randn(n, n);
    for i = 1:reps
        tic; % Start timing
        C = A * B; % Perform dense-dense matrix multiplication
        times(i) = toc; % Stop timing and record the duration
        D = randn(n, n);
        prod = prod * (C + D); % avoid C being optimized away 
    end
    averageTime = mean(times);
    fprintf('Average execution time: %.4f seconds\n', averageTime);
end

```

Running `benchmark(100)` gives me

```julia
Average execution time: 0.0081 seconds

```

which is about 5-6x faster than julia. Is there any step I omitted such that the comparison isn’t fair?

---

<div class="post-metadata">

**Author:** ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)\
**Post date:** [April 3, 2024, 5:04pm UTC](https://discourse.julialang.org/t/matlabs-matmul-much-faster-than-julias/112476/2 "2024-04-03T17:04:40Z")

</div>

You have 246.9 GFLOPS.

Either:

1. Your MATLAB is running multithreaded.
2. You have Apple silicon and MATLAB is using AppleAccelerate to use their special matrix cores.

---

<div class="post-metadata">

**Author:** ![adienes](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adienes/32/37459_2.png) [@adienes](https://discourse.julialang.org/u/adienes)\
**Post date:** [April 3, 2024, 5:06pm UTC](https://discourse.julialang.org/t/matlabs-matmul-much-faster-than-julias/112476/3 "2024-04-03T17:06:52Z")

</div>

I am no matlab expert, so this is just speculation

is it possible that the `setenv` calls are not actually affecting the number of threads, since they are set internally after the matlab session is already running ? maybe try setting those environment variables outside of the matlab code

---

<div class="post-metadata">

**Author:** ![yhuang](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yhuang/32/42523_2.png) [@yhuang](https://discourse.julialang.org/u/yhuang)\
**Post date:** [April 3, 2024, 5:10pm UTC](https://discourse.julialang.org/t/matlabs-matmul-much-faster-than-julias/112476/4 "2024-04-03T17:10:40Z")

</div>

I originally set the environment variable in my shell and it didn’t work so I tried `setenv`.

It turns out my matlab was still multithreading, I should start it with `-singleCompThread`. Now it’s even.

---

<div class="post-metadata">

**Author:** ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)\
**Post date:** [April 3, 2024, 5:50pm UTC](https://discourse.julialang.org/t/matlabs-matmul-much-faster-than-julias/112476/5 "2024-04-03T17:50:27Z")

</div>

That used to be my favorite discourse title

---

<div class="post-metadata">

**Author:** ![vancleve](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vancleve/32/4183_2.png) [@vancleve](https://discourse.julialang.org/u/vancleve)\
**Post date:** [April 4, 2024, 8:31pm UTC](https://discourse.julialang.org/t/matlabs-matmul-much-faster-than-julias/112476/6 "2024-04-04T20:31:32Z")

</div>

what is your new favorite??? 🧐

---

<div class="post-metadata">

**Author:** ![rveltz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rveltz/32/2707_2.png) [@rveltz](https://discourse.julialang.org/u/rveltz)\
**Post date:** [April 5, 2024, 6:54am UTC](https://discourse.julialang.org/t/matlabs-matmul-much-faster-than-julias/112476/7 "2024-04-05T06:54:34Z")

</div>

“jax/mojo is faster than julia” 😊  
By “favorite” I meant for this type of questions, these are not my favorite discourse questions at all
