Build your own Ethereum Mining Rig, part 4: Optimization

Same hardware: before (top) and after (bottom) GPU BIOS mods. Click to enlarge.

This fourth installment of our Ethereum mining guide will focus on optimizing your rig’s performance via GPU clock speed and voltage setting tweaks to achieve maximum efficiency.

The tweaks that I outline in this article are applicable whether you’re using Linux or Windows. If you’re using the hardware that was recommended in the first part of this guide (or very similar hardware), you should expect to achieve Ether mining performance gains of 20-25%, compared to stock settings! At the same time, you’ll reduce power consumption by 10-15% (and consequently, lower GPU temperature and fan noise).

More speed for less power—how is that possible? Click “read more” to find out, in our mining performance optimization guide!

 Build an Ethereum Mining Rig, part 4: Optimization

Let’s get the bad news out of the way up front: achieving these levels of performance gain require flashing your GPU BIOS with custom replacements. Doing this incorrectly may leave you with a non-working GPU that can be difficult or (sometimes) impossible to restore to factory settings. The steps that I outline in my guide will show you how to minimize the risk that you end up with a bricked GPU, but always remember that messing around with BIOS settings can potentially result in unstable hardware.

Disclaimer: Installing a custom BIOS and/or changing factory clock speed & voltage settings on your graphics card(s) may cause system instability, may harm your hardware, and probably invalidates your warranty. I assume no responsibility for hardware damage if you choose to follow this guide!

With that said, I’ve flashed probably close to a hundred GPUs, and I haven’t destroyed any hardware yet. =) If you proceed, just make sure to follow the steps in order, don’t take any shortcuts, and stop if there is anything that you’re confused or unsure about.

What you’ll need

There are ways to create and flash custom BIOS mods to your GPUs without some of these things, but I believe this method is by far the most user-friendly:

  • A computer running Windows
    You’ll flash your GPUs with this computer. My mining rigs run Linux, but I keep a small/cheap SSD loaded with Windows 10 handy for testing/BIOS flashing purposes (I simply swap the SATA connector between disks when I want to switch OSes). Any version of Windows 7, 8, or 10 will work fine (note that you don’t have to activate Windows to install it). Or, you can simply temporarily move your GPUs to another computer running Windows to flash them.
  • ATIFlash / ATIWinFlash
    You can download the latest version of ATIFlash here (v2.74 at the time of this article). We’ll use this to read and write BIOS files to our GPU hardware.
  • Polaris BIOS editor
    You can download the latest version of Polaris BIOS editor here (v1.4.1 at the time of this article). We’ll use this to modify BIOS files.
  • ATI Pixel Clock Patcher
    You can download the latest version of ATI Pixel Clock Patcher here (v1.4.5 at the time of this article). We’ll need this to get AMD’s Windows driver to recognize a modded BIOS.
  • A Kill-a-Watt electricity usage monitor (or similar device)
    Not strictly required, but I highly recommend this—it’ll pay for itself! I have two of these and consider them invaluable in dialing in the performance of my mining rigs. When doing optimization tests, I often find that the last few percentage points of speed gain come at a much larger cost in power consumption (and thus, a decrease in overall profitability)—having an electricity monitor allows me to find the efficiency sweet spot between raw speed and electricity usage.
  • Some baseline information on each of your GPU’s factory performance to compare your modifications against. If you haven’t already, let each GPU run for 5+ of mining and record its speed, temperature/fan speed, and power consumption at the wall (assuming you have a Kill-a-Watt). This will be immensely useful later when trying to figure out if your mods are beneficial or not.

From this point on, I’m going to assume that you’re following directions on a Windows computer with the above software available, ideally with a Kill-a-Watt connected for testing. I’m also going to assume that you have a single GPU installed. If you have multiple GPUs, I highly recommend that you disconnect all but one, and work on them one at a time. All of the software does support multiple GPUs, but you’ll keep confusion and the potential for mistakes to a minimum by only connecting one video card at a time. The times that I’ve made mistakes with BIOS flashing, it has always been because I flashed the wrong card due to having multiple GPUs connected!

Step 1: Make a backup of your factory GPU BIOS

Saving your GPU BIOS with ATIWinFlashBefore we start, open your Radeon Settings and disable any overclocking/undervolting that you have set up through WattMan (if you followed my Windows setup guide, you’ll need to temporarily disable the “EthDcrMiner64” profile that you created in step 12). After that:

  • Open ATIWinFlash (extract the .zip file you downloaded and double-click ATIWinflash.exe).
  • You should see your GPU detected at the top under “System Video Devices”. Again, I highly recommend that you have only a single GPU connected for this entire process!
  • Click “Save” to make a backup of your GPU’s BIOS data. Don’t lose this file!

Your computer might appear to freeze for a few seconds while your GPU BIOS data is being saved—this is normal. When ATIWinFlash is done, you can close it for now.

Step 2: Open your GPU’s factory BIOS with Polaris BIOS editor

Here is where we’re going to be making all of our modifications. Editing the BIOS data gives us access to a few values that we normally wouldn’t have any control over—most importantly, the memory timing values.

  • Open Polaris BIOS Editor (extract the .zip file you downloaded and double-click PolarisBiosEditor.exe).
  • Click “OPEN BIOS” in the top left, then browse to where you saved your GPU’s factory BIOS in step 1, and double-click it to open it.

You should see something like the image below (click for full-size). I’ve highlighted the areas that we’ll be modifying in blue—if you stick to these areas, you’ll generally be safe from getting yourself into too much trouble, as the GPU doesn’t enter these states until it’s mining or otherwise working hard. Note that the first entries in the “GPU” and “Memory” section are outside of the blue area and should never be touched unless you absolutely know what you’re doing. Likewise, the memory timings at 1500mhz and below should usually be left at default settings.

Factory BIOS in Polaris BIOS editor
My screenshot shows the default BIOS from an Asus 1650mhz factory-clocked RX 470 4GB GPU. If you have a 4GB RX 470, it should look pretty similar, although many of the values will likely differ by a small amount. At these factory settings, I get around 20 Mh/s in Claymore’s Ethereum miner, which isn’t spectacular.

If you don’t see memory timing values for your card, try this version of Polaris instead (click the “clone or download” button, then “Download ZIP”).

When you’re comfortable, let’s move on and start modifying some values.

Step 3: Modify BIOS memory timing values

At this point, you should still have Polaris BIOS editor open, with your GPU’s factory default BIOS loaded. We’re going to focus on the lower-right corner area containing memory timings.

If you have a RX 470/480 that has memory clocked at 1750mhz or less (eg: most 4GB cards), you may have noticed that it’s really easy to overclock past 1750mhz via the driver (in Windows, anyway). You probably also noticed that mining performance immediately tanks as soon as you do so: a 1751mhz overclock results in much slower performance than 1750mhz. You may have wondered why, and these memory timings are the answer. On most 4GB cards, the GPU switches over to less aggressive memory timings at clock speeds beyond 1750mhz, which results in slower performance even though the absolute clock speed is higher. We’re aiming to fix that.

This isn’t an exact science, and some experimentation may be necessary for you to achieve optimal results, but what follows is a good starting point and should work for 99% of you:

  • If you have a RX 470/480 that is factory clocked at 1750Mhz or less (eg: nearly all 4GB cards):
    Copy the value in the 1500Mhz field, and then paste it into all of the fields after it (1625mhz, 1750mhz, 2000mhz). The easiest way to do this is to click anywhere inside the 1500mhz value, then press CTRL+A to highlight the entire string, and then press CTRL+C to copy it. Then you can simply click into the remaining fields and press CTRL+A followed by CTRL+V to paste over the existing value.
  • If you have a RX 470/480 that is factory clocked at 2000Mhz or more (eg: nearly all 8GB cards):
    This is a bit trickier, but generally most cards will be most stable by simply copying the value in the 1750mhz field into the 2000mhz field. The easiest way to do this is to click anywhere inside the 1750mhz value, then press CTRL+A to highlight the entire string, and then press CTRL+C to copy it. Then you can simply click into the 2000mhz field and press CTRL+A followed by CTRL+V to paste over the existing value.

Once you’ve made the edit that is appropriate for your GPU, click on the “SAVE AS” button located at the top left. Save your modded BIOS with a new name (don’t overwrite your factory BIOS!), and then close the Polaris editor when you’re done.

Step 4: Flash your modified BIOS back to your GPU

Flashing your GPU BIOS with ATIWinFlashNow it’s time to write your custom BIOS back to your hardware. This can be a little scary if you’ve never attempted anything like this before, but generally if you’ve followed the steps as written, you shouldn’t have any issues. Again, there are no absolute guarantees, so proceed at your own risk!

  • Open ATIWinFlash back up.
  • Click on the “Load Image” button and select the modded BIOS that you created in step 3.
  • Click on the “Program” button to write the BIOS to your GPU. Your computer may appear to freeze for what might seem like a long time—this is normal.
  • You’ll be prompted to reboot when ATIWinFlash finishes. Don’t reboot yet—we have one more thing to do. Go ahead and close ATIWinFlash, though.
  • Unzip the ATI Pixel Clock Patcher utility that you downloaded and double-click atikmdag-patcher.exe. It should offer to apply a patch, let it. You only need to do this step once per GPU, even if you flash it multiple times. If you skip this step, when your computer reboots, the AMD display driver will refuse to load because it’ll detect that your GPU BIOS has been tampered with it.
  • Go ahead and reboot after the patch is applied.

If you’ve done everything correctly, your computer should boot normally, and you’ll arrive back at the Windows desktop, ready to test your changes.

Step 5: Test your modified GPU BIOS

Now is a great time to fire up your miner and see what kind of difference your changes made.

If you have a 4GB card, the timing change alone should be enough to get you from ~20 Mh/s to ~24 Mh/s. If you have a 8GB card, you likely went from ~24 Mh/s to ~28 Mh/s. We can do better, but that’s a pretty good start!

Power consumption will be unchanged (or even up slightly, due to the more aggressive timings), but we haven’t touched voltages yet.

Once you’ve recorded your GPU’s new metrics (speed, temperature/fan speed, power usage), we can move on.

Step 6: Find appropriate clock speed and voltage values for your GPU

Before we head back into Polaris BIOS editor to increase memory clock speed settings, it’s a good idea to have an idea of how high we can push them. It’s a lot easier (and faster) to make these tweaks in Windows via the driver (Radeon Settings/WattMan), and then once we’re confident on the proper values, write them to BIOS.

So if you haven’t already, read step 12 of my Windows guide to get an idea of the process around overclocking and undervolting via driver-level edits. If you’ve already gone through the process, you’ll need to repeat it, as your new more-aggressive memory timings invalidate all of your previous data—you won’t be able to push the memory clock speed as high as you previously could (but performance will be much better).

Using Radeon Settings/WattMan in the manner that I describe in my Windows guide:

  • Increase memory clock speed slowly until you see signs of system instability (incorrect share warnings in your miner, artifacts on screen, crashes)
  • Decrease core clock speed slowly until it starts to significantly negatively impact performance
  • Decrease memory voltage slowly until you see signs of instability (you may not be able to significantly lower memory voltage, depending on your card)
  • Decrease core voltage slowly until you see signs of instability

Don’t rush; make sure that your system is stable before moving on. It’s possible to reach speeds of nearly 29 Mh/s with 4GB cards, or over 31 Mh/s with 8GB cards, but watch out for power consumption and stability issues—it’s not always worth running at higher speeds. I’ve found that 25-26Mh/s for 4GB cards, and 27-29Mh/s for 8GB cards is right around the sweet spot for maximum efficiency and stability. When you feel confident that you have good clock speed and voltage values, then move on to the next step where we’ll write them to the BIOS.

Step 7: Write new clock speed and voltage values to GPU BIOS

Note that this step is not strictly necessary if you plan to use Windows for your miners long-term. You can certainly just dial in whatever values you found in the previous step at the driver/WattMan level and call it a day. I prefer to have everything done at the BIOS level, as then I don’t have to worry about software configuration, and can move GPUs between environments with ease.

If you’re running Linux, this is the only way (currently, at least) to overclock and undervolt.

  • Open Polaris BIOS Editor back up.
  • Load the modified BIOS that you created in step 3 (click “OPEN BIOS” in the top left and browse for your modded .rom file).
  • In the “Memory” area, carefully input your values for memory clock speed and voltage in the bottom row.
  • In the “GPU” area, carefully input your values for core clock speed and voltage in the bottom row. You’ll probably be overwriting a 65xxx value in the voltage column—that’s ok.
  • Still in the “GPU” area, fill in the table between the bottom row and the first row (but do not touch the first row!) with values that ramp up to whatever you entered in the bottom row. It isn’t super important to get these values “right”; you can look at the original table and see what percentage adjacent rows vary by, and just calculate new values that way.

Here is my finished, modded BIOS for my Asus RX 470 4GB (click for full size):

Factory BIOS in Polaris BIOS editor

The original factory BIOS is shown in step 2 for reference. Note that I’ve made absolutely no edits outside of the area I originally outlined in blue. I get over 25 Mh/s after the modifications (+25%), while using ~15% less power compared to stock. These changes are fairly conservative; I’m stable at nearly 27 Mh/s on this card with more aggressive settings, but the increase in power consumption isn’t worth it at my electricity rate.

If you’re looking for a good starting point, the settings pictured here should be stable in just about every 4GB card (in the timings section, just copy the 1500mhz value to every row below it).

When you’re done making your edits in Polaris, save your final BIOS (click “SAVE AS”) as a new file. Then open up ATIWinFlash and write the new .rom to your GPU (same as step 4). Reboot and test!

Step 8: Repeat steps 1-7 for each of your remaining GPUs

Yes, it’s a little tedious. But it goes quite a bit faster after your first one. Don’t be tempted to simply take the first BIOS that you create, and flash that to all of your other cards—every GPU is different, even between cards that are the same brand/model. It’s quite possible (likely, even, if you have a lot) that some of your cards will be capable of stable speeds 25+ mhz higher than others. Test them all; it’ll save you headaches later.

Analyzing the cost/benefit of different setups

If you’re stuck on whether or not an extra 1-2 Mh/s is worth 25 watts of additional power consumption, remember that you can use an online calculator to help simplify things. For example, here is a GPU hashing at 25 Mh/s @ 100 watts vs another GPU at 26 Mh/s @ 125 watts (assuming $0.15 per kWh, remember to plug in your own rate!). At the time that this was written, the slower GPU is slightly more profitable.

BIOS mods: before and after comparison

My test rig, running two RX 470 4GB cards, and one RX 480 8GB card, mining ETH in Linux. Top is stock factory settings, bottom is after BIOS mods outlined in this guide. From 65 to 80 Mh/s, using 70 watts less power!


In the next and final installment of this Ethereum mining guide, I’ll post a mining FAQ and some other tidbits that didn’t quite fit anywhere else. Until then, thanks for reading, and feel free to leave questions or comments!

24 Responses to Build your own Ethereum Mining Rig, part 4: Optimization

  1. Elmatra says:

    I have Sapphire nitro rx 480 4gb serial# A1713 (Hashing at 22.5 mh/s with 900 mhz and 825 voltage at 70 watts(gpuz) from card using wattman).

    When I open “Polaris BIOS Editor” the timing value box is empty.
    on the Bios Editor page it says “PS: Use this only with dual bios cards, it has only been tested once on a Elpida Nitro+ RX480 and can be unsafe.”

    Any ideas how I can mod the bios and push for 26.5 mh/s? ANy alternative to polaris bios editor? My card does not have dual bios and I need to for VR games too.

    • CryptoBadger says:

      If you’re using your GPU for games/VR in addition to mining, I’d probably advise against flashing your BIOS. These modifications are aimed at boosting mining performance, and many of them may actually negatively impact gaming performance.

      If Polaris doesn’t read your BIOS timing values automatically, then it definitely isn’t safe to use, especially if you don’t have a card with a secondary BIOS. I don’t have any GPUs with Elpida memory to test myself, but I do know that Elpida support was added to Polaris recently so hopefully it improves in a future version. The only current alternative to Polaris that I’m aware of is manually editing your BIOS with a hex editor, but I would never recommend that (especially on a single-BIOS card) unless you’re extremely comfortable with that sort of thing.

    • Dmytro says:

      I have same problem. My GPU is Sapphire Nitro+ RX470 (Hynix) and when I open BIOS file with Polaris BIOS Editor I do not see any info in TIMIMG VALUES field is just empty.

  2. Jonathan says:

    Hi there,

    I just set up a single GPU (Strix Gaming Rx 580 8gb) to test out this process and make sure it’s working smoothly. I’m currently hashing at 30.5 Mh/s! I’m thinking about investing more, but I have a few questions:

    The pool only pays out in amounts of 1 eth. Would I have to wait a whole month at this current rate to make sure that things are properly set up to pay out to my wallet? It doesn’t seem like there is any other way of assessing my overall progress, since the number of shares resets if I close the miner. Is there a better way to assess progress and make sure it’s collecting properly before the end of the month?

    • CryptoBadger says:

      Hey Jonathan – you can actually change the payout threshold on most pools, although typically you’ll be assessed a small fee if you set it below 1 ETH. For example, if you’re using (the pool I recommend in my guide), you can set the payout threshold as low as 0.1 ETH as long as you’re ok with a 0.001 ETH fee for every payout – just click on the “settings” tab of your dashboard to make the change.

      So if you want to confirm that payouts will hit your wallet address properly, you can change your payout threshold to 0.1 ETH (which should take ~3-4 days to reach with a single GPU) for your first payment, and then bump it back up to 1 ETH afterwards.

  3. fr0sty says:

    Having a heck of a time trying to edit the BIOS. I’m running my rig on Ubuntu, but trying to adjust BIOS by using separate storage device that has Windows installed. I can get everything perfect (albeit it took hours of troubleshooting lol) down to the Pixel Patcher.. When I try to start the Pixel Patcher I get the error “failed to locate driver file”. I’m at a loss on it, was wondering if you may have some knowledge about the situation and if you wouldn’t mind lending some advice. It would be super appreciated! GREAT tutorials BTW!

    • CryptoBadger says:

      Try running this patch debugger and taking a look at the debug.txt file:

      Hopefully the output gives a clue as to what’s going on. If the answer isn’t obvious from the ouput, try asking for help over here. The creator of the patcher is pretty active/responsive and should be able to figure things out for you.

      • fr0sty says:

        Will try it man. Thanks much for the feedback!

        • nobody says:

          You can try directly under GNU/Linux 😉


          “PolarisBiosEditor with any memory support (Samsung, Hynix, Elpida etc)”
          “Replaced WPF components with Windows Forms to archive mono compatibility”

          Need install Mono (Linux implementation of .NET):
          # on Ubuntu:
          sudo apt install mono

          # run using (or create icon on desktop/panel with this command):
          mono PolarisBiosEditor.exe


          # list of installed/supported cards (numbered from 0)
          atiflash -ai

          # backup of original bios of card 0
          atiflash -s 0 /path/filename.rom

          # compare bios in card 0 with bios in file (if show error, then not same)
          atiflash -v 0 /path/filename.rom

          # flash bios file into card 0 (after this restart manualy to apply new bios)
          atiflash -p 0 /path/filename.rom

          If any problem with BIOS found, put “bricked” card as second card, and start GNU/Linux with this kernel parameter added, using in grub menu, press e as edit, and write between splash and quiet:
          confirm and boot using F10…

          after boot, use atiflash to flash backup of original bios and reboot…

  4. WannabeMiner says:

    Was wondering why my MHz values on my Sapphire RX470 8GB look different to yours?

  5. Dmytro says:

    Could you please confirm whether my understanding of exact steps are correct?
    Assuming that I am going to use primarily LInux to run eth mining. To get everything up and running on optimum performance I follow steps:
    1) Assemple HW. Connect Hard drive.
    2) Power it on and install Windows operating systems on connected Hard drive.
    3) Install video drivers, make BIOS modification using Windows 10 and eventually run mining software.
    4) When all GPUs are patched switch off the power.
    5) Install another disk or USB flash switch on the power.
    6) Install Ubuntu linux.
    7) Install Linux video drivers.
    8) Install and run mining software.

    Is the sequence correct?

    • CryptoBadger says:

      Yes, that’s correct. If you already have a Windows desktop, you can save yourself some time by modding each GPU BIOS in your existing machine, instead of creating a fresh Windows install just for that purpose.

  6. Anonymous says:

    first thank you for best article that you write .

    i have setup miner with 4 gpu but only one gpu detected .i am using gigabyte RX480 gpu .

    help me so that i improve my performance .

  7. Dmytro says:

    Could you please suggest what else could be done to further improve minig?
    I am using Sapphire Nitro+ RX470 4Gb (Hynix memory). I did BIOS modification as per your description:
    Timing values 1500 copied to 1650, 1700, 2000;
    core clock speed decreased to 1000;
    core voltage: 850mv
    memory voltage: about 825mv

    Now I see under Windows environment 24.6 Mh/s and 157 Watt. Interestig trick is that when I start Sapphire Trixx and just trying to change memory clock from 7000 to 7100, then run miner, after this I see that in Trixx screen clock returns to 7000 (looks like hardcoded value), but most interestimg thing is that consumed power dropt to 127 Watt ( 30 Watts less) actually without any modification of parameters. After next restart consumption goes back to 157 Watts.

    Under Linux hash rate is a bit smaller 24.1 Mh/s and it is not stable at all.

    So my 1-st question is what else can I modify in order to increase hash rate? As I understood memory overclocking is not possible for this model.

    2) Have you ever faced an issue that if display is not connected to HDMI port of AMD GPU computer does not boot up? As soon as display gets connected to HDMI port computer boots up properly. I’ve read that some display emulators are needed to be connected to every GPU’s HDMI ports in order to allow display free operation, but do you maybe know some other tricks how to overcome this without buying those emulators?

    • fr0sty says:

      Hey Dmytro,

      I have the same experience in regards to your second question. What I do, start my rig with 1st GPU attached to monitor via HDMI, so it’ll power on. Once it is on, I connect via putty with my laptop and then disconnect the monitor. From there out you can control your rig via putty and as long as you don’t cut off (which you’ll be mining anyway lol) your good to go.

      I’ve also seen other comments about people programming the rig to start headless, but I myself never delved into the topic too far, as the above scenario was sufficient for my needs.

      Help it helps!

      • Dmytro says:

        Hi Fr0sty,
        Thanks for suggestion. It is fine to boot computer up with connected display and then disconnect, but it is not very convenient if I want to keep rig in some specific place where access to display is limited (f.e. length of HDMI cable is not enough). Your option is good but it is working up to next computer restart, and that is a problem if it happens and I’ll not be available to connect display there will be a downtime :-(.

        • fr0sty says:

          I understand completely! I have a 22 monitor I’m able to lug to my rig whenever I need to mess around with it, so it was no problem for me. We all have different circumstances 🙂

          I hope you find a solution! Maybe you will be able to find how to get it running headless. That would definitely be nice.

          Best of luck!

      • CryptoBadger says:

        Just in case you ever need a solution to running headless, I just added some info to my FAQ that should help.

    • CryptoBadger says:

      If you’ve written your desired clock speed & voltage values to GPU BIOS, try not using Trixx/WattMan/Afterburner at all. They may be trying to reset your BIOS values to some other default settings. Regarding increasing performance further, the settings that I gave in my guide are fairly conservative and intended to maximize stability/reliability and minimize power consumption. Your cards can probably be pushed to ~28 MH/sec or more without compromising stability, but they’ll pull significantly more power. If you want to try for higher hashrates, try Googling around a bit for others that have the same model GPU and use their posted settings as a starting point (the bitcointalk forums are an excellent resource, too).

      How are you measuring power consumption? At those values, you should only be pulling about 100-110 watts per GPU at the wall, assuming a platinum-rated PSU. The wattage estimates that software (Trixx, GPU-Z, etc) give are usually pretty far off the mark.

      Regarding question 2, I just added a question to my FAQ that should help you.

  8. TargetPractice says:

    I currently use Afterburner to change my clock speeds and voltage and I wanted to write those changes on the bios.

    From your picture of the original bios on the Polaris Bios Editor (, in the memory box you put the memory clock speed and voltage that you want it to run at,
    Is that correct?

    Also, in the GPU box you put the core clock speed you want it to run at for the last one and fill in every value in between, then how would you do the voltages for each one? How do voltages in the GPU box and Memory box differ?

    Thank you for your help,

    • CryptoBadger says:

      That’s correct.

      As far as calculating your own intermediate core clock/voltage values, the way I do it is by looking at the original factory settings, and determining what percentage every each step from the top drops by. So for example, if the factory BIOS settings decrease the clock speed/voltage by 10% between the last step and the previous step, I’ll do the same thing when supplying my modified values.

Leave a Reply

Your email address will not be published.