38

I am trying to understand the OpenCL ecosystem and how Vulkan comes into play.

  • I understand that OpenCL is a framework to execute code on GPUs as well as CPUs, using kernels that may be compiled to SPIR.
  • Vulkan can also be used as a compute-API using the same SPIR language.
  • SYCL is a new specification that allows writing OpenCL code as proper standard-conforming C++14. It is my understanding that there are no free implementations of this specification yet.

Given that,

  • How does OpenCL relate to Vulkan? I understand that OpenCL is higher level and abstracts the devices, but does ( or could ) it use Vulkan internally? (instead of relying on vendor specific drivers)

  • Vulkan is advertised as both a compute and graphics API, however I found very little resources for the compute part. Why is that ?

  • Vulkan has performance advantages over OpenGL. Is the same true for Vulkan vs OpenCl? (OpenCL is sadly notorious to being slower than CUDA.)

  • Does SYCL use OpenCL internally or could it use Vulkan ? Or does it use neither and instead rely on low level, vendor specific APIs to be implemented ?

Jack
  • 2,229
  • 2
  • 23
  • 37
cor3ntin
  • 876
  • 1
  • 7
  • 9
  • In my experience, OpenCL is only slower than CUDA on NVidia cards. I guess this is due to a crappy OpenCL tool chain on NVidia. – barneypitt Mar 28 '18 at 22:05
  • 2
    OpenCL can ONLY be slower on NVidia cards since it doesn't run on other cards. An apples to apples comparison cannot be done. – Daniel Moodie Nov 07 '18 at 15:37

2 Answers2

31

How does OpenCL relates to vulkan ? I understand that OpenCL is higher level and abstracts the devices, but does ( or could ) it uses Vulkan internally ?

They're not related to each other at all.

Well, they do technically use the same intermediate shader language, but Vulkan forbids the Kernel execution model, and OpenCL forbids the Shader execution model. Because of that, you can't just take a shader meant for OpenCL and stick it in Vulkan, or vice-versa.

Vulkan is advertised as both a compute and graphics api, however I found very little resources for the compute part - why is that ?

Because the Khronos Group likes misleading marketing blurbs.

Vulkan is no more of a compute API than OpenGL. It may have Compute Shaders, but they're limited in functionality. The kind of stuff you can do in an OpenCL compute operation is just not available through OpenGL/Vulkan CS's.

Vulkan CS's, like OpenGL's CS's, are intended to be used for one thing: to support graphics operations. To do frustum culling, build indirect graphics commands, manipulate particle systems, and other such things. CS's operate at the same numerical precision as graphical shaders.

Vulkan has a performance advantages over OpenGL. Is the same true for Vulkan vs OpenCl?

The performance of a compute system is based primarily on the quality of its implementation. It's not OpenCL that's slow; it's your OpenCL implementation that's slower than it possibly could be.

Vulkan CS's are no different in this regard. The performance will be based on the maturity of the drivers.

Also, there's the fact that, again, there's a lot of stuff you can do in an OpenCL compute operation that you cannot do in a Vulkan CS.

Does SYCL uses OpenCL internally or could it use vulkan ?

From the Khronos Group:

SYCL (pronounced ‘sickle’) is a royalty-free, cross-platform abstraction layer that builds on the underlying concepts, portability and efficiency of OpenCL...

So yes, it's built on top of OpenCL.

Nicol Bolas
  • 449,505
  • 63
  • 781
  • 982
  • So, at this time, Vulkan does not support computational kernels so, neither opencl or a similar high level compute library can be built on top of it ? I was kinda hopping that OpenCL/Sycl could be implemented on top of vulkan ( since NVIDIA do not seem to support OpenCL 2.x ) – cor3ntin Nov 20 '16 at 15:42
  • 1
    @cor3ntin: What do you expect? NVIDIA maintains a *competitor* to OpenCL. Why would they support it? So long as people are willing to use CUDA to gain access to NVIDIA's hardware, they have no reason to support OpenCL. – Nicol Bolas Nov 20 '16 at 16:14
  • @Nicolas Bolas - OpenCL seems to be plagued by the same issues OpenGL is ( in term of vendor support ) - I hoped that Vulkan was an universal response to that. Furthermore SYCL seems really great ( from a C++ developer perspective, in term of integration in the C++ language ), and I find it really sad that the sole implementer of that is a non-free product - and, that it is not really realistic to implement the spec since there would be no way to make it work on NVIDIA hardware. – cor3ntin Nov 20 '16 at 16:34
  • It is not true that SYCL cannot run on NVidia hardware. The SYCL specification mandates OpenCL as the underlying host API, but does not specify which binary representation is used for the kernels. Some implementations, such as ComputeCpp, uses SPIR in order to target AMD/Intel devices, but there is nothing blocking an implementation to produce PTX and execute SYCL on top of NVidia devices using their existing OpenCL API. – Ruyk Jun 12 '17 at 10:14
  • There is the "Vulkan Kompute" API now which should make it easier to write compute shaders. If one needs to support mobile GPUs, this may be a good option, but otherwise I think OpenCL/SYCL are still the way to go. – paleonix May 11 '22 at 19:28
9

How does OpenCL relates to vulkan ?

They both can pipeline a separable work from host to gpu and gpu to host using queues to reduce communication overhead using multiple threads. Directx-opengl cannot?

  • OpenCL: Initial release August 28, 2009. Broader hardware support. Pointers allowed but only to be used in device. You can use local memory shared between threads. Much easier to start a hello world. Has api overhead for commands unless they are device-side queued. You can choose implicit multi-device synchronization or explicit management. Bugs are mostly fixed for 1.2 but I don't know about version 2.0.

  • Vulkan: Initial release 16 February 2016(but progress from 2014). Narrower hardware support. Can SPIR-V handle pointers? Maybe not? No local-memory option? Hard to start hello world. Less api overhead. Can you choose implicit multi-device management? Still buggy for Dota-2 game and some other games. Using both graphics and compute pipeline at the same time can hide even more latency.

if opencl had vulkan in it, then it has been hidden from public for 7-9 years. If they could add it, why didn't they do it for opengl?(maybe because of pressure by physx/cuda?)

Vulkan is advertised as both a compute and graphics api, however I found very little resources for the compute part - why is that ?

It needs more time, just like opencl.

You can check info aboout compute shaders here:

https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#fundamentals-floatingpoint

Here is an example of particle system managed by compute shaders:

https://github.com/SaschaWillems/Vulkan/tree/master/computeparticles

below that, there are raytracers and image processing examples too.

Vulkan has a performance advantages over OpenGL. Is the same true for Vulkan vs OpenCl?

  • Vulkan doesn't need to synchronize for another API. Its about command buffers synchronization between commandqueues.
  • OpenCL needs to synchronize with opengl or directx (or vulkan?) before using a shared buffer(cl-gl or dx-cl interop buffers). This has an overhead and you need to hide it using buffer swapping and pipelining. If no shared buffer exists, it can run concurrently on modern hardware with opengl or directx.

OpenCL is sadly notorious to being slower than CUDA

It was, but now its mature and challenges cuda, especially with much wider hardware support from all gaming gpus to fpgas using version 2.1, such as in future Intel can put an fpga into a Core i3 and enable it for (soft-x86 core ip) many-core cpu model closing the gap between a gpu performance and a cpu to upgrade its cpu-physx gaming experience or simply let an opencl physics implementation shape it and use at least %90 die-area instead of a soft-core's %10-%20 effectively used area.

With same price, AMD gpus can compute faster on opencl and with same compute power Intel igpus draw less power. (edit: except when algorithms are sensitive to cache performance where Nvidia has upperhand)

Besides, I wrote a SGEMM opencl kernel and run on a HD7870 at 1.1 Tflops and checked internet then saw a SGEMM henchmark on a GTX680 for same performance using a popular title on CUDA!(price ratio of gtx680/hd7870 was 2). (edit: Nvidia's cc3.0 doesn't use L1 cache when reading global arrays and my kernel was purely local/shared memory + some registers "tiled")

Does SYCL uses OpenCL internally or could it use vulkan ? Or does it use neither and instead relies on low level, vendor specific apis to be implemented ?

Here,

https://www.khronos.org/assets/uploads/developers/library/2015-iwocl/Khronos-SYCL-May15.pdf

says

Provides methods for dealing with targets that do not have OpenCL(yet!)

A fallback CPU implementation is debuggable!

so it can fall back to a pure threaded version(similar to java's aparapi).

Can access OpenCL objects from SYCL objects Can construct SYCL objects from OpenCL object

Interop with OpenGL remains in SYCL - Uses the same structures/types

it uses opencl(maybe not directly, but with an upgraded driver communication?), it develops parallel to opencl but can fallback to threads.

from the smallest OpenCL 1.2 embedded device to the most advanced OpenCL 2.2 accelerators

huseyin tugrul buyukisik
  • 11,469
  • 4
  • 45
  • 97