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