Здравствуйте!Пишу кое-какую софтину на Qt.
В приложении работают несколько потоков. Для повышения быстродействия
хочу запускать их на разных ядрах процессора, но не знаю как. Хотелось
бы решить проблему средствами Qt.
Если кто решал подобную задачу, подскажите, пожалуйста!Заранее спасибо!
Распределением ресурсов занимается ядро системы/планировщик задач.
> Распределением ресурсов занимается ядро системы/планировщик задач.То есть, задача на уровне пользователя не решается???
> То есть, задача на уровне пользователя не решается???Решается, но тут уже системное программирование не на Qt.
Я не пойму смысл вопроса. Если приложение написано многопоточным, то оно и так будет исполнятся на разных ядрах/процессорах. На каких именно - зависит уже от системы.
>> То есть, задача на уровне пользователя не решается???
> Решается, но тут уже системное программирование не на Qt.
> Я не пойму смысл вопроса. Если приложение написано многопоточным, то оно
> и так будет исполнятся на разных ядрах/процессорах. На каких именно -
> зависит уже от системы.Не очень-то оптимистичный ответ)
Поискал в нете, нашел некий класс QtConcurrent:"Программы, написанные с помощью QtConcurrent, автоматически приводят количество используемых потоков в соответствие с доступным количеством процессорных ядер. Это означает, что приложения написанные сегодня, будут продолжать масштабироваться при развертывании на многоядерных системах в будущем."
Кто-нибудь использовал эту штуку?
>[оверквотинг удален]
>> Я не пойму смысл вопроса. Если приложение написано многопоточным, то оно
>> и так будет исполнятся на разных ядрах/процессорах. На каких именно -
>> зависит уже от системы.
> Не очень-то оптимистичный ответ)
> Поискал в нете, нашел некий класс QtConcurrent:
> "Программы, написанные с помощью QtConcurrent, автоматически приводят количество используемых
> потоков в соответствие с доступным количеством процессорных ядер. Это означает, что
> приложения написанные сегодня, будут продолжать масштабироваться при развертывании на
> многоядерных системах в будущем."
> Кто-нибудь использовал эту штуку?Есть в Qt класс QThread
Наследуете от него класс, выполняющий Вашу, требующую распараллеливания функцию (со всякими там QMutex-ами и т.д., если надо).
Потом порождаете QThread::idealThreadCount() Ваших потоков и start()-уете их.
Получается оптимальная загрузка процессоров при мультиплатформенном решении и без системного программирования.
> Есть в Qt класс QThread
> Наследуете от него класс, выполняющий Вашу, требующую распараллеливания функцию (со всякими
> там QMutex-ами и т.д., если надо).
> Потом порождаете QThread::idealThreadCount() Ваших потоков и start()-уете их.
> Получается оптимальная загрузка процессоров при мультиплатформенном решении и без системного
> программирования."порождаете QThread::idealThreadCount() Ваших потоков и start()-уете их". Хотелось бы, чтобы я определял, сколько мне запустить потоков в приложении, а не функция idealThreadCount() =) Предположим, эта функция возвращает информацию о количестве потоков, которые можно параллельно запускать на имеющемся железе. Берем проц с 2 ядрами. По идее, функция вернет значение "2". А если в моей проге 3 потока и обязательным условием является то, что определенные 2 потока должны работать на разных ядрах? Получается, что 3 потока будут случайным образом раскиданы по 2 ядрам и те потоки, которые должны выполняться на разных ядрах, будут выполняться на одном ядре. Это не есть хорошо(
>[оверквотинг удален]
> "порождаете QThread::idealThreadCount() Ваших потоков и start()-уете их". Хотелось бы,
> чтобы я определял, сколько мне запустить потоков в приложении, а не
> функция idealThreadCount() =) Предположим, эта функция возвращает информацию о количестве
> потоков, которые можно параллельно запускать на имеющемся железе. Берем проц с
> 2 ядрами. По идее, функция вернет значение "2". А если в
> моей проге 3 потока и обязательным условием является то, что определенные
> 2 потока должны работать на разных ядрах? Получается, что 3 потока
> будут случайным образом раскиданы по 2 ядрам и те потоки, которые
> должны выполняться на разных ядрах, будут выполняться на одном ядре. Это
> не есть хорошо(По любому, 3 потока будут случайным образом (нет, не случайным, это зависит от планировщика! слышим с галерки) раскиданы по двум ядрам. СтартанИте не QThread::idealThreadCount(), а Ваше количество потоков. А в Вашем случае, надо наверное использовать не Qt, и решение будет сильно платформенно зависимым и слишком "системным", чтобы опред-е потоки запускать на опред-х ядрах.
>[оверквотинг удален]
>> моей проге 3 потока и обязательным условием является то, что определенные
>> 2 потока должны работать на разных ядрах? Получается, что 3 потока
>> будут случайным образом раскиданы по 2 ядрам и те потоки, которые
>> должны выполняться на разных ядрах, будут выполняться на одном ядре. Это
>> не есть хорошо(
> По любому, 3 потока будут случайным образом (нет, не случайным, это зависит
> от планировщика! слышим с галерки) раскиданы по двум ядрам. СтартанИте не
> QThread::idealThreadCount(), а Ваше количество потоков. А в Вашем случае, надо наверное
> использовать не Qt, и решение будет сильно платформенно зависимым и слишком
> "системным", чтобы опред-е потоки запускать на опред-х ядрах."нет, не случайным, это зависит от планировщика!". С точки зрения программы, это процесс случайный, ведь я не могу управлять планировщиком. Каким образом будет действовать планировщик при запуске процесса, я не знаю, поэтому для меня это случайный процесс
> Я не пойму смысл вопроса. Если приложение написано многопоточным, то оно
> и так будет исполнятся на разных ядрах/процессорах. На каких именно -
> зависит уже от системы.Если я не ошибаюсь, распараллеливание произойдет только в многопроцессорной системе. На процессоре с несколькими ядрами каждое новое ядро загружается вычислениями при условии, что ресурсы другого ядра полностью задействованы. Таким образом, никакой гарантии параллельного выполнения потоков на многоядерном процессоре мы не получаем. Если я не ошибаюсь...)
>На процессоре с несколькими ядрами каждое новое ядро загружается вычислениями при условии, >что ресурсы другого ядра полностью задействованы.
> Если я не
> ошибаюсь...)Ошибаетесь )