By eloj 11 Comments
"I felt compelled to also include the last version of Bullet (2.81), to provide an objective external reference. The thing is, there are many people out there who still think that “PhysX is not optimized for CPU”, “PhysX does not use SIMD”, “PhysX is crippled on purpose”, and so on."
Let me first make it clear that I'm far from an expert in physics engines, and I'm not even that up to date with the latest in the business. I'm pretty sure though that PhysX is still CUDA only as far as GPUs go, meaning it's nVidia hardware only. The rest of my argument rests on that basis.
Though the benchmarks clearly proves that each version of PhysX is faster on the CPU, it doesn't adequately disprove the idea that nVidia have engaged in 'crippling of PhysX' in games.
The problem here is that you probably don't want to run your physics on the CPU to begin with, and as far as I know, there is no publicly available OpenCL backend for PhysX, though I'm sure they have one internally. When I've heard PhysX critiqued, it is this that is the point. It's all very well that PhysX is faster than the competition on the CPU, but what matters to gamers is scenarios where you have CPU and GPU available.
In gaming, nVidia and AMD have about 85% of the market between them. Both losing ground to Intel recently. Simply put, if you belong to the 33% that run an AMD GPU and have your physics run on the CPU where the nVidia owners get to run on the GPU, certainly it's valid to say that PhysX is crippled in this respect, especially if the competition will run on the GPU on both nV and AMD.
The benchmarks as presented only show that PhysX is fast on the CPU in the best case, but it doesn't show that it can't be made to be slow, for instance by artificially resource-starving it. For instance, in a "TWIMTBP" game, nVidia may have instructed the physics to use a maximum of one or two extra threads on the CPU, even if more were readily available. In fact, that they're fast on the CPU could encourage them to cripple an integration just to make sure the CPU path can't catch up with the GPU path even on the fastest of machines.
"Some early investigations into PhysX performance showed that the library uses only a single thread when it runs on a CPU. This is a shocker for two reasons. First, the workload is highly parallelizable, so there's no technical reason for it not to use as many threads as possible; and second, it uses hundreds of threads when it runs on an NVIDIA GPU. So the fact that it runs single-threaded on the CPU is evidence of neglect on NVIDIA's part at the very least, and possibly malign neglect at that." -- Ars Technica, 2010
It would take someone posting game and/or driver disassembly AND benchmarks from a recent title to prove nVidia in the wrong. Again.
PhysX on Next-Gen
It's worth thinking about this in the context of the "next-generation of consoles" rolling out later this year. We know with a fair amount of certainty that they will both use AMD APU parts, so PhysX will almost certainly NOT run on the GPU on them as long as nVidia insists that PhysX should be CUDA only.
I can see three scenarios.
- nVidia gives up on the physics engine market.
- nVidia provides an OpenCL backend for all platforms.
- nVidia special-license GPU-version for the consoles.
(1) is unlikely, (2) would be great for everyone involved, but nVidia being nVidia I wouldn't be surprised to see them take the third options; crippling PhysX on the PC where they (think they) can use it for marketing, but giving in where required to be able to compete at all.
Actually a (4) where everyone come together around a common API would be the best outcome, but it's my view that only MS could push something like that through, and then it'll be some DirectX specific hackery that'll be useless for cross-platform and then what was the point?
On these things and more, the future will tell.
EDIT: @Ken_Addison linked to this press release: "NVIDIA Announces PhysX and APEX Support for Sony PlayStation 4". From the wording it appears as though PhysX will run on the CPU only on the PS4. I should have listed this as an option since it's the most obvious one. Let's call it option 0.