# Data structures for threaded computing

**URL:** <https://discourse.julialang.org/t/data-structures-for-threaded-computing/30131>\
**Category:** Performance\
**Created:** [October 21, 2019, 12:07pm UTC](https://discourse.julialang.org/t/data-structures-for-threaded-computing/30131 "2019-10-21T12:07:47Z")\
**Posts on this page:** 1\
**Showing post:** 16

<div class="post-metadata">

**Author:** ![foobar\_lv2](https://avatars.discourse-cdn.com/v4/letter/f/ee59a6/32.png) [@foobar\_lv2](https://discourse.julialang.org/u/foobar_lv2)\
**Post date:** [October 22, 2019, 7:48am UTC](https://discourse.julialang.org/t/data-structures-for-threaded-computing/30131/16 "2019-10-22T07:48:19Z")

</div>

> [@dataDiver](#):
>
> ```julia
> function threadedGram(x::Array{Array{Float64, 2}})
> p = size(x[1])[2]
> n = length(x)
> z = zeros(Float64, p, p)
> @threads for i in 1:n
> z .+= x[i]' * x[i]
> end
> return z
> end
> 
> ```

Apart from perf issues, this looks like a big data race to me. I think you meant to write

```julia
function threadedGram2(x::Array{Array{Float64, 2}})
  p = size(x[1])[2]
  n = length(x)
  z = [zeros(Float64, p, p) for i in 1:Threads.nthreads()]
  @threads for i in 1:n
    LinearAlgebra.mul!(z[Threads.threadid()], x[i]', x[i], 1, 1)
  end
  r = pop!(z)
  for zz in z
      r .+= zz
  end
  return r
end

```

---

_[View the full topic](https://discourse.julialang.org/t/data-structures-for-threaded-computing/30131)._
