GetCurrentProcessorNumber() под WinXP
От: remark Россия http://www.1024cores.net/
Дата: 20.01.08 16:33
Оценка:
Как получить функциональность GetCurrentProcessorNumber()/NtGetCurrentProcessorNumber() под WinXP/2k?

Поиск дал следующие результаты.
1.
__declspec(naked) unsigned get_current_proc()
{
    __asm
    {
        mov ecx, 03Bh
        lsl eax, ecx
        shr eax, 0Eh
        retn
    }
}

Но как я понял, это будет работать только на тех версиях Windows, где работает и GetCurrentProcessorNumber(). Т.е. не будет работать под WinXP/2k.

2. С помощью инструкции CPUID получать номер APIC ID, по статической таблице переводить его в номер процессора. Это будет работать на всех версиях Windows. Практически то, что нужно, мне даже переводить в номер процессора не нужно, и так устроит, главное иметь уникальное число для каждого процессора.
Но тут полностью не устраивает, что на моём компьютере CPUID с EAX=1 выполняется 284 такта (полностью сериализует конвеер и выполняет полный барьер памяти).


В идеале хотелось чего-то вроде получения идентификатора текущего потока из блока информации потока.


з.ы. Не уверен, куда это больше — к WinAPI или Низкоуровнему программированию, поэтому пока закросспостю в оба форума. Если что можно из одного удалить.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: GetCurrentProcessorNumber() под WinXP
От: Unmanaged Россия ICQ 476611995
Дата: 20.01.08 22:48
Оценка:
R>Как получить функциональность GetCurrentProcessorNumber()/NtGetCurrentProcessorNumber() под WinXP/2k?

Что мешает самому реализовать сию функцию через драйвер режима ядра?
STATUS_INVALID_DEVICE_REQUEST
Re[2]: GetCurrentProcessorNumber() под WinXP
От: remark Россия http://www.1024cores.net/
Дата: 20.01.08 23:26
Оценка:
Здравствуйте, Unmanaged, Вы писали:

R>>Как получить функциональность GetCurrentProcessorNumber()/NtGetCurrentProcessorNumber() под WinXP/2k?


U>Что мешает самому реализовать сию функцию через драйвер режима ядра?


Я боюсь не уложиться в 100 тактов и без какой-либо сериализации
Это если будет вызов в ядро.

А можно ли "через драйвер" "добавить" поле в блок информации потока и класть в него номер процессора каждый раз при шедулинге? Это более интересный вопрос. В принципе так делать всё равно не входит в мои планы, но с познавательной т.з. очень интересный вопрос.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: GetCurrentProcessorNumber() под WinXP
От: Unmanaged Россия ICQ 476611995
Дата: 20.01.08 23:39
Оценка:
R>А можно ли "через драйвер" "добавить" поле в блок информации потока и класть в него номер процессора каждый раз при шедулинге?

Можно.
А ещё можно написать свою программно-аппаратную платформу, пересадить на неё половину человечества и не парится с отсутствием вызова NtGetCurrentProcessorNumber() на Windows < 5.2 .

R>В принципе так делать всё равно не входит в мои планы...


И правильно, ибо нех.
STATUS_INVALID_DEVICE_REQUEST
Re: GetCurrentProcessorNumber() под WinXP
От: Геннадий Майко США  
Дата: 21.01.08 06:23
Оценка: +2
Здравствуйте, remark, Вы писали:

R>Как получить функциональность GetCurrentProcessorNumber()/NtGetCurrentProcessorNumber() под WinXP/2k?

--
Зачем это нужно?

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


R>В идеале хотелось чего-то вроде получения идентификатора текущего потока из блока информации потока.

--
А почему нельзя воспользоваться функциями типа GetCurrentThreadId() или ZwQuerySystemInformation() с нужным SYSTEM_INFORMATION_CLASS?

C уважением,
Геннадий Майко.
Re[2]: GetCurrentProcessorNumber() под WinXP
От: remark Россия http://www.1024cores.net/
Дата: 21.01.08 09:49
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Здравствуйте, remark, Вы писали:


R>>Как получить функциональность GetCurrentProcessorNumber()/NtGetCurrentProcessorNumber() под WinXP/2k?

ГМ>--
ГМ>Зачем это нужно?

ГМ>Не забывайте, что этот номер может изменится, как только Вы его получите. Это резко ограничивает полезность этой функиии.


Сейчас отвечу там:
http://gzip.rsdn.ru/forum/message/2804333.1.aspx
Автор: remark
Дата: 20.01.08

(это то же но в форуме WinAPI)


R>>В идеале хотелось чего-то вроде получения идентификатора текущего потока из блока информации потока.

ГМ>--
ГМ>А почему нельзя воспользоваться функциями типа GetCurrentThreadId() или ZwQuerySystemInformation() с нужным SYSTEM_INFORMATION_CLASS?

Не вижу там нужной информации. Какой тип информации надо задавать и откуда это вытаскивать?


ГМ>C уважением,

ГМ>Геннадий Майко.

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: GetCurrentProcessorNumber() под WinXP
От: Геннадий Майко США  
Дата: 21.01.08 11:26
Оценка:
Здравствуйте, remark,

R>>>Как получить функциональность GetCurrentProcessorNumber()/NtGetCurrentProcessorNumber() под WinXP/2k?

ГМ>>--
ГМ>>Зачем это нужно?

ГМ>>Не забывайте, что этот номер может изменится, как только Вы его получите. Это резко ограничивает полезность этой функиии.


R>Сейчас отвечу там:

R>http://gzip.rsdn.ru/forum/message/2804333.1.aspx
Автор: remark
Дата: 20.01.08

--
Вспомните, что поток не может выполняться в одно и то же время на 2х или более CPU. Или, по другому, если поток выполняется, то он выполняется на одном, и только на одном, CPU. Отсюда, как мне кажется, вполне можно использовать для "контроля работы примитивов синхронизации, либо для оптимизации примитивов синхронизации" идентификатор именно потока, а не процессора.

C уважением,
Геннадий Майко.
Re[4]: GetCurrentProcessorNumber() под WinXP
От: Andrew.W Worobow https://github.com/Worobow
Дата: 21.01.08 11:34
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Вспомните, что поток не может выполняться в одно и то же время на 2х или более CPU. Или, по другому, если поток выполняется, то он выполняется на одном, и только на одном, CPU. Отсюда, как мне кажется, вполне можно использовать для "контроля работы примитивов синхронизации, либо для оптимизации примитивов синхронизации" идентификатор именно потока, а не процессора.


Генадий, ребята немного перемудряют. На самом деле все просто есть SetThreadAffinityMask, сделал два потока установил для каждного привязку к процессору. И вот тебе и номер. А точнее нефиг думать про процессор номер.
Не все кто уехал, предал Россию.
Re[5]: GetCurrentProcessorNumber() под WinXP
От: Геннадий Майко США  
Дата: 21.01.08 11:54
Оценка:
Здравствуйте, Andrew.W Worobow,

ГМ>>Вспомните, что поток не может выполняться в одно и то же время на 2х или более CPU. Или, по другому, если поток выполняется, то он выполняется на одном, и только на одном, CPU. Отсюда, как мне кажется, вполне можно использовать для "контроля работы примитивов синхронизации, либо для оптимизации примитивов синхронизации" идентификатор именно потока, а не процессора.


AWW>Генадий, ребята немного перемудряют. На самом деле все просто есть SetThreadAffinityMask, сделал два потока установил для каждного привязку к процессору. И вот тебе и номер. А точнее нефиг думать про процессор номер.

--
Well, я, пока не знаю точно, что подразумевается под выделенным выше, но если это реализация, например, какого-то рекурсивного спинлока, то вполне можно обойтись и без номера процессора. Я вспоминаю, что эту же тему мы обсуждали как-то несколько лет назад с Евгением Музыченко в другом месте, и вроде пришли к этому же выводу.

C уважением,
Геннадий Майко.
Re[6]: GetCurrentProcessorNumber() под WinXP
От: Аноним  
Дата: 21.01.08 12:08
Оценка:
AWW>>Генадий, ребята немного перемудряют. На самом деле все просто есть SetThreadAffinityMask, сделал два потока установил для каждного привязку к процессору. И вот тебе и номер. А точнее нефиг думать про процессор номер.
ГМ>--
ГМ>Well, я, пока не знаю точно, что подразумевается под выделенным выше, но если это реализация, например, какого-то рекурсивного спинлока, то вполне можно обойтись и без номера процессора. Я вспоминаю, что эту же тему мы обсуждали как-то несколько лет назад с Евгением Музыченко в другом месте, и вроде пришли к этому же выводу.
Думаю это реализация хитропопого спинлока, который перед входом проверяет каким-либо образом, в каком состоянии находится текущий процессор (idle или выполняет какой то поток) и в зависимости от этого входит в спин или в ожидание в ядре.
Re[7]: GetCurrentProcessorNumber() под WinXP
От: Геннадий Майко США  
Дата: 21.01.08 12:24
Оценка:
А>Думаю это реализация хитропопого спинлока, который перед входом проверяет каким-либо образом, в каком состоянии находится текущий процессор (idle или выполняет какой то поток) и в зависимости от этого входит в спин или в ожидание в ядре.
--
Вряд ли это так. Потому что работающий на каком-то CPU код всегда выполняет именно "свой" поток и никогда не может выполнять какой-то другой поток, включая IDLE.

C уважением,
Геннадий Майко.
Re[8]: GetCurrentProcessorNumber() под WinXP
От: Аноним  
Дата: 21.01.08 12:37
Оценка:
А>>Думаю это реализация хитропопого спинлока, который перед входом проверяет каким-либо образом, в каком состоянии находится текущий процессор (idle или выполняет какой то поток) и в зависимости от этого входит в спин или в ожидание в ядре.
ГМ>--
ГМ>Вряд ли это так. Потому что работающий на каком-то CPU код всегда выполняет именно "свой" поток и никогда не может выполнять какой-то другой поток, включая IDLE.
Это понятно. Я про то что вообще можно считать что если все другие потоки находяится в ожидании в ядре или исполеяют код на других процессорах то можно крутить спин. Если же есть какой либо поток который в Ready тогда желательно уйти в ядро освободив проц. Вот только очень подозреваю что накладные расходы на все это перевесят обычную синхронизацию.
Re[9]: GetCurrentProcessorNumber() под WinXP
От: remark Россия http://www.1024cores.net/
Дата: 21.01.08 17:29
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Если же есть какой либо поток который в Ready тогда желательно уйти в ядро освободив проц. Вот только очень подозреваю что накладные расходы на все это перевесят обычную синхронизацию.



Это делается с помощью SwitchToThread()/pthread_yield().
Нет, мне надо не для этого.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[5]: GetCurrentProcessorNumber() под WinXP
От: remark Россия http://www.1024cores.net/
Дата: 21.01.08 17:32
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Здравствуйте, Геннадий Майко, Вы писали:


ГМ>>Вспомните, что поток не может выполняться в одно и то же время на 2х или более CPU. Или, по другому, если поток выполняется, то он выполняется на одном, и только на одном, CPU. Отсюда, как мне кажется, вполне можно использовать для "контроля работы примитивов синхронизации, либо для оптимизации примитивов синхронизации" идентификатор именно потока, а не процессора.


AWW>Генадий, ребята немного перемудряют. На самом деле все просто есть SetThreadAffinityMask, сделал два потока установил для каждного привязку к процессору. И вот тебе и номер. А точнее нефиг думать про процессор номер.



SetThreadAffinityMask это палка о двух концах. Ей ты фактически выключаешь load balancing ОС, после чего load balancing надо делать вручную, что далеко не тривиальная задача. Ну ладно, допустим, в прикладном коде я могу это сделать. Но что делать, если ты работаешь на библиотечным кодом? Я не думаю, что кто-то будет использовать библиотеку, которая насильно делает привязку для всех пользовательских потоков.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: GetCurrentProcessorNumber() под WinXP
От: Andrew.W Worobow https://github.com/Worobow
Дата: 21.01.08 18:01
Оценка:
Здравствуйте, remark, Вы писали:

R>SetThreadAffinityMask это палка о двух концах. Ей ты фактически выключаешь load balancing ОС, после чего load balancing надо делать вручную, что далеко не тривиальная задача. Ну ладно, допустим, в прикладном коде я могу это сделать. Но что делать, если ты работаешь на библиотечным кодом? Я не думаю, что кто-то будет использовать библиотеку, которая насильно делает привязку для всех пользовательских потоков.


Хочешь load balancing, не лезь в процессоры.

Ты все равно вряд ли что-то сможешь улучшить. И вообще что ты хочешь сделать, не понятно? То номер процесора тебе в пользовательском режиме нужен. То LB. Определись.

Что ты хочешь улучшить, у тебя что загрузка процессора не 100% в вычислительных задачах, большие системные издержки? Где узкое место?
Не все кто уехал, предал Россию.
Re[7]: GetCurrentProcessorNumber() под WinXP
От: remark Россия http://www.1024cores.net/
Дата: 21.01.08 22:52
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:
Правила форума нарушены.
— оверквотинг
Правила можно найти в разделе FAQ данного форума и\или ресурса.
Нарушение правил может повлечь за собой санкции, описанные там же — модератор
AWW>Ты все равно вряд ли что-то сможешь улучшить. И вообще что ты хочешь сделать, не понятно? То номер процесора тебе в пользовательском режиме нужен. То LB. Определись.

О LB я упомянул только, что бы сказать, что нельзя вот так просто сделать SetThreadAffinityMask(), это компромисное решение. Помимо возможности определять номер процессора ты получишь ещё ряд артефактов, которые скорее всего ты не хочешь иметь. Больше никоим образом меня сейчас LB не интересует.

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: GetCurrentProcessorNumber() под WinXP
От: remark Россия http://www.1024cores.net/
Дата: 21.01.08 23:38
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Вспомните, что поток не может выполняться в одно и то же время на 2х или более CPU. Или, по другому, если поток выполняется, то он выполняется на одном, и только на одном, CPU. Отсюда, как мне кажется, вполне можно использовать для "контроля работы примитивов синхронизации, либо для оптимизации примитивов синхронизации" идентификатор именно потока, а не процессора.


Иногда можно, иногда нужен именно номер процессора.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: GetCurrentProcessorNumber() под WinXP
От: remark Россия http://www.1024cores.net/
Дата: 22.01.08 01:07
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Well, я, пока не знаю точно, что подразумевается под выделенным выше, но если это реализация, например, какого-то рекурсивного спинлока, то вполне можно обойтись и без номера процессора. Я вспоминаю, что эту же тему мы обсуждали как-то несколько лет назад с Евгением Музыченко в другом месте, и вроде пришли к этому же выводу.


Здесь я написал более подробно, что я имею в виду:
http://gzip.rsdn.ru/forum/message/2806303.1.aspx
Автор: remark
Дата: 22.01.08

Так же описал, почему в общем случае нельзя обойтись без номера процессора, ну точнее можно, но с ним существенно лучше.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[7]: GetCurrentProcessorNumber() под WinXP
От: Геннадий Майко США  
Дата: 22.01.08 08:16
Оценка:
Здравствуйте, remark,

R>Здесь я написал более подробно, что я имею в виду:

R>http://gzip.rsdn.ru/forum/message/2806303.1.aspx
Автор: remark
Дата: 22.01.08

R>Так же описал, почему в общем случае нельзя обойтись без номера процессора, ну точнее можно, но с ним существенно лучше.
--
В примере Вы сравниваете апельсины с яблоками, потому что результаты работы 2х функций разные. Делать какие-то далеко идущие выводы из этого, на мой взгляд, опасно. Поэтому было бы интересно посмотреть на результаты корректного сравнения, пусть даже и на надуманном примере.

Если я правильно понял, Вы хотите поместить некоторые данные в кеш процессора и работать только с ними "локально" в этом кэше, нет?

C уважением,
Геннадий Майко.
Re[8]: GetCurrentProcessorNumber() под WinXP
От: remark Россия http://www.1024cores.net/
Дата: 22.01.08 17:40
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Здравствуйте, remark,


R>>Здесь я написал более подробно, что я имею в виду:

R>>http://gzip.rsdn.ru/forum/message/2806303.1.aspx
Автор: remark
Дата: 22.01.08

R>>Так же описал, почему в общем случае нельзя обойтись без номера процессора, ну точнее можно, но с ним существенно лучше.
ГМ>--
ГМ>В примере Вы сравниваете апельсины с яблоками, потому что результаты работы 2х функций разные.

Естественно, 2 разные функции делают разное. Я сравниваю 2 разных метода решения одной и той же задачи. По-моему, тут всё корректно. А сравнивать 2 функции, которые дают одинаковый результат имхо бессмысленно...


ГМ>Делать какие-то далеко идущие выводы из этого, на мой взгляд, опасно. Поэтому было бы интересно посмотреть на результаты корректного сравнения, пусть даже и на надуманном примере.


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


ГМ>Если я правильно понял, Вы хотите поместить некоторые данные в кеш процессора и работать только с ними "локально" в этом кэше, нет?


Ну, так скажем, примерно. Совсем локально — это уже другой случай, тогда можно просто размещать данные на стеке. Я же хочу "большую часть времени" работать с данными уже находящимися в кэше процессора, но при этом иметь возможность и агрегировать эти данные.
Т.е. с логической т.з. мне нужны глобальные данные, но с физической т.з. я хочу сделать их локальными.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.