Майнинг на алгоритме консенсуса Proof-of-Work с хеш-функцией Ethash (ранее Dagger Hashimoto) уже несколько лет является одним из наиболее популярных среди сообщества майнеров. Это связано со множеством причин, среди которых популярность блокчейн-платформы Ethereum, легкость проведения вычислений на видеокартах, хороший профит от майнинга эфира и его клонов на GPU.
Какие вычисления производит компьютер при майнинге на алгоритме Ethash?
При проведении вычислений на алгоритме Ethash производится генерация уникальных коротких бинарных данных, которые называются Nonce.
Nonce – это аббревиатура от английской фразы number that can only be used once, которая переводится как число, которое может использоваться только один раз. При построении цепочек блоков Ethereum (или любой другой подобной платформы, например, Nilu) подходящее определенным условиям значение nonce записывается в их заголовок. В качестве условия используется целевое значение сложности проведения вычислений – переменная Target. Процесс нахождения Nonce заключается в переборе случайных числовых значений на предмет соответствия заданному значению сложности по криптографическому алгоритму Ethash.
Фактически проведение вычислений при майнинге на Ethash и других алгоритмах Proof-of-Work заключается в угадывании числа, отвечающего определенным условиям. Вознаграждение за найденное решение получает тот, кто первым отправит его в сеть и получит согласие от других узлов о его соответствии заданной хеш-функции.
Алгоритм Ethash базируется на псевдослучайной таблице данных Directed Acyclic Graph (DAG), которая связана с текущим состоянием блокчейна. Эти данные генерируются каждые 30,000 blocks (приблизительно каждые 5 дней).
С увеличением количества блоков размер таблицы DAG растет, что приводит к неспособности производить вычисления на алгоритме Ethash видеокартами или другими устройствами с объемом памяти меньше текущего DAG. В связи с этим к концу 2020 года четырехгиговые карты уже не смогут добывать такие монеты, как ETH и ETC.
Помимо доступного свободного объема видеопамяти проведение вычислений с большими объемами данных лимитируется ограничениями технологии OpenCL (используется в видеокартах AMD) на размер непрерывного блока данных (4096 Мб), хотя оно с успехом преодолевается путем разделения DAG на части.
Последовательность действий по нахождению решения по алгоритму Ethash заключается в следующем:
- В качестве начальных данных берутся: число из заголовка предыдущего валидного блока (Preprocessed Header) и случайно подобранное значение Nonce.
- Они складываются по SHA3-подобному алгоритму и создают 128-байтное число – Mix 0.
- Число Mix используется для определения одной из 128-байтных страницы Get DAG Page, которая будет использоваться при последующих вычислениях (микшировании).
- Mix микшируется с выбранной страницей DAG на основе хеш-функции Ethash в результате чего генерируется следующее число, называемое Mix 1.
- Шаги 3 & 4 повторяются 64 раза, вследствие чего получается число Mix 64.
- Mix 64 сокращается до 32-байтного числа Mix Digest.
Последовательность работы при проведении вычислений по нахождению nonce:
- Mix Digest сравнивается с 32-байтным значением целевой сложности майнинга Target Threshold. Если Mix Digest соответствует Target Threshold, тогда текущее значение Current Nonce считается успешно найденным и передается в сеть. В противном случае процесс вычислений повторяется с другим nonce (производится либо увеличение текущего значения nonce, либо подбор нового случайного числа).
Графическое изображение процесса нахождения решения по алгоритму Ethash:
Почему майнинг на алгоритме Ethash столь требователен к памяти?
Каждая операция по микшированию требует чтения 128 байт данных из DAG (шаг 2 на рисунке). Нахождение одного nonce требует проведения 64 операций микширования, при этом задействуется 128 байт x 64 = 8 KB памяти. Чтение данных DAG производится в псевдослучайном порядке (согласно функции микширования), поэтому использование кеша L1 или L2 практически не увеличивает общее быстродействие, так как следующий фрагмент DAG с большой степенью вероятности не будет находиться в этом кэше.
Так как чтение данных DAG из видеопамяти происходит намного медленнее, чем процесс микширования в ядре видеокарты, увеличение скорости последнего (разгон по ядру) мало влияет на хешрейт. Самое большое влияние на увеличение хешрейта при майнинге на алгоритме Etash (Dagger Hashimoto) оказывает именно быстродействие операций чтения 128-байтных блоков данных DAG из памяти. Именно из-за лимитов памяти, которые ограничивают быстродействие вычислений, Ethash считается «memory hard» алгоритмом.
Как связан хешрейт при проведении вычислений на алгоритме Ethash с быстродействием памяти?
Наибольший хешрейт, который может выдать видеокарта, зависит от производительности ее подсистемы памяти. При константном значении размера выборки DAG для вычисления одного хеша, равного 8 Кб, она прямо зависит от полосы пропускания видеопамяти (Memory Bandwidth) и вычисляется по следующей формуле:
(Memory Bandwidth) / 8 Кб/hash = Max теоретический хешрейт
Например, для видеокарты Radeon RX580, у которой пропускная способность памяти равна 256 Gb/sec, максимальный хешрейт в стоке будет равен:
(256 Gb/s) / (8 kb/hash) = 32 MH/s,
При этом на нахождение одного хеша у RX580 затрачивается 31,25 наносекунд.
Для обработки данных в ядре видеокарты также требуется определенная вычислительная мощность. Для ее нахождения можно использовать эмпирическую формулу:
Частота ядра при майнинге на Ethash = Частота памяти х 0,561
Можно ли использовать оперативную память компьютера для вычислений по алгоритму Ethash?
Обычная оперативная память (DDR4), использующаяся в компьютерах, обычно работает в 1-2 канальном режиме и на меньших частотах в сравнении с видеопамятью. Так как ОЗУ компьютера имеет во много раз меньшую пропускную способность, чем у VRAM GPU, то ее использование для майнинга на Ethash не эффективно.
Это связано как с низкой эффективной рабочей частотой (до 4000 МГц), так и с относительно узкой шириной шины передачи данных (64 бита для одного канала). У видеопамяти GDDR5 рабочая частота находится в пределах 7-10 тысяч МГц (у хороших чипов даже больше), а ширина шины данных даже у самых слабых видеокарт обычно составляет 128 бит.
Например, ОЗУ DDR4, работающая на частоте 2400 MHz, имеет пиковую скорость передачи данных, равную 19,2 GB/sec. Поэтому она без разгона и модификации таймингов может обеспечить хешрейт не более 19,2/8=2,4 MH/s.
“Крутая” память G.Skill TridentZ DDR4-типа, работающая на частоте 4000 МГц, имеет эффективную пропускную способность в 25.6 GB/sec. В одноканальном режиме она способна обеспечить хешрейт в 25.8/8=3.2 MH/s, что все равно не идет ни в какое сравнение с памятью GDDR5, работающей на более высоких частотах в многоканальном режиме.
Как работают ASIC-и с памятью DDR3 на алгоритме Ethash?
Производители ASIC-ов для алгоритма Ethash обходят ограничения по производительности памяти типа DDR3, увеличивая размер шины передачи данных (количество каналов памяти). Благодаря этому ASIC Antminer F3 (E3) при использовании 72 Гб памяти DDR3 имеет на Ethash производительность, сравнимую с видеокартами (хешрейт 150 MH/s при потреблении 800 Вт).
Как связан хешрейт на алгоритме Ethash с частотой и шириной шины памяти?
Производительность памяти при проведении вычислений на Ethash напрямую зависит от эффективной частоты работы чипов памяти, значений таймингов, отвечающих за скорость чтения, а также ширины шины памяти.
Вычислить пропускную способность памяти можно по формуле:
Memory Bandwidth (GB/sec) = Memory Interface * Memory Clock (Data Rate) / 8 бит
Например, у видеокарты Radeon RX580 с памятью GDDR5 стоковая полоса пропускания равна 256х8000/8=256 GB/sec (хешрейт до 32 MH/s).
Так как ширину шины памяти изменить нельзя, то для увеличения быстродействия нужно увеличивать частоту и тайминги памяти. Если увеличить эффективную частоту работы памяти GDDR5 до 8500 МГц, то ее полоса пропускания увеличится на 16 GB/sec и станет равной 256х8500/8=272 GB/sec, что должно увеличить хешрейт до 34 MH/s .
Как серьезно увеличить хешрейт на алгоритме Ethash?
Еще больше увеличить быстродействие можно путем модификации таймингов, ответственных за чтение данных. Для памяти GDDR5 это с успехом делается путем прошивки быстродействующих таймингов (обычно с частоты 1500 МГц) в более высокочастотные страпы, а также путем модификации значения REF (программой amdmemorytweak или в Claymore включением опции rxboost 1).
У видеокарт AMD серии VEGA с памятью HBM2 диапазон возможных твикингов значительно больше. У них есть смысл модифицировать значения RAS, RCDRD, RCDWR, RC, RP, RRDS, RRDL, RFC и REF.
Для практического увеличения быстродействия подсистемы памяти при майнинге на алгоритме Ethash используются:
- разгон памяти в BIOS GPU, батнике майнера, либо специальными утилитами (nvidiainspector для видеокарт Nvidia, overdriventtool для AMD или универсальная программа MSI Afterburner);
- использование модифицированных таймингов на повышенных частотах с помощью модификации BIOS видеокарт;
- изменение (твикинг) параметров работы с чипами памяти на лету с помощью программы AMDmemorytweak для памяти GDDR5, ETHEnlargmentpill для GDDR5+;
- изменение таймингов при майнинге с помощью параметров командной строки батника в майнере Клеймор и других программах.
В качестве справочных данных приведем информацию о максимальном теоретическом хешрейте на Ethash популярных видеокарт при стоковых настройках. При использовании данных из таблицы нужно учитывать, что реальный хешрейт видеокарт также зависит от производительности ядра, которое используется вычислении значений nonce. Эмпирическим путем установлено, что на практике хешрейт равен 0,84 от максимального теоретического (при стоковых значениях разгона).
У видеокарт с большой разрядностью шины памяти реальный хешрейт может быть значительно меньше теоретического, так как у них производительность ядра обычно отстает от пропускной способности шины памяти.
Из-за отставания производительности ядра от подсистемы памяти, реальный хешрейт на алгоритме Ethash у таких видеокарт как R9 280, R9 290, R9 295, Fury и других карт с огромной шиной памяти ниже теоретического максимума даже в Linux. У них разгон ядра сразу же откликается хорошей прибавкой в хешрейте, при этом память остается недогруженной.
У карт серии RX Vega производительность ядра значительно выше и они показывают хешрейт, более соответствующий теоретическому при сопоставимой пропускной способности памяти.
Кроме того, на хешрейт в значительной мере влияет реализация работы с памятью в драйверах операционной системой. Из-за недостатков в драйверах Windows на видеокартах R9 290/390 на поздних DAG выдает всего 18-19 MH/s, а Linux – порядка 29 MH/s. Подробнее об этом можно прочитать в статье «Как добиться от видеокарт Radeon R9 290/390 хешрейта 29-30 MH/s на Ethash».
Таблица с информацией о максимальном теоретическом хешрейте видеокарт AMD при заводских настройках подсистемы видеопамяти (без разгона):
Название видеокарты | Пропускная способность памяти (Memory Bandwidth), GB/sec |
Ширина шины памяти, бит | Объем видеопамяти, GB | Тип памяти | Макс. хешрейт на Ethash (в стоке), MH/s |
Radeon R7 360 | 104 | 128 | 2 | GDDR5 | 13 |
Radeon R7 370 | 179,2 | 256 | 2 | GDDR5 | 22,4 |
Radeon R9 370X | 179,2 | 256 | 4 | GDDR5 | 22,4 |
Radeon R9 270X | 179,2 | 256 | 2 | GDDR5 | 22,4 |
Radeon R9 280 | 240 | 384 | 3 | GDDR5 | 30 |
Radeon R9 280X | 288 | 384 | 3 | GDDR5 | 36 |
Radeon R9 285 | 176 | 256 | 2 | GDDR5 | 22 |
Radeon R9 290 | 320 | 512 | 4 | GDDR5 | 40 |
Radeon R9 290X | 320 | 512 | 4 | GDDR5 | 40 |
Radeon R9 295X2 | 2х320 | 2х512 | 8 | GDDR5 | 80 |
Radeon R9 380 | 182,4 | 256 | 2 | GDDR5 | 22,8 |
Radeon R9 390 | 384 | 512 | 8 | GDDR5 | 48 |
Radeon R9 390X | 384 | 512 | 8 | GDDR5 | 48 |
Radeon R9 Fury | 512 | 4096 | 4 | HBM | 64 |
Radeon R9 Fury X | 512 | 4096 | 4 | HBM | 64 |
Radeon R9 Nano | 512 | 4096 | 4 | HBM | 64 |
Radeon RX460/560 | 112 | 128 | 2/4 | GDDR5 | 14 |
Radeon RX470 | 211,2 | 256 | 4/8 | GDDR5 | 26,4 |
Radeon RX480/580 | 256 | 256 | 4/8 | GDDR5 | 32 |
Radeon RX540 | 96 | 128 | 2/4 | GDDR5 | 12 |
Radeon RX550 | 112 | 128 | 2/4 | GDDR5 | 14 |
Radeon RX570 | 224 | 256 | 4/8 | GDDR5 | 28 |
Radeon RX590 | 256 | 256 | 8 | GDDR5 | 32 |
Radeon RX640 | 112 | 128 | 2 | GDDR5 | 14 |
RX Vega 56 | 409,6 | 2048 | 8 | HBM2 | 51,2 |
RX Vega 64 | 483,8 | 2048 | 8 | HBM2 | 60,47 |
Radeon VII | 1024 | 4096 | 16 | HBM2 | 128 |
Radeon Pro 5300M/ W5300M | 192 | 128 | 4 | GDDR6 | 24 |
Radeon Pro 5500M/ W5500M | 192 | 128 | 8/4 | GDDR6 | 24 |
RX5500/5500XT | 224 | 128 | 4 | GDDR6 | 28 |
RX5600 | 288 | 192 | 6 | GDDR6 | 36 |
RX5700 | 448 | 256 | 8 | GDDR6 | 56 |
RX5800XT | 448 | 256 | 8 | GDDR6 | 56 |
RX5900/5900XT | 672 | 384 | 12 | GDDR6 | 84 |
Таблица с информацией о максимальном теоретическом хешрейте видеокарт Nvidia при заводских настройках подсистемы видеопамяти (без разгона):
Название видеокарты | Пропускная способность памяти (Memory Bandwidth), GB/sec |
Ширина шины памяти, бит | Объем видеопамяти, GB | Тип памяти | Макс. хешрейт на Ethash (в стоке), MH/s |
GTX 750Ti | 88 | 128 | 2 | GDDR5 | 11 |
GTX 760/760Ti | 192,3 | 256 | 2 | GDDR5 | 24 |
GTX 770 | 224 | 256 | 2 | GDDR5 | 28 |
GTX 780 | 288,4 | 384 | 3 | GDDR5 | 36 |
GTX 780Ti | 336,5 | 384 | 3 | GDDR5 | 42 |
GTX 950 | 106 | 128 | 2 | GDDR5 | 13,2 |
GTX 960 | 112 | 128 | 2 | GDDR5 | 14 |
GTX 970 | 224,4 | 256 | 4 | GDDR5 | 28 |
GTX 980 | 224 | 256 | 4 | GDDR5 | 28 |
GTX 980Ti | 336 | 384 | 6 | GDDR5 | 42 |
GTX 1030 | 48,06 | 64 | 2 | GDDR5 | 6 |
GTX 1050 | 112,1 | 128 | 2 или 4 | GDDR5 | 14 |
GTX 1050Ti | 112,1 | 128 | 4 | GDDR5 | 14 |
GTX 1063 | 192,2 | 192 | 3 | GDDR5 | 24 |
GTX 1066 | 192,2 | 192 | 6 | GDDR5 | 24 |
GTX 1068 | 256,3 | 256 | 8 | GDDR5 | 32 |
GTX 1070 | 256,3 | 256 | 8 | GDDR5 | 32 |
GTX 1070Ti | 256,3 | 256 | 8 | GDDR5 | 32 |
GTX 1080 | 320,3 | 256 | 8 | GDDR5+ | 40 |
GTX 1080Ti | 484 | 352 | 11 | GDDR5+ | 60 |
GTX 1650 | 128 | 128 | 4 | GDDR5 | 16 |
GTX 1650 Ti | 192 | 128 | 4 | GDDR6 | 24 |
GTX 1650S | 192 | 128 | 4 | GDDR6 | 24 |
GTX 1660S | 336 | 192 | 6 | GDDR6 | 42 |
GTX 1660 Ti | 288 | 192 | 6 | GDDR6 | 36 |
GeForce GTX Titan | 288,4 | 384 | 6 | GDDR5 | 36 |
Quadro GV100 | 870 | 4096 | 32 | HBM2 | 108 |
Tesla T4 | 320 | 256 | 16 | GDDR6 | 40 |
RTX2060 | 336 | 192 | 6 | GDDR6 | 42 |
RTX2060S | 448 | 256 | 8 | GDDR6 | 56 |
RTX2070 | 448 | 256 | 8 | GDDR6 | 56 |
RTX2070S | 448 | 256 | 8 | GDDR6 | 56 |
RTX2080 | 448 | 256 | 8 | GDDR6 | 56 |
RTX2080S | 495,5 | 256 | 8 | GDDR6 | 61 |
RTX2080Ti | 616 | 352 | 11 | GDDR6 | 77 |