JuliaGPU / JuliaGPU/CUDA.jl

Verify loads from global uniqued pointers.

Open
#47 1 comment 0 reactions 0 assignees View on GitHub
cuda kernels enhancement
Dominant language
Julia
Stars
1.4k
Forks
281
Avg merge
1d 7h
Merged PRs (30d)
30

Description

The `kernel` below ends up sneaking a `getelemptr` to a CPU pointer past the verifier.
```julia
using CUDAnative
function kernel()
I = findfirst(isequal(:y), (:x, :y, :z))
nothing
end
```

```
define void @ptxcall_kernel_28() local_unnamed_addr {
entry:
%value_phi.i1 = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** inttoptr (i64 140437212784368 to %jl_value_t addrspace(10)**), align 16, !tbaa !2, !nonnull !7
%0 = addrspacecast %jl_value_t addrspace(10)* %value_phi.i1 to %jl_value_t addrspace(11)*
%1 = icmp eq %jl_value_t addrspace(11)* %0, addrspacecast (%jl_value_t* inttoptr (i64 140437181828360 to %jl_value_t*) to %jl_value_t addrspace(11)*)
br i1 %1, label %julia_kernel_28.exit, label %L8.i.lr.ph

L8.i.lr.ph: ; preds = %entry
br label %L8.i

L8.i: ; preds = %L8.i.lr.ph, %L26.i
%value_phi1.i2 = phi i64 [ 1, %L8.i.lr.ph ], [ %4, %L26.i ]
%2 = icmp eq i64 %value_phi1.i2, 3
br i1 %2, label %julia_kernel_28.exit, label %L19.i

L19.i: ; preds = %L8.i
%3 = icmp ult i64 %value_phi1.i2, 3
br i1 %3, label %L26.i, label %fail.i

L26.i: ; preds = %fail.i, %L19.i
%4 = add nuw nsw i64 %value_phi1.i2, 1
%5 = getelementptr inbounds %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** inttoptr (i64 140437212785040 to %jl_value_t addrspace(10)**), i64 %value_phi1.i2
%value_phi.i = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** %5, align 8, !tbaa !2, !nonnull !7
%6 = addrspacecast %jl_value_t addrspace(10)* %value_phi.i to %jl_value_t addrspace(11)*
%7 = icmp eq %jl_value_t addrspace(11)* %6, addrspacecast (%jl_value_t* inttoptr (i64 140437181828360 to %jl_value_t*) to %jl_value_t addrspace(11)*)
br i1 %7, label %julia_kernel_28.exit, label %L8.i

fail.i: ; preds = %L19.i
call fastcc void @ptx_report_exception(i64 ptrtoint ([13 x i8]* @exception to i64))
call void asm sideeffect "trap;", ""() JuliaGPU/CUDAnative.jl#1
br label %L26.i

julia_kernel_28.exit: ; preds = %L26.i, %L8.i, %entry
ret void
}
```

Nore the `inttoptr` operations. This ends up with a:

```
ERROR: error in running finalizer: CUDAdrv.CuError(code=700, meta=nothing)
CUDA error: an illegal memory access was encountered (code #700, ERROR_ILLEGAL_ADDRESS)
```

and `cuda-memcheck` reports a global load. Took me a while to figure out where this was coming from.

cc: @simonbyrne

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.