none
потоки, ядра и производительность RRS feed

  • Вопрос

  • Существует ли ограничение производительности потока? Я столкнулся с ситуацией, когда у меня тормозит обработка в одном потоке, но при этом через монитор производительности я вижу свободные ресурсы процессора (к примеру, 80% загружено, а 20% свободно).

    Это может быть из-за того, что монитор производительности показывает ресурсы всех ядер, а мой рабочий поток работает только на одном, полностью его загружает, и ему не хватает производительности? Поток ведь не может обрабатываться на разных ядрах? Если да, то какое ограничение производительности потока? Количество тиков процессора, требуемое для выполнения задачи и мощность ядра, на котором происходит выполнение? Если этого не хватает, то будут задержки, даже при свободных других ядрах?


    27 июля 2011 г. 8:39

Ответы

  • Один поток всегда выполняется строго на одном ядре (само это ядро может меняться, то есть поток может перескакивать с ядра на ядро).

    Пока поток работает (и не находится в состоянии ожидания, или Thread.Sleep()), загрузка ядра всегда 100%. Ограничений на производительность нет. Поток может быть приостановлен только если все ядра заняты, и в этот момент требуется квант времени для потока с более высоким приоритетом. в таком случае, данный поток может быть приостановлен.


    >Если этого не хватает, то будут задержки, даже при свободных других ядрах?

    Именно.


    • Помечено в качестве ответа Abolmasov Dmitry 28 июля 2011 г. 5:34
    27 июля 2011 г. 12:14
    Отвечающий
  • 1. То есть, это получается, что с точки зрения отсутствия тормозов и задержек, чем мощнее каждое ядро в отдельности, тем больше работы можно засунуть в один поток? И наоборот, чем слабее ядро и больше количество ядер, тем эффективнее делать больше потоков, но с меньшим количеством работы в каждом потоке?


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

     

    2. А можно в коде приложения установить, что при его запуске оно получиит максимальный приоритет для всех своих потоков?


    У потока можно выставить приоритет Thread.Priority. Но менять приортитет потоков не рекомендуется, да и я не думаю что это вам поможет. Для повышения быстродействия нужно либо совершенствовать алгоритм, либо/и использовать многопоточность.


    • Помечено в качестве ответа Qwester33 28 июля 2011 г. 6:05
    27 июля 2011 г. 15:08
    Отвечающий

Все ответы

  • Один поток всегда выполняется строго на одном ядре (само это ядро может меняться, то есть поток может перескакивать с ядра на ядро).

    Пока поток работает (и не находится в состоянии ожидания, или Thread.Sleep()), загрузка ядра всегда 100%. Ограничений на производительность нет. Поток может быть приостановлен только если все ядра заняты, и в этот момент требуется квант времени для потока с более высоким приоритетом. в таком случае, данный поток может быть приостановлен.


    >Если этого не хватает, то будут задержки, даже при свободных других ядрах?

    Именно.


    • Помечено в качестве ответа Abolmasov Dmitry 28 июля 2011 г. 5:34
    27 июля 2011 г. 12:14
    Отвечающий
  • 1. То есть, это получается, что с точки зрения отсутствия тормозов и задержек, чем мощнее каждое ядро в отдельности, тем больше работы можно засунуть в один поток? И наоборот, чем слабее ядро и больше количество ядер, тем эффективнее делать больше потоков, но с меньшим количеством работы в каждом потоке?

    У меня просто этот вопрос встал после смены платформы на базе коре2дую Е 8400 на платформу на базе атом D510. Приложение, в котором есть поток с кучей работы, стало тормозить... - и при этом, показывает неполную загрузку проца.

    2. А можно в коде приложения установить, что при его запуске оно получиит максимальный приоритет для всех своих потоков?


    • Изменено Qwester33 27 июля 2011 г. 15:20
    27 июля 2011 г. 12:36
  • 1. То есть, это получается, что с точки зрения отсутствия тормозов и задержек, чем мощнее каждое ядро в отдельности, тем больше работы можно засунуть в один поток? И наоборот, чем слабее ядро и больше количество ядер, тем эффективнее делать больше потоков, но с меньшим количеством работы в каждом потоке?


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

     

    2. А можно в коде приложения установить, что при его запуске оно получиит максимальный приоритет для всех своих потоков?


    У потока можно выставить приоритет Thread.Priority. Но менять приортитет потоков не рекомендуется, да и я не думаю что это вам поможет. Для повышения быстродействия нужно либо совершенствовать алгоритм, либо/и использовать многопоточность.


    • Помечено в качестве ответа Qwester33 28 июля 2011 г. 6:05
    27 июля 2011 г. 15:08
    Отвечающий