# Basic NN forward passage: CuArray fine, oneAPI array:

**URL:** <https://discourse.julialang.org/t/basic-nn-forward-passage-cuarray-fine-oneapi-array/116351>\
**Category:** GPU\
**Created:** [June 28, 2024, 10:21am UTC](https://discourse.julialang.org/t/basic-nn-forward-passage-cuarray-fine-oneapi-array/116351 "2024-06-28T10:21:25Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![sylvaticus](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sylvaticus/32/203883_2.png) [@sylvaticus](https://discourse.julialang.org/u/sylvaticus)\
**Post date:** [June 28, 2024, 10:21am UTC](https://discourse.julialang.org/t/basic-nn-forward-passage-cuarray-fine-oneapi-array/116351/1 "2024-06-28T10:21:25Z")

</div>

Hello, I am “testing” GPU programming with a mock forward passage of a basic NN:

```julia
using Test, oneAPI, BenchmarkTools, LinearAlgebra

relu(x) = max(0,x)
forward_layer(x,w,w0,f) = f.(w*x .+ w0)

function forward_network!(y,x,w1,w2,w3,w01,w02,w03,f=relu)
    x1 = forward_layer(x,w1,w01,f)
    x2 = forward_layer(x1,w2,w02,f)
    y .= forward_layer(x2,w3,w03,identity)
    return nothing
end

(nd0,nd1,nd2,ndy) = (200,300,300,1)
x = rand(Float32,nd0); y = Vector{Float32}(undef,ndy)
w1 = rand(Float32,nd1,nd0); w2 = rand(Float32,nd2,nd1); w3 = rand(Float32,ndy,nd2)
w01 = rand(Float32,nd1); w02 = rand(Float32,nd2); w03 = rand(Float32,ndy);

y
forward_network!(y,x,w1,w2,w3,w01,w02,w03,relu)
y

y_g = oneArray{Float32}(undef,ndy)
x_g = oneArray(x)
w1_g = oneArray(w1); w2_g = oneArray(w2); w3_g = oneArray(w3);
w01_g = oneArray(w01); w02_g = oneArray(w02); w03_g = oneArray(w03); 

forward_network!(y_g,x_g,w1_g,w2_g,w3_g,w01_g,w02_g,w03_g,relu)
y_g

y ≈ Array(y_g)

```

When I use CUDA.jl/CuArray it seems to work fine, and I have also nice speed ups when I increase the matrix sizes, but with oneAPI.jl/oneArray as above I have the error:

```julia
ERROR: AssertionError: value_type(decl) == value_type(entry)
Stacktrace:
  [1] emit_function!(mod::LLVM.Module, config::GPUCompiler.CompilerConfig{…}, f::Type, method::GPUCompiler.Runtime.RuntimeMethodInstance; ctx::LLVM.ThreadSafeContext)
    @ GPUCompiler ~/.julia/packages/GPUCompiler/ESxwR/src/rtlib.jl:82
  [2] build_runtime(job::GPUCompiler.CompilerJob; ctx::LLVM.ThreadSafeContext

```

on the `forward_layer` call.

1. Any idea of the reason of the error and how to workaround it ?
2. Other suggestions concerning the code? Is there something in the code above very wrong ?

[EDIT]  
Nevermind, I did instantiate a old (well… few months old…) project. Making a `up` solved the first issue.  
Still, I would like to have comments on the code, as it’s my first GPU code… thanks!

[EDIT 2]  
I still have an issue with the oneAPI version of the code. Running the function the first time I have the “correct” result, but running it further times I get different results and sometime Julia crashes, but never on the first ime (also never with CuArray where I always have the same result as expected). Should I open a bug report on the oneAPI.jl package ?
