Производительность программы в Java колеблется с изменением потока - PullRequest
1 голос
/ 01 декабря 2011

Название, которое я допускаю, немного вводит в заблуждение, но я немного растерялся, почему это происходит.

Я написал программу на Java, которая принимает аргумент x, который создает x количество потоков для выполнения работы программы. Машина, на которой я работаю, имеет 8 ядер / может обрабатывать 32 потока параллельно (каждое ядро ​​имеет 4 гиперпотока). Когда я запускаю программу после 8 потоков (то есть 22), я замечаю, что если я запускаю ее с равным количеством потоков, программа работает быстрее, чем когда я запускаю ее с 23 потоками (что на самом деле медленнее). Разница в производительности составляет около 10% между двумя. С чего бы это? Перегрузка потоков на самом деле не принимает это во внимание, и я чувствую, что, пока я работаю <32 потоков, это должно быть быстрее, если я увеличу количество потоков. </p>

Чтобы дать вам представление о том, что делает программа, программа берет массив 1000 * 1000, и каждому потоку назначается часть этого массива для обновления (округления / остатки в неравных значениях даются последнему созданному потоку).

Есть ли веская причина для разницы в производительности нечетных / четных потоков?

1 Ответ

2 голосов
/ 01 декабря 2011

Я могу представить себе две причины:

  1. Необходимость синхронизации доступа к памяти ваших ядер / потоков.Это в конечном итоге сделает недействительными кэши ядра процессора и тому подобное, что приведет к снижению производительности.Попробуйте дать им действительно непересекающиеся задачи, не позволяйте им работать с одним и тем же массивом.Смотрите: память не управляется отдельными байтами.

  2. Процессоры с гиперпоточностью часто не имеют полной производительности.Например, им, возможно, придется использовать несколько единиц с плавающей запятой.Это не имеет значения, когда, например, один поток является целочисленным по математике, а другой - с плавающей запятой.Но наличие четырех потоков, каждый из которых нуждается в единицах с плавающей запятой, означает, вероятно, ожидание, переключение контекстов, сигнализацию другого потока, переключение контекста назад, повторное ожидание ...

Всего две догадкиНапример, вы должны были указать фактический процессор, который вы используете, схему разделения и более подробную подсказку о вычислительной задаче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...