One of my favorite games is an older real time strategy game called Company of Heroes; it’s a game that I’ve purchased five copies of. I consider it to be one of the greatest RTS’s of all time. For gaming purposes I run a pair of HD 6850’s in Crossfire. Getting multi-GPU systems to expose their prowess in certain games can be a tall order. Older games or games that were poorly ported to the PC platform tend to have the worst support for this type of gaming PC. Company of Heroes is a game that was originally released back in late 2006. In May of 2007 the game’s developer, Relic, released a patch that added a DirectX 10 codepath to the game’s Essense engine. Nathan Kirsch from Legit Reviews covered the benefits of the patch here.
In addition to being the first production DirectX 10 game, Company of Heroes was also one of the first games to support ATI’s Crossfire dual GPU technology. Needless to say, for late 2007 this game was pretty cutting edge. Anandtech’s Gary Key wrote a CPU review that included benchmarks of the game on different platforms with a pair of HD 4870’s in Crossfire. The point here is that Company of Heroes has been looked to by a significant number of reviewers as a good benchmark, and as a showcase for Crossfire GPU configurations.
A good friend of mine jokingly asked me a few days ago why his frame rates were higher than mine when we played online matches together. I of course told him that he was running the game, on his laptop, at far less stressful settings than I was running the game on my desktop, and that that could account for the difference in frame rates. He sheepishly accepted this answer, but the idea that my Crossfire setup could be challenged by a mere discrete mid-range mobile GPU, even at vastly different settings continued to bother me. So I decided to look into it.
The first thing I noticed was that I actually got higher frame rates in Company of Heroes when I disabled Crossfire than when I had it enabled. This set off a bit of an alarm in my head. I checked my drivers, I checked my physical PC, I played with the different CrossfireX modes in my drivers, but to no avail. So I started searching around in different forums for people that had encountered the same problem.
I came upon a post by a user named “dunk2k” who mentioned that he was trying to trouble shoot the performance of the game on his PC and noticed a certain peculiar file while stumbling around in the games root folders. This particular file was called atimgpud.dll. If we insert some spaces into that file name we can get a pretty accurate estimation of what this library is for; Ati_m_gpu_d_.dll. Basically this library affects how the game interacts with and detects multiple ATI (read: AMD) GPUs. Now the reason this file seemed peculiar to him was its small 40 Kilobyte size. If one were to go into the root directory of another game from the same era, say Crysis, they would find a file with the exact same name, but of a far larger 156 Kilobyte size.
Now what Dunk2k had discovered is that if one were to download a Crossfire detect utility from AMD’s Radeon SDK on AMD’s Developer Central website, and then copy its 212 Kilobyte atimgpud.dll from its x64 folder to Company of Heroes’ root folder, replacing the old 40 Kilobyte file, Crossfire performance would improve significantly.
Initially I though this “fix” would break the game, let alone have any measurable positive effect. But, I tried it anyway.
Lo and behold it worked; And with some pretty decent results to boot. It should also be noted that Company of Heroes forces Vsync, this is why none of the numbers here are over 60 frames per second.
Normally this is where this story would end. It would be a tale of lack luster updates to an aging game that AMD forgot long ago. But a simple thought occurred to me. The file in Crysis’s root directory was only 156 Kilobytes in size and, as Company of Heroes demonstrated, swapping this file out didn’t seem to ruffle any feathers. So I proceeded to replace the existing copy of the atimgpud.dll in Crysis’s root folder with 212 Kilobyte version from AMD’s Crossfire detect utility.
Performance improvement? Check. But there was one snag to my otherwise well executed plan. Some of the distant cloud textures started flashing between a white square, and their properly rendering form. I’ve highlighted the flashing areas below, and you can see a square texture in the center of the screen.
The question at this point became, is the slight drop in visual quality from an occasional flashing cloud texture worth the extra five to ten frames per second? For me the answer was yes. The .dll swap brought my frame rates up from the mid-twenties and into the low thirties reliably. Additionally, in the sections of the game that I prefer playing I didn’t notice any issues.
So now we have two games that could stand to benefit from a simple update to ATI’s old Crossfire detect library. This is becoming a trend.
Next I searched the entirety of my Steam library for any files name atimgpud. The results showed that I owned two more games where this file swapping trick might improve my Crossfire performance. The first of these two games was Call of Juarez: Bound in Blood. Now I’m not going to delve too deeply into the background of this game, but suffice to say that it’s a first person shooter based on Techland’s Chrome 4 engine that received some positive reviews.
Unfortunately, Call of Juarez is a bit of a wash. Performance drops and spikes in different places, but it seems like our Crossfire detect trick is of no use in this title from mid-2009. As far as play-ability goes the game seemed equally snappy on both run thrus. This lack of a significant performance improvement might be due to the game’s relatively newer vintage. But if we were to look only at the games 156 Kilobyte atimgpud.dll file size, it would indicate that there might benefit some from AMD’s larger library. It’s hard to say exactly why we didn’t see the same trend here, because there are just too many unknown variables.
The last game I tried this trick on was Bethesda’s Oblivion. Oblivion uses the same 40 kilobyte version of the atimgpud file as Company of Heroes does. So I assumed that there would be at least some potential for performance improvements in this game.
As you can see performance is anywhere from equal to a few frames per second better than it was with the old library. This positive trend is most noticeable in the higher frame rate, often dialogue based, sections of game play.
Now this is where our story actually ends, with some interesting data. We’ve shown that in a number of games you can increase performance on current, or semi-current, generation hardware in Crossfire configurations by merely replacing a single file. But what we’ve also shown is one of the sad truths about driver support and performance optimization for older games on newer hardware, it’s just not a major focus.
Most reviewers focus not really on benchmarking what games are worth playing, but more on what games push modern PCs the hardest. It’s a bias that’s apparent when you look at how both AMD, and Nvidia, dole out the time of their engineers towards fixing problems on these more “benchmark-able” games. The more likely a game is to be used as a benchmark in a GPU review, the more likely it is that one of our two favorite GPU designers will push out a hotfix or beta driver that improves performance in said game. On its own this is not a bad thing, but when implementing simple fixes, like sending out up to date Crossfire detect libraries to developers, takes a back seat to improving performance with fruit from much higher up in the proverbial tree, you know that you can do better.S|A