# Accelerating computations Neural Network

**URL:** https://discourse.julialang.org/t/accelerating-computations-neural-network/57670
**Category:** Performance
**Tags:** gpu, cuda
**Created:** [March 21, 2021, 8:54pm UTC](https://discourse.julialang.org/t/accelerating-computations-neural-network/57670 "2021-03-21T20:54:34Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![moby75](https://avatars.discourse-cdn.com/v4/letter/m/ba8739/32.png) [@moby75](https://discourse.julialang.org/u/moby75)
#### Post date: [March 21, 2021, 8:54pm UTC](https://discourse.julialang.org/t/accelerating-computations-neural-network/57670/1 "2021-03-21T20:54:35Z")

</div>

I am _ **new** _ to Julia and to Cuda programming. I am using Julia 1.0.5.  
I wrote a code to do neural network inferences: it consists on a series of multiplications (neural network weights\* Input/layers) and adding Biases.

I want to have your feedback on my code and i am open to any suggestion to speed up the calculations (multiplication and adding operations Preformatted text).

```julia
export evaluate_network_gpu

using CuArrays, CUDAdrv, CUDAnative, ONNX, Flux, BenchmarkTools
CuArrays.allowscalar(false)

#x = [8252.814067267922,-2.783556398033601,-3.0892319654406055,114.57010404854258,102.87107124694514,1.0,3]
#x_c = CuArray(x)

weights = ONNX.load_weights("../../../gpu/weights.bson")

maxs = [96189.14,3.141593,3.141593,275.7858,321.5928,5.0,5.0]
mins = [11.73505,-3.141593,-3.141593,55.54866,12.71186,1.0,1.0]

#loading weights and biases 
d1_k = CuArray(weights["dense_1/MatMul/ReadVariableOp:0"])
d1_b = CuArray(weights["dense_1/BiasAdd/ReadVariableOp:0"])
d2_k = CuArray(weights["dense_2/MatMul/ReadVariableOp:0"])
d2_b = CuArray(weights["dense_2/BiasAdd/ReadVariableOp:0"])
d3_k = CuArray(weights["dense_3/MatMul/ReadVariableOp:0"])
d3_b = CuArray(weights["dense_3/BiasAdd/ReadVariableOp:0"])
d4_k = CuArray(weights["dense_4/MatMul/ReadVariableOp:0"])
d4_b = CuArray(weights["dense_4/BiasAdd/ReadVariableOp:0"])
d5_k = CuArray(weights["dense_5/MatMul/ReadVariableOp:0"])
d5_b = CuArray(weights["dense_5/BiasAdd/ReadVariableOp:0"])
d6_k = CuArray(weights["dense_6/MatMul/ReadVariableOp:0"])
d6_b = CuArray(weights["dense_6/BiasAdd/ReadVariableOp:0"])
d7_k = CuArray(weights["dense_7/MatMul/ReadVariableOp:0"])
d7_b = CuArray(weights["dense_7/BiasAdd/ReadVariableOp:0"])
d8_k = CuArray(weights["dense_8/MatMul/ReadVariableOp:0"])
d8_b = CuArray(weights["dense_8/BiasAdd/ReadVariableOp:0"])
d9_k = CuArray(weights["dense_9/MatMul/ReadVariableOp:0"])
d9_b = CuArray(weights["dense_9/BiasAdd/ReadVariableOp:0"])
d10_k = CuArray(weights["dense_10/MatMul/ReadVariableOp:0"])
d10_b = CuArray(weights["dense_10/BiasAdd/ReadVariableOp:0"])
d11_k = CuArray(weights["dense_11/MatMul/ReadVariableOp:0"])
d11_b = CuArray(weights["dense_11/BiasAdd/ReadVariableOp:0"])
d12_k = CuArray(weights["dense_12/MatMul/ReadVariableOp:0"])
d12_b = CuArray(weights["dense_12/BiasAdd/ReadVariableOp:0"])
d13_k = CuArray(weights["dense_13/MatMul/ReadVariableOp:0"])
d13_b = CuArray(weights["dense_13/BiasAdd/ReadVariableOp:0"])

# a is vector form layer -1 
# b is the weights vector 
# c is bias to add 

function mult_add(a, b, c)
	return relu.(CuArrays.CUBLAS.gemv('N', b, a).+c)
end 

function evaluate_network_gpu(x_c) 
	
	x_c = CuArray(x_c)
	x_c = (x_c-CuArray(mins))./(CuArray(maxs)-CuArray(mins))
	x_c = Float32.(x_c)

	layer1 = mult_add(x_c , d1_k, d1_b) 
	layer2 = mult_add(layer1 , d2_k, d2_b) 
	layer3 = mult_add(layer2 , d3_k, d3_b)
	layer4 = mult_add(layer3 , d4_k, d4_b) 
	layer5 = mult_add(layer4 , d5_k, d5_b) 
	layer6 = mult_add(layer5 , d6_k, d6_b) 
	layer7 = mult_add(layer6 , d7_k, d7_b) 
	layer8 = mult_add(layer7 , d8_k, d8_b) 
	layer9 = mult_add(layer8 , d9_k, d9_b) 
	layer10 = mult_add(layer9 , d10_k, d10_b) 
	layer11 = mult_add(layer10 , d11_k, d11_b) 
	layer12 = mult_add(layer11 , d12_k, d12_b) 
	layer13 = mult_add(layer12 , d13_k, d13_b) 
	return layer13
end

#function vadd(a, b, c)
# i = (blockIdx().x-1) * blockDim().x + threadIdx().x
# c[i] = a[i] + b[i]
# return
#end

```

Thank you

---

<div class="post-metadata">

### Author: ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)
#### Post date: [March 21, 2021, 9:08pm UTC](https://discourse.julialang.org/t/accelerating-computations-neural-network/57670/2 "2021-03-21T21:08:18Z")

</div>

First thing is you should definitely check out julia 1.5.3 (or 1.6rc3). They both will likely be noticeably faster for some operations, and easier to use.

---

<div class="post-metadata">

### Author: ![moby75](https://avatars.discourse-cdn.com/v4/letter/m/ba8739/32.png) [@moby75](https://discourse.julialang.org/u/moby75)
#### Post date: [March 21, 2021, 9:10pm UTC](https://discourse.julialang.org/t/accelerating-computations-neural-network/57670/3 "2021-03-21T21:10:43Z")

</div>

Thank you Oscar, but for some reasons (I am working on a project developed using Julia 1.0.5), I should work with the 1.0.5 version 🙂

---

<div class="post-metadata">

### Author: ![ToucheSir](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/touchesir/32/14411_2.png) [@ToucheSir](https://discourse.julialang.org/u/ToucheSir)
#### Post date: [March 21, 2021, 10:32pm UTC](https://discourse.julialang.org/t/accelerating-computations-neural-network/57670/4 "2021-03-21T22:32:56Z")

</div>

Unfortunately you’ll have to pick one or the other, because both Flux and CUDA rely on new language/compiler features well beyond what 1.0.5 offers.

---

<div class="post-metadata">

### Author: ![lmiq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lmiq/32/18314_2.png) [@lmiq](https://discourse.julialang.org/u/lmiq)
#### Post date: [March 21, 2021, 11:28pm UTC](https://discourse.julialang.org/t/accelerating-computations-neural-network/57670/5 "2021-03-21T23:28:02Z")

</div>

[https://docs.julialang.org/en/v1/manual/performance-tips/](https://docs.julialang.org/en/v1/manual/performance-tips/)

Take a look at this. Particularly the first tip, which you seem to be violating with `mins`, `maxs`, etc.

---

<div class="post-metadata">

### Author: ![moby75](https://avatars.discourse-cdn.com/v4/letter/m/ba8739/32.png) [@moby75](https://discourse.julialang.org/u/moby75)
#### Post date: [March 21, 2021, 11:42pm UTC](https://discourse.julialang.org/t/accelerating-computations-neural-network/57670/6 "2021-03-21T23:42:27Z")

</div>

Thank you…

---

<div class="post-metadata">

### Author: ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)
#### Post date: [March 22, 2021, 7:30am UTC](https://discourse.julialang.org/t/accelerating-computations-neural-network/57670/7 "2021-03-22T07:30:02Z")

</div>

> [@moby75](#):
>
> (I am working on a project developed using Julia 1.0.5), I should work with the 1.0.5 version

The language _per se_ is upward compatible within major versions (ie 1.x). Unless you rely on something very internal, 1.5 should Just Work, and if in the unlikely case you run into difficulties they should be easy to solve. See

> [@Proposed release process and schedule](https://discourse.julialang.org/t/proposed-release-process-and-schedule/15623):
>
> Now that we’ve released Julia 1.0 and are [close to 1.0.1](https://discourse.julialang.org/t/julia-1-0-1-testing-period/15534) and have added some [new features](https://github.com/JuliaLang/julia/pulls?utf8=%E2%9C%93&q=is%3Apr+label%3Aenhancement) and [minor changes](https://github.com/JuliaLang/julia/pulls?utf8=%E2%9C%93&q=is%3Apr+label%3A%22minor+change%22) to the 1.1 development branch (i.e. master), it seems like time to talk about the future of the Julia release process. After various discussions in person, on Slack, and on this week’s triage call, it seems like there’s fairly solid consensus behind the following plan. Patch releases Patch releases increment the last digit of Julia’s version number, e.g. going from 1.0.0 to 1.0.1 curre…
