# Illegal memory access problem CUDA

**URL:** https://discourse.julialang.org/t/illegal-memory-access-problem-cuda/71836
**Category:** GPU
**Created:** [November 20, 2021, 5:28pm UTC](https://discourse.julialang.org/t/illegal-memory-access-problem-cuda/71836 "2021-11-20T17:28:35Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![Jakub\_Mitura](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jakub_mitura/32/19496_2.png) [@Jakub\_Mitura](https://discourse.julialang.org/u/Jakub_Mitura)
#### Post date: [November 20, 2021, 5:28pm UTC](https://discourse.julialang.org/t/illegal-memory-access-problem-cuda/71836/1 "2021-11-20T17:28:35Z")

</div>

I am creating some dynamic shared memory boolean arrays in kernel, and it give me consistently

```julia
ERROR: LoadError: CUDA error: an illegal memory access was encountered (code 700, ERROR_ILLEGAL_ADDRESS)
Stacktrace:
 [1] throw_api_error(res::CUDA.cudaError_enum)
   @ CUDA C:\Users\1\.julia\packages\CUDA\9T5Sq\lib\cudadrv\error.jl:105
 [2] query
   @ C:\Users\1\.julia\packages\CUDA\9T5Sq\lib\cudadrv\stream.jl:102 [inlined]
 [3] synchronize(stream::CuStream; blocking::Bool)
   @ CUDA C:\Users\1\.julia\packages\CUDA\9T5Sq\lib\cudadrv\stream.jl:130
 [4] synchronize (repeats 2 times)
   @ C:\Users\1\.julia\packages\CUDA\9T5Sq\lib\cudadrv\stream.jl:117 [inlined]
 [5] unsafe_copyto!(dest::Vector{UInt16}, doffs::Int64, src::CuArray{UInt16, 1, CUDA.Mem.DeviceBuffer}, soffs::Int64, n::Int64)
   @ CUDA C:\Users\1\.julia\packages\CUDA\9T5Sq\src\array.jl:389
 [6] copyto!
   @ C:\Users\1\.julia\packages\CUDA\9T5Sq\src\array.jl:349 [inlined]
 [7] getindex(xs::CuArray{UInt16, 1, CUDA.Mem.DeviceBuffer}, I::Int64)
   @ GPUArrays C:\Users\1\.julia\packages\GPUArrays\3sW6s\src\host\indexing.jl:89
 [8] top-level scope
   @ c:\GitHub\GitHub\NuclearMedEval\src\playgrounds\convolutionsPlay.jl:71

```

I am wondering what is wrong here - my assumption is that true size of boolean array in bytes is amount of its entries divided by 8 so 1 bit per entry - am I correct?

```julia

using CUDA
dataBdim= (32,24,32)
fp = CUDA.zeros(UInt16,1)
sumInBits = (dataBdim[1]+2)+(dataBdim[2]+2)+(dataBdim[3]+2)+dataBdim[1]+dataBdim[2]+dataBdim[3]
shmemSum = cld(sumInBits,8)#in bytes
function testKernelA(dataBdim,fp)
    resShmem = @cuDynamicSharedMem(Bool,((dataBdim[1]+2),(dataBdim[2]+2),(dataBdim[3]+2))) 
       sourceShmem = @cuDynamicSharedMem(Bool,(dataBdim[1],dataBdim[2],dataBdim[3]))
    # naive loop just for presentation of problem
    for i in 1:(dataBdim[1]+2),j in 1:(dataBdim[2]+2), n in 1:(dataBdim[3]+2)
        resShmem[i,j,n]=false
    end
 
    for i in 1:(dataBdim[1]),j in 1:(dataBdim[2]), n in 1:(dataBdim[3])
        sourceShmem[i,j,n]=false
    end
    fp[1]=1
return
end
@cuda threads=(32,5) blocks=(2) shmem=shmemSum testKernelA(dataBdim,fp)
fp[1]

```

---

<div class="post-metadata">

### Author: ![maleadt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maleadt/32/10097_2.png) [@maleadt](https://discourse.julialang.org/u/maleadt)
#### Post date: [November 22, 2021, 7:04am UTC](https://discourse.julialang.org/t/illegal-memory-access-problem-cuda/71836/2 "2021-11-22T07:04:46Z")

</div>

> [@Jakub\_Mitura](#):
>
> `sumInBits = (dataBdim[1]+2)+(dataBdim[2]+2)+(dataBdim[3]+2)+dataBdim[1]+dataBdim[2]+dataBdim[3]`

How is this ‘in bits’ if you’re nowhere multiplying by `sizeof(UInt16)` (or `8*sizeof` if you actually want this size to be bits)?

---

<div class="post-metadata">

### Author: ![Jakub\_Mitura](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jakub_mitura/32/19496_2.png) [@Jakub\_Mitura](https://discourse.julialang.org/u/Jakub_Mitura)
#### Post date: [November 22, 2021, 6:07pm UTC](https://discourse.julialang.org/t/illegal-memory-access-problem-cuda/71836/3 "2021-11-22T18:07:51Z")

</div>

You are right still changing it to

```julia
sumInBits = (dataBdim[1]+2)*(dataBdim[2]+2)*(dataBdim[3]+2)+dataBdim[1]*dataBdim[2]*dataBdim[3]

```

do not solve the problem, but is size of needed if this is boolean array? is it not just bitarray?

---

<div class="post-metadata">

### Author: ![maleadt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maleadt/32/10097_2.png) [@maleadt](https://discourse.julialang.org/u/maleadt)
#### Post date: [November 23, 2021, 6:55am UTC](https://discourse.julialang.org/t/illegal-memory-access-problem-cuda/71836/4 "2021-11-23T06:55:34Z")

</div>

There’s still no `sizeof` in that expression? And it is needed, `CuArray{Bool}` doesn’t have the same bitarray-like optimization implemented.

Also, try out CUDA.jl#master, there the dynamic memory accesses are bounds checked so will throw a BoundsError instead of crashing CUDA with an illegal memory access.

---

<div class="post-metadata">

### Author: ![Jakub\_Mitura](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jakub_mitura/32/19496_2.png) [@Jakub\_Mitura](https://discourse.julialang.org/u/Jakub_Mitura)
#### Post date: [November 23, 2021, 9:23am UTC](https://discourse.julialang.org/t/illegal-memory-access-problem-cuda/71836/5 "2021-11-23T09:23:51Z")

</div>

Ok, so can I use bit type in shared memory ?

And what do you mean by master, I suppose you deduced that I am using some branch, what is not intended by me , I had found somewhere that shared memory initialization macro should now be a function - this is what you mean ?

Thanks !

---

<div class="post-metadata">

### Author: ![carstenbauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/carstenbauer/32/4981_2.png) [@carstenbauer](https://discourse.julialang.org/u/carstenbauer)
#### Post date: [November 23, 2021, 10:01am UTC](https://discourse.julialang.org/t/illegal-memory-access-problem-cuda/71836/6 "2021-11-23T10:01:00Z")

</div>

> [@Jakub\_Mitura](#):
>
> And what do you mean by master

The [master branch on GitHub](https://github.com/JuliaGPU/CUDA.jl/tree/master), i.e. `] add CUDA#master`

You’re probably on [the latest stable release](https://github.com/JuliaGPU/CUDA.jl/releases/tag/v3.5.0) (if you didn’t do anything fancy).

---

<div class="post-metadata">

### Author: ![Jakub\_Mitura](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jakub_mitura/32/19496_2.png) [@Jakub\_Mitura](https://discourse.julialang.org/u/Jakub_Mitura)
#### Post date: [November 23, 2021, 10:09am UTC](https://discourse.julialang.org/t/illegal-memory-access-problem-cuda/71836/7 "2021-11-23T10:09:44Z")

</div>

Ok , thanks

---

<div class="post-metadata">

### Author: ![Jakub\_Mitura](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jakub_mitura/32/19496_2.png) [@Jakub\_Mitura](https://discourse.julialang.org/u/Jakub_Mitura)
#### Post date: [November 24, 2021, 6:00am UTC](https://discourse.julialang.org/t/illegal-memory-access-problem-cuda/71836/8 "2021-11-24T06:00:59Z")

</div>

So I already understand it i suppose 🙂, still is there a way to use 3 dimensional bit array in shared memory ? It would be extremely usefull .

---

<div class="post-metadata">

### Author: ![maleadt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/maleadt/32/10097_2.png) [@maleadt](https://discourse.julialang.org/u/maleadt)
#### Post date: [November 24, 2021, 7:22am UTC](https://discourse.julialang.org/t/illegal-memory-access-problem-cuda/71836/9 "2021-11-24T07:22:11Z")

</div>

No, the BitArray optimization has not been implemented for CuArray. Just use a regular Bool array. If space is a problem, you’ll need to look into implementing BitArray’s packed layout.
