Nvidia Opens CUDA Platform, Releases Compiler Source Code
developer.nvidia.com
developer.nvidia.com
The pain is not in compiling GPU code; rather, the pain is in writing good GPU code. The major difference between NVIDIA and AMD (and the major edge NVIDIA has over AMD) is not as much the compiler as it is the libraries.
Of course, I'm biased, because I work at AccelerEyes and we do GPU consulting with our freely available, but not open source, ArrayFire GPU library, which has both CUDA and OpenCL versions.
A viable alternative is to not write the GPU code yourself. Write a code generator in Scala that spits out GPU code in C. For details see Claudio Rebbi's work, which uses Scala as a higher level code genarator for CUDA to solve the Dirac-Wilson equation on the lattice( http://wwwold.jlab.org/conferences/lattice2008/talks/poster/... ). In finance, we are actively looking at CUDA for derivative pricing problems in risk analytics. None of us wants to actually write GPU code in C, and we do have considerable amount of risk analytics work being done in Scala, so a code generator might actually be the way to go.
or am i missing something? how do you see code generators helping you get algorithms right?
Truth is, compilers and code generators are crappy.
If you really want to get good performance, you either have to write your own low-level GPU kernels, or use a library of functions that have already been written at a low-level.
All other hot air, while interesting, has yet to be proven at scale on more than a few limited use cases.
Another disclaimer: I work on this, http://accelereyes.com/arrayfire
Based on practical experience the compilers are pretty good nowadays. The fine details of the kernel do not matter that much. The performance issues tend to float around usage of local memory, bank conflicts and how much one kernel instance does work, which require hand tuning and in these cases the compilers are underperforming. Thankfully the poor kernels are 'just' constant factor in the general time complexity of the algorithm.
On higher level the most important thing is to describe the actual algorithm. If the algorithm is described as serial one there is no automated way (and most likely will not ever be general way) of parallelizing it, except running it to check data dependencies after which you already have the result, and the dependencies can change based on inputs so result of one run cannot be generalized.
This could probably be proved by similar method as with halting. The program calls the autoparallelizer and if the parallelizer says there is no data dependency between 2 parts it will make them dependent, if it says there is it will make them independent.
Thus let it be clear: There is no way whatsoever to take the hard parts away (thinking in parallel). Nothing will take bunch of serial code in and spit parallel programs out.
For what it's worth, we long ago abandoned scala in favor of python for the code generator, just to make it more accessible to others interested in working on the project (generally particle physicists by training): http://lattice.github.com/quda/
One question that I have is whether anyone has looked at adapting or using the IF2 backend of the Sisal programming language [2] for these. I ask because some of the optimization that Theano does reminds me of things that IF2 is supposed to be doing too. Sisal was written with the old school vector machines and supercomputers in mind but has a backend that depends only on the availability of pthreads. I suspect that it might be possible to add support for SSE and its ilk.
What it doesn't answer is who's going to write the compilers and if they will ever happen.
But it does prove NVIDIA is still a player in the many-core game and that there are still a few more rounds to go before there's a winner.
They're "opening the platform". We'll see what they actually do.
However, it's worth noting that the compiler in question is LLVM based. So you can construct your own compiler frontend that generates LLVM IR code that can be compiled for CUDA by their backend. It's very likely that there are some CUDA-specific LLVM intrinsics, so the frontend will not be entirely independent of CUDA compiler licensing terms but at least now you have a somewhat open interchange format to use between your frontend and the CUDA backend.
And, most likely, CUDA will never be done by Mesa/Gallium unless quite a few people porting legacy CUDA get together and make it happen.
OpenCL is a multi-vendor supported actual standard, even Nvidia is part of the Khronos OpenCL group, slightly implying that even Nvidia has admitted defeat.
Note that LLVM already has a (very experimental and not complete) PTX backend [2].
[1] http://developer.download.nvidia.com/compute/cuda/3_0/toolki...
[2] http://llvm.org/releases/3.0/docs/ReleaseNotes.html#whatsnew
Also people working with those devices are often scientists that are eager to share what they found out (if only to say "You're doing it wrong!"). See for example Vasily Volkov's work here http://www.cs.berkeley.edu/~volkov/
(EDIT: the real reason VA-API is used over VDPAU or XvBA is probably pragmatic and related to driver stability)