# CLBlast, a tuned OpenCL BLAS library

**URL:** https://discourse.julialang.org/t/clblast-a-tuned-opencl-blas-library/13082
**Category:** GPU
**Tags:** gpu, gpuarrays
**Created:** [August 9, 2018, 11:26am UTC](https://discourse.julialang.org/t/clblast-a-tuned-opencl-blas-library/13082 "2018-08-09T11:26:29Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![ranocha](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ranocha/32/35588_2.png) [@ranocha](https://discourse.julialang.org/u/ranocha)
#### Post date: [August 9, 2018, 11:26am UTC](https://discourse.julialang.org/t/clblast-a-tuned-opencl-blas-library/13082/1 "2018-08-09T11:26:29Z")

</div>

I’ve written a wrapper for [CLBlast](https://github.com/CNugteren/CLBlast), a " tuned OpenCL BLAS library", which can be found at [GitHub - ranocha/CLBlast.jl: Julia wrapper of CLBlast, a "tuned OpenCL BLAS library".](https://github.com/ranocha/CLBlast.jl). Most parts seem to work and there is a performance benefit compared to [CLBLAS.jl](https://github.com/JuliaGPU/CLBLAS.jl), e.g.

```julia
$ julia examples/matrix_matrix_multiplication.jl 

m = 1024, n = 1024, k = 1024, eltype = Float32
BLAS:
BenchmarkTools.Trial: 
  memory estimate: 0 bytes
  allocs estimate: 0
  --------------
  minimum time: 4.199 ms (0.00% GC)
  median time: 4.849 ms (0.00% GC)
  mean time: 4.854 ms (0.00% GC)
  maximum time: 29.058 ms (0.00% GC)
  --------------
  samples: 1029
  evals/sample: 1
----------------------------------------------------------------------
Platform name : NVIDIA CUDA
Platform version: OpenCL 1.2 CUDA 9.1.84
Device name : GeForce GTX 1070 Ti
Device type : gpu

CLBLAS:
BenchmarkTools.Trial: 
  memory estimate: 1.14 KiB
  allocs estimate: 52
  --------------
  minimum time: 7.463 μs (0.00% GC)
  median time: 853.560 μs (0.00% GC)
  mean time: 837.311 μs (0.00% GC)
  maximum time: 1.305 ms (0.00% GC)
  --------------
  samples: 1493
  evals/sample: 4
CLBlast:
BenchmarkTools.Trial: 
  memory estimate: 192 bytes
  allocs estimate: 7
  --------------
  minimum time: 722.555 μs (0.00% GC)
  median time: 737.823 μs (0.00% GC)
  mean time: 744.368 μs (0.00% GC)
  maximum time: 1.704 ms (0.00% GC)
  --------------
  samples: 6709
  evals/sample: 1

```

Is there some interest to have such a wrapper in JuliaGPU? It could also be possible to use CLBlast for CLArray.jl etc.

---

<div class="post-metadata">

### Author: ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)
#### Post date: [August 9, 2018, 12:50pm UTC](https://discourse.julialang.org/t/clblast-a-tuned-opencl-blas-library/13082/2 "2018-08-09T12:50:01Z")

</div>

This looks awesome! Thanks @ranocha. Have you tested it on PDE work yet?

---

<div class="post-metadata">

### Author: ![ranocha](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ranocha/32/35588_2.png) [@ranocha](https://discourse.julialang.org/u/ranocha)
#### Post date: [August 9, 2018, 1:03pm UTC](https://discourse.julialang.org/t/clblast-a-tuned-opencl-blas-library/13082/3 "2018-08-09T13:03:30Z")

</div>

One of my main motivations has been to enable IterativeSolvers.jl for CLArray.jl. Therefore, `dot` and `nrm2` have to be implemented, which is better with CLBlast than with CLBLAS. The methods still have to be added to CLArray.jl. I haven’t tested the matrix multiplication etc. for PDEs, because I use custom OpenCL kernels instead.

---

<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: [August 9, 2018, 1:13pm UTC](https://discourse.julialang.org/t/clblast-a-tuned-opencl-blas-library/13082/4 "2018-08-09T13:13:54Z")

</div>

It might make sense to integrate this functionality with CLArrays, like we’ve been integrating CuBLAS/Cu\* into CuArrays (cc @sdanisch).

---

<div class="post-metadata">

### Author: ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)
#### Post date: [August 9, 2018, 2:50pm UTC](https://discourse.julialang.org/t/clblast-a-tuned-opencl-blas-library/13082/5 "2018-08-09T14:50:17Z")

</div>

> [@ranocha](#):
>
> minimum time: 7.463 μs (0.00% GC) median time: 853.560 μs (0.00% GC)

Really?

---

<div class="post-metadata">

### Author: ![ranocha](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ranocha/32/35588_2.png) [@ranocha](https://discourse.julialang.org/u/ranocha)
#### Post date: [August 9, 2018, 2:52pm UTC](https://discourse.julialang.org/t/clblast-a-tuned-opencl-blas-library/13082/6 "2018-08-09T14:52:10Z")

</div>

I know, this is really weird. I think there is some error in the test with CLBLAS. 7.463 μs is just too fast. The median times seem to be okay, also in other tests.

---

<div class="post-metadata">

### Author: ![ranocha](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ranocha/32/35588_2.png) [@ranocha](https://discourse.julialang.org/u/ranocha)
#### Post date: [August 9, 2018, 2:54pm UTC](https://discourse.julialang.org/t/clblast-a-tuned-opencl-blas-library/13082/7 "2018-08-09T14:54:22Z")

</div>

The ownership of CLBlast.jl has been transferred to JuliaGPU: [https://github.com/JuliaGPU/CLBlast.jl](https://github.com/JuliaGPU/CLBlast.jl).
