|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Многопоточность и загрузка 8-и ядерного процессора
Добрый день. Есть следующая ситуация:
1. Комп(i7 8 вирт. ядер; 8гб ОЗУ; ВЫНь7 х64; SSD для хранения данных; ХЕ10.2.3) 2. программа для обработки текстовых файлов в многопоточном режиме (настройка от 2 до 100 потоков) - вызывается поток - потоку передается путь к файлу - поток считывает файл, изучает содержимое(есть несколько циклов ДЛЯ с большим числом итераций) - поток принимает решение и копирует файл в другие каталоги Результаты: - сколько не выставляй количество потоков, все рано загрузка процессора 11-13% (всегда только 4-е ядра загружены на 25%) - это все по манагеру задач конечно - пропорциональный рост потребляемой памяти, тут все понятно Вопрос: как всетаки загрузить проц на все 200% ? видимо есть какие то варианты? или какието встроенные ограничения? Всем ответившим по делу заранее спасибо. |
#2
|
|||
|
|||
Очень зависит от типа загрузки. Как я понимаю, тут несколько проблем.
1. Тип вычислений. Похоже у тебя идет в основном целочисленная нагрузка. Т.О. уже на четырех физ. ядрах использованны все блоки целочисленных вычислений проца, так что виртуальные ядра, фактически, конкурируют с физическими за те же ресурсы. Т.е. при отключении виртуализации у тебя должна получиться загрузка 4х ядер на 50% 2. Надо смотреть как реализованна обработка данных. Есть вариант, что у тебя процессор ждет память (т.е. пока подгрузится нужный кусок в кеш процессора). Тут м.б. имеет смысл поиграться с кол-вом потоков и размером буферов, которые ты выделяешь для загрузки данных из файлов. 3. Связанная с п.2 проблема. Если ты оперируешь большими кусками памяти (в сумме больше, чем есть доступной физ. памяти), то винда начинает свопиться. Это убивает производительность дисковой подсистеся и процессор, опять же, ждет пока будут подгруженны нужные страницы из свопа. С первым ничего поделать скорее всего не получится. Если только попробовать переписать код с испольщованием SIMD инструкций. С 2 и 3 надо играться с кол-вом потоков vs размером буферов. Может помочь частичть с загрузкой проца. |
#3
|
|||
|
|||
" Тип вычислений. Похоже у тебя идет в основном целочисленная нагрузка." вычислений(арифметических действий над ИНТ) практически нет. зато есть операции сравнения строк в цикле ДЛЯ и ПОВТОР причем доходит до 1500 на 50000(строк). программа анализирует тексты
"то винда начинает свопиться" если отключить перезапись файлов то все по прежнему наверно затычка в циклах, проц не тянет крутить цикл быстрее. но для этого вводилась многопоточность, типа один не тянет пускай другие ядра пашут. но ядра то загружены на 25% что то рисунок из каталога не вставить, а сцылки нет в общем 4-е ядра нагружены на 25% и не выше |
#4
|
|||
|
|||
1. Сравнение строк это и есть целочисленная арифметика.
2. Я говорю про своп памяти. То, что ты там у себя отключаешь в коде тут неважно. 3. Да как бы сами циклы тут точно непричем. Тут дело в теле цикла. Я же говорю, что очень похоже на попадание мимо кеша + своп памяти. Проц просто тупо ждет пока данные в кеш попадут. |
#5
|
|||
|
|||
понятно. будем думать. а тут есть серверок многопроцессрный и многоядерный, будет неудачно грузить его на 1% от возможного
|