Испытано с Phoenix шахтера - получил мои HD6950, скорость запаса, запертые шейдеры, от 343Mhash / с 349Mhash / с!
Это ядро содержит также оптимизации уже размещены на этом форуме, а именно - "М г ^ х", Это не мое, и я не беру кредит на это! 343Mhash / с уже содержал этот патч.
Какие новости:
Много мелких изменений, некоторые только сохранить одно дополнение.
Код:
# 1:
До:
Н = 0xb0edbdd0 + К [0] + W 0; D = 0xa54ff53a + Н; Н = Н + 0x08909ae5U;
После:
Н = W0 + 4228417613; D = W0 + 2563236514;
# 2:
До:
D = D1 + (ROTR (А, 6) ^ ROTR (А, 11) ^ ROTR (А, 25)) + СН (А, В1, С1) + К [4] + 0x80000000;
После:
D = D1 + (ROTR (А, 6) ^ ROTR (А, 11) ^ ROTR (А, 25)) + СН (А, В1, С1);
+ Поместите константы К [4] + 0x80000000 в Python Предварительно расчет
-> self.state2 [3] = np.uint32 (self.state2 [3] +3109470811);
# 3:
До:
Н = .... К [60] + W12;
Н + = 0x5be0cd19U;
если (Н == 0)
После:
если (Н == 325071597)
# 4:
До:
если (H.x == 0)
{
Выход [OUTPUT_SIZE] = выход [nonce.x & OUTPUT_MASK] = nonce.x;
}
иначе если (H.y == 0)
{
Выход [OUTPUT_SIZE] = выход [nonce.y & OUTPUT_MASK] = nonce.y;
}
После:
если (H.x == 0)
{
Выход [OUTPUT_SIZE] = выход [nonce.x & OUTPUT_MASK] = nonce.x;
}
если (H.y == 0)
{
Выход [OUTPUT_SIZE] = выход [nonce.y & OUTPUT_MASK] = nonce.y;
}
Почему прервать проверку, если мы нашли результат? Вряд ли, но мы могли бы найти два: Это добавляет почти не над головой.
# 5:
Много мелких изменений (некоторые из них были оптимизированы компилятором раньше, но в любом случае)
До:
Н = 0xb0edbdd0 + К [0] + W 0; D = 0xa54ff53a + Н; Н = Н + 0x08909ae5U;
После:
Н = W0 + 4228417613; D = W0 + 2563236514;
# 2:
До:
D = D1 + (ROTR (А, 6) ^ ROTR (А, 11) ^ ROTR (А, 25)) + СН (А, В1, С1) + К [4] + 0x80000000;
После:
D = D1 + (ROTR (А, 6) ^ ROTR (А, 11) ^ ROTR (А, 25)) + СН (А, В1, С1);
+ Поместите константы К [4] + 0x80000000 в Python Предварительно расчет
-> self.state2 [3] = np.uint32 (self.state2 [3] +3109470811);
# 3:
До:
Н = .... К [60] + W12;
Н + = 0x5be0cd19U;
если (Н == 0)
После:
если (Н == 325071597)
# 4:
До:
если (H.x == 0)
{
Выход [OUTPUT_SIZE] = выход [nonce.x & OUTPUT_MASK] = nonce.x;
}
иначе если (H.y == 0)
{
Выход [OUTPUT_SIZE] = выход [nonce.y & OUTPUT_MASK] = nonce.y;
}
После:
если (H.x == 0)
{
Выход [OUTPUT_SIZE] = выход [nonce.x & OUTPUT_MASK] = nonce.x;
}
если (H.y == 0)
{
Выход [OUTPUT_SIZE] = выход [nonce.y & OUTPUT_MASK] = nonce.y;
}
Почему прервать проверку, если мы нашли результат? Вряд ли, но мы могли бы найти два: Это добавляет почти не над головой.
# 5:
Много мелких изменений (некоторые из них были оптимизированы компилятором раньше, но в любом случае)
Для # 2 Я изменил предварительный расчет в __init__.py. Посмотрите на них! Вы можете использовать диф - его только 2 строки.
Обратите внимание: Это часть результата >100 часов кропотливой работы. Если вы хотите, чтобы я размещать продолжать отправлять патчи, сказать спасибо в виде небольшого пожертвования. Все выше 0,01 просто отлично
-> 1Dsxro7GvNDaxWkvMgkraEttAA4xqagxVp
Кстати, я уже получил несколько больше - незначительные - оптимизаций.
Вот:
http://www.filesonic.com/file/1348177284/poclbm_kernel.zip
Пожалуйста, после некоторых результатов!