Задать вопрос
@thecove

Почему у меня AMD Ryzen 3970 в 2-3 раза медленее Core i9 10850K?

Такая ситуация странная. Купили для работы AMD Ryzen 3970. Предполагалось на нем многопоточно считать наши мат. задачи.
До этого использовали Core i9 10850K ( 10 ядер + 10 Hyper-threading ).
По итогу имею вот такую некрасивую картинку....
40 миллионов наших мат итераций ( мат операции не содержат операций с плавающей запятой вообще, только сложение, вычитание, умножение и сдвиг )
- на Intel при использовании 20 потоков занимает 20,5 секунд
- на Amd при использовании 64 потоков занимает 37,0 секунд
При этом в мониторе ресурсов видно что все ядра Intel загружены на 100% а AMD на 35-45%

установка приоритетов при создании потока никакого эффекта не имеет:
threads[ core  ] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)testMathThread, params, 0, NULL);
 ::SetThreadPriority( threads[ core ], THREAD_PRIORITY_HIGHEST);
 ::SetThreadAffinityMask( threads[ core ], 1 << core );

Глобальных переменных нет. У каждого потока свой собственный объект в памяти куда они заносят свои результаты.
Если делать расчет на одном ядре то результат такой: 4 миллиона итераций Intel 7.7 сек. AMD 9.25 сек

Включение / выключение в BIOS SMT у AMD практически ничего не меняет.
Переключение в Windows профиля питания со схемы AMD Rizen Balanced на схему "Максимальная производительность" то время обработки увеличивается на 10-12% до 45с.

Такое ощущение что у АМД где то предохранитель стоит который не позволяет ядро загрузить на 100%.
40-50% и всё

Последняя надежда разобраться что блин происходит на сообщество. А то уже руки тянутся обратно в магазин сдать.

PS да, оперативная память идентичная на обоих машинах DDR4 3200 по 32 гига на каждой. Но матан память мало есть.
  • Вопрос задан
  • 428 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
@thecove Автор вопроса
Update Вопрос решен!
С проблемой за 12 часов секаса удалось разобраться.
В проекте использовалась самописная либа для ГСЧ на базе mt19937 и человек писавший ее лет 5 назад сделал ее потокобезопасной. Понапихав во все вызовы
std::lock_guard guard(mMutex);

Не знаю почему AMD на этих вызовах "отдыхал" дольше чем Intel но факт остается фактом. В два раза больше проц от красных терял времени чем синие. В итоге у синих 100% загрузка проца а у красных около 50.
Как временное решение ( пока старую либу не переписали ) я в каждый поток добавил свой собственный класс Random на базе стандартного rand() / srand() из C++
__declspec(thread) Random* random= nullptr;
это решение на коленке. Но главное причина найдена и точность рассчетов не пострадала
class Random
{
public:
Random()
{
 _rand_state = 0;
}
void srand(unsigned int const seed)
{
    _rand_state = seed;
}
uint16_t rand()
{
    _rand_state = _rand_state * 214013 + 2531011;
    return (_rand_state >> 16) & RAND_MAX;
}
private:
uint32_t _rand_state; 
}


в итоге результат.
Вот было:
4 млн. итераций AMD 32 потока = 4,05 сек. Загрузка CPU 45%
4 млн. итераций AMD 64 потока = 3,61 сек. Загрузка CPU 47%
4 млн. итераций Intel 10 потоков = 4,01 сек. Загрузка CPU 75%
4 млн. итераций Intel 20 потока = 2,61 сек. Загрузка CPU 100%


после исправлений стало:
4 млн. итераций AMD 32 потока = 1,25 сек. Загрузка CPU 60% ( 1 поток на физическое ядро )
4 млн. итераций AMD 64 потока = 0,71 сек. Загрузка CPU 100% ( 1 поток на физическое ядро + HP )
4 млн. итераций Intel 10 потоков = 2,8 сек. Загрузка CPU 70% ( 1 поток на физическое ядро )
4 млн. итераций Intel 20 потока = 2,1 сек. Загрузка CPU 100% ( 1 поток на физическое ядро + HP )


Как видно из нового теста AMD как и предсказывали все известные бенчмарки примерно в 3 раза производительнее чем Intel при полном использовании всех ядер.
Тесты при загрузке на одно ядро у меня показывали что Intel на 15-20 процентов шустрее чем AMD
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Zoominger
@Zoominger
System Integrator
- на Intel при использовании 20 потоков занимает 20,5 секунд
- на Amd при использовании 64 потоков занимает 37,0 секунд

Сделайте количество потоков равным количеству потоков процессора. У вас производительность уходит на переключение контекста ядер с потока на поток.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы