Определить процессор (ядро), используемый конкретным потоком

Я хотел бы знать, можно ли идентифицировать физический процессор (ядро), используемый потоком, с конкретным thread-id?

Например, у меня есть многопоточное приложение с двумя (2) потоками (например, thread-id = 10 и thread-id = 20). Я запускаю приложение в системе с двухъядерным процессором (ядро 1 и ядро ​​2). Итак, как мне получить номер ядра, используемый потоком с thread-id = 20?

P.S. Платформы Windows.

Спасибо,

Денис.


person DenisL    schedule 29.07.2010    source источник


Ответы (2)


Если вы не используете сходство потоков, потоки не назначаются конкретным ядрам. С каждым временным срезом поток может выполняться на разных ядрах. Это означает, что если бы была функция для получения ядра потока, к тому времени, когда вы получите возвращаемое значение, есть большая вероятность, что поток уже выполняется на другом ядре.

Если вы используете привязку к потоку, вы можете взглянуть на функции привязки к потоку Windows (http://msdn.microsoft.com/en-us/library/ms684847%28v=VS.85%29.aspx).

person Patrick    schedule 29.07.2010
comment
Спасибо за ответ, Патрик! Вот и возник еще вопрос - можно ли узнать, сколько времени конкретный поток работает на конкретном ядре? (например, какой-то поток выполняет 20% своего временного интервала на ядре 1, а 80% своего временного интервала выполняется на ядре 2) - person DenisL; 31.07.2010
comment
Не то, чтобы я знал Дениса. Что вы можете сделать, так это ограничить поток определенными ядрами (это называется привязкой к потоку). Возможно, вы можете разделить свой процесс на несколько потоков, где каждый поток назначается одному ядру. Можете ли вы объяснить, в чем заключается исходная проблема? (что приводит к вашему первоначальному вопросу) Возможно, вашу проблему можно решить по-другому. - person Patrick; 02.08.2010
comment
Мне было поручено создать две функции: 1. Первая функция возвращает общее использование многоядерного процессора по конкретному идентификатору потока. Я реализовал функцию, используя функции счетчика производительности. 2. Вторая функция возвращает конкретное использование ядра по конкретному идентификатору потока. Я понятия не имею, как создать функцию, кажется, это невозможно. - person DenisL; 02.08.2010
comment
Я тоже считаю, что это невозможно. - person Patrick; 02.08.2010

Существуют функции с именами GetCurrentProcessorNumber (доступны, начиная с Server 2003 и Vista) и GetCurrentProcessorNumberEx (доступны, начиная с Server 2008 R2 и Windows 7).

См. также ответы на этот вопрос для дополнительных связанных параметров и соображений (включая Windows XP - в первую очередь этот ответ, описывающий использование инструкции cpuid).

Конечно, номер ядра может быть изменен планировщиком в любое время, поэтому, если вам нужно быть уверенным, возможно, это поможет за разумную сумму, если вы проверите номер ядра как до, так и после того, что вы измеряли или выполняли в течение короткого промежутка времени. и если номер ядра все тот же, то вы знаете, на каком ядре, скорее всего, также выполняется промежуточный код.

person Roland Pihlakas    schedule 19.12.2013