FreeBSD has a(nother) new C compiler: Intel oneAPI DPC++/C++
briancallahan.net
briancallahan.net
Previous release miscompiled Python [1]
Current release miscompiles bison [2]
It's also the type of compiler that defaults to -ffast-math to look good in benchmarks (well, all vendor compilers do). That breaks many packages that rely on signalling NaNs, or use e.g. Kahan summation for stable math with IEEE floats.
It's caught in the Spack package manager because it's probably one of the few package managers that lets users pick their own compiler for a full software stack.
[1] https://github.com/spack/spack/issues/38724 and https://github.com/python/cpython/issues/106424
[2] https://github.com/spack/spack/issues/37172#issuecomment-181...
First issue was resolved, the bison issue is still pending.
> It was a compiler bug. The test now passes when cpython is built with an internal build. The next compiler release (likely 2024.0) should have the fix.
So I wouldn't recommend running FreeBSD on oneAPI in production just yet, but I give them some credit & celebrations for reaching a milestone.
Also note that before Intel oneAPI there was the now deprecated Intel Classic Compiler (icc), which also had bugs, since 2003.
In my opinion it's unlikely that a closed source vendor compiler will ever be on the same level as gcc and clang.
It will never be tested as much, and it's hard to make actionable bug reports for closed source software.
Being based on LLVM is of course a good choice... hopefully fewer bugs.
Fwiw icc once had a reputation for being fast but I never thought high of their software. Only hands on experience I had was with Intel Media SDK where even basic stuff, like finding a legal download, hardware requirements and installation guidance was tough. And then each iteration both software and hardware was deprecated faster than Google can dream to abandon their products.
Aside from some GUI scaling issues on Linux, I was really impressed by Intel Vtune.
Also, some of their low level libraries like Xed and Pin Tools are pretty cool, and seemed (last I looked) well-maintained.
Plenty of bugs in gcc and llvm. I'm really sure a closed source compiler could be higher quality. Probably not in the C++ world, but I expect there's an ADA compiler out there that gets the answer right whatever the source code is.
But it's a problem of the language really.
Alias analysis in Fortran is much easier than in C / C++.
Also I'm reasonably sure that Rust's borrow checker could be used for alias analysis and improve performance without making unsafe assumptions, no clue if that is actually done.
For reordering of floating point numbers, there should just be clear demarcations in code where it's safe. It's ridiculous that `-ffast-math` works on the level of the command line. But I think that ship has sailed, cause although clang has supports pragma's, it's not a standard:
#pragma clang fp exceptions(strict)Futhark is probably very good at vector operations.
Fast-math has crazy things like setting it for one file affects other files. Last time I checked a more reasonable alternative set of constructs were being considered/implemented. Other faster-but-kindof-wrong things like assuming signed integers don't overflow exist too. Agreed that they're all less alarming when locally scoped.
An ownership/borrowing system is able to implicitly fulfill the requirements of restrict.
Not sure if they're still doing that, but in the early days of Clear Linux they were using -ffast-math on everything they compiled, as a way to give their distro a big performance boost over competition, too.
But in benchmarks you sometimes see like a 4x speedup compared to ubuntu, which is obviously not due to superior compilers.
For example:
https://github.com/phoronix-test-suite/phoronix-test-suite/i...
Actually you only need to have a relatively complete linux under /compat/linux. You could even chroot into that and do the oneapi install.
The trillion dollar question is: can you get the intel discrete gpu to work, compiling for and running on the gpu?
see https://techreport.com/news/does-intels-compiler-cripple-amd...
[update] and https://old.reddit.com/r/Amd/comments/440ze8/amd_cpus_and_in...
[0]https://medium.com/@edlyuu/zig-c-c-compiler-wtf-is-zig-c-790...
We might even get a new and more robust libc - maybe one that even supports static compilation.
How much benefit did Intel expect to reap from rewriting an LLVM x64 compiler backend from the ground up?
How is this significantly better than the existing tools for compiling C into GPU and FPGA code?
It would help if Intel published some kind of chalk talk with a live demo showing how much faster you can build HPC applications using their new toolkit.
I'm not summarily writing it off, but I need a little convincing before I put 20+ hours into trying it out myself.
"This compiler consists of a custom LLVM frontend and backend. The backend compiles LLVM IR code into machine code consisting of x86_64 instructions and Intel GPU code. The frontend works in conjunction with the backend to compile C and C++ code with special optimization which when enabled, compiles OpenMP routines into hardware-accelerated code targeting Intel GPUs, FPGAs, or AMD and NVIDIA GPUs."
As someone who only used OpenMP academically, I don't see much of a point in that. In the post C++11 world, where we can write type-safe compile-time code, preprocessor macro definitions should stay in C code.
Until Intel GPUs are at least competitive with the big boys, interop with their products doesn't concern me a whole hell of a lot. I'm not going to plan my scientific computing applications around the integrated graphics found on cheap Wintel consumer devices.
It's worth noting that OpenMP pragmas are a totally different thing to C preprocessor macros. A pragma like 'omp target parallel for' means something like "take the following loop, build a GPU kernel out of it, arrange for data to be copied back and forth and to launch that kernel when control flow gets here, and arrange to link in all the openmp libraries and also run a bunch of compiler optimisations". A macro means "replace these tokens with these other ones".
OpenMP is essentially a really big runtime library dealing with threads, scheduling execution, running code on GPUs and so forth. It is sort-of usable in that form. If you're determined then making calls directly into libomp.so and libomptarget.so will make your will a reality. All the pragma syntax is about transforming application code into a lot of calls into that library with appropriately constructed tables of data. And then the compiler works hard to optimise this, e.g. removing calls that don't need to happen, simplifying others, deduplicating some.
Syntactically OpenMP is a really good fit for Fortran. The invocations look completely appropriate there. For C++, it does tend to upset the sensibilities of the programmers. I personally think it's wildly funny for people who are content with the syntactic horror show of C++ to decide the OpenMP extensions are ugly but there we go, normalisation of deviance and all that.
On a more philosophical level, and what drew me to implementing OpenMP originally, CUDA is a problem. Not only in the vendor lock to nvidia sense - it's also a deeply nasty language to program with. I especially dislike the warp intrinsics - they take a bitmap corresponding to the CFG of your program, which you are supposed to compute manually (across branches, loops and so forth) and pass around into library functions. GPUs are excellent machines and I want to be able to program them in something which is not CUDA.
I'm familiar with compiler intrinisics (e.g. __sync_add_and_fetch), but I just assumed (incorrectly) that "#pragma omp_parallel_for" was just a macro that adds pthread API calls into a for loop to create new threads and join when finished.
>Syntactically OpenMP is a really good fit for Fortran.
I can get on board with Fortran for the niche of scientific computing, although again my qualms are with using it in C++. Too many people say they know C++, but then write "C++" code with raw pointers. I don't use C++17 for performance, and most "zero-cost abstractions" are a lie; I use it for type safety. If you buy into the modern C++ way, you'll catch a lot of stuff at compile time that systems programmers using C and web devs using a litany of other weakly or dynamically-typed languages catch in their production environment.
>syntactic horror show of C++
Other than "string" not being a native type, I'd reckon what you really hate is not the syntax itself, but the compiler errors. Granted, if you hire the kind of people who post on Stack Overflow, you can get wacky shit like this:
template<typename Testicle, typename... Diseases> static std::optional<std::tuple<Diseases...>> deeply::nested::namespaced::classes::suck_balls(const Testicle& left_nut, Testicle&& right_nut) noexcept; // Is "classes" a class or another namespace?
But I've had to fix other peoples' spaghetti code in 4 other languages, so I stopped blaming the language many moons ago.
>what drew me to implementing OpenMP originally, CUDA is a problem
Did you try Vulkan Compute, and if so what problems did you run into? 200+ lines of "setup" code, similar to OpenCL programming?
I ask because the entirety of my systems programming career was not speeding up number crunching, but reducing IPC and making things run asynchronously.
And on their own hardware the compiler is often significantly better.[2] This was part of their competitive advantage.
2x better is also a lot. It means that you only have to buy half as many servers. Even much smaller improvements are often worthwhile.
[1]: https://en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Release... [2]: https://www.intel.com/content/www/us/en/developer/tools/onea...
I specifically drew the line at 2x.
>It means that you only have to buy half as many servers.
That's what I said in my initial comment: "Whether that means requiring half as much hardware to do the same job or requiring half as much manpower to use..."
But even if I didn't already point that out, I'm curious how you would react in your everyday life if all the people you interact with were as insufferably pedantic as you.