Я столкнулся со странным поведением с моим алгоритмом / процессором, мне было интересно, что может быть причиной этого.
Процессор, который я использую: AMD 2990WX 32c / 64t, ОС: Ubuntu 18.04LTS с ядром 4.15.0-64-generi c.
Алгоритм (Julia 1.0.3):
@sync @distributed for var in range(0.1,step=0.1,stop=10.0)
res=do_heavy_stuff(var) #solves differential equation,
#basically, multiplying 200x200 matrices many times
save(filename,"RES",res)
end
Функция do_heavy_stuff (var) Требуется ~ 3 часа, чтобы решить на одном ядре процессора. Когда я запускаю его параллельно с 10 процессами ( julia -p 10 my_code.jl ), это занимает ~ 4 часа для каждой параллели l oop, то есть каждые 4 часа я получаю 10 сохраненных файлов. Ожидается замедление, так как частота процессора снижается с 4,1 ГГц до 3,4 ГГц.
Если я запускаю 3 отдельных экземпляра с 10 процессами в каждом, так что общее использование процессора составляет 30 ядер, это все равно занимает ~ 4 часа для один цикл l oop, означающий, что я выполняю 30 запусков, которые выполняются и сохраняются каждые 4 часа.
Однако, если я запускаю 2 экземпляра (один имеет значение 0, другой - +10) с 30 процессами каждый раз julia -p 30 my_code.jl , я вижу (используя htop), что загрузка ЦП составляет 60 (+) потоков, но алгоритм становится чрезвычайно медленным (через 20 часов все равно сохраняется ноль файлов). Кроме того, я вижу, что температура процессора аномально низкая (~ 45 C вместо ожидаемых 65 C).
Из этой информации я могу догадаться, что использование (почти) всех потоков моего процессора заставляет его делать что-то бесполезное, что поглощает циклы процессора, но никаких операций с плавающей запятой не выполняется. Я не вижу ввода-вывода для SSD, я использую только половину оперативной памяти.
Я запустил mpstat mpstat -A : https://pastebin.com/c19nycsT, и я вижу, что все мои ядра просто простаивают в нерабочем состоянии, что объясняет низкую температуру, однако я до сих пор не понимаю что именно является узким местом? Как мне устранить неполадки? Есть ли способ увидеть (не касаясь аппаратного обеспечения), является ли проблема пропускной способностью ОЗУ или чем-то еще?
РЕДАКТИРОВАТЬ: До меня дошло, что я неправильно использовал mpstat. Очевидно, mpstat -A дает статистику процессора с момента запуска компьютера, в то время как мне были нужны кратковременные интегрированные результаты, которые можно получить с помощью mpstat -P ALL 2 . К сожалению, я узнал об этом только после того, как убил свой код, о котором идет речь, поэтому реальных данных из mpstat нет. Тем не менее, мне все еще интересно, как можно было бы устранить такую ситуацию, когда ядра, кажется, что-то делают, но результат не показывает? Как мне найти узкое место?