Страница 1 из 2
Win API для работы с ядрами
Добавлено: 24 мар 2015, 23:43
Крылья
Привет ребят!! проблема такая, перерыл интернет и не могу разобраться в двух функциях ..
Я начал заниматься параллельным программированием, и мне нужно явным образом задать процессу определенное ядро в процессоре. К примеру взять два цикла и чтобы они выполнялись на разных ядрах параллельно, или запустить два потока на 2 ядра которые явно укажу..........
Я знаю что решить эту задачу мне помогут вот эти функции:
Код: Выделить всё
BOOL WINAPI SetProcessAffinityMask(
_In_ HANDLE hProcess,
_In_ DWORD_PTR dwProcessAffinityMask
);
и еще одна
Код: Выделить всё
BOOL WINAPI GetProcessAffinityMask(
_In_ HANDLE hProcess,
_Out_ PDWORD_PTR lpProcessAffinityMask,
_Out_ PDWORD_PTR lpSystemAffinityMask
);
Я не могу разобраться как с ними работать, находятся они в библиотечке "windows.h" (winapi)....всё что знаю о них.
Eсли кинете простой пример(исходник) с коментами, то буду просто счастлив!!!!
Re: работа с ядрами
Добавлено: 25 мар 2015, 11:11
Romeo
Я не пользовался этими функциями, но на
MSND очень подробно разжевано для чего они нужны и как с ними работать - прочитав статью, всё сразу становится на свои места. В чём проблема с MSDN? Перевести не получается?

Re: работа с ядрами
Добавлено: 25 мар 2015, 12:08
somewhere
Они настолько простые, что нет смысла их детально разжевывать.
Например, в SetProcessAffinityMask передается хендл процесса и битовая маска, задающая CPU для этого процесса. Например:
Код: Выделить всё
SetProcessAffinityMask(GetCurrentProcess(), 5);
Задает для текущего процесса CPU0 и CPU2 (потому что включены биты 0 и 2 (00000101b = 5d))
Re: Win API для работы с ядрами
Добавлено: 25 мар 2015, 20:49
Крылья
вы задали для текущего процесса два процессора, а мне нужно в одном процессоре (у меня он 4-х ядерный) задать два ядра на выполнение...... и еще, первый параметр, это наш процесс сам, как его представить так чтобы допустим у нас вычислялось к примеру "2+2".........в целом чтобы эти два операнда складывались на двух конкретных ядрах на процессоре....я думаю поняли...и спасибо за ответ
Re: Win API для работы с ядрами
Добавлено: 26 мар 2015, 06:54
somewhere
Ну вообще то ядра - это логические CPU, которые как раз и задаются в SetProcessAffinityMask. С физическими CPU WinAPI практически не имеет дело.
как его представить так чтобы допустим у нас вычислялось к примеру "2+2".........в целом чтобы эти два операнда складывались на двух конкретных ядрах на процессоре
А это уже нужно SetProcessAffinityMask, SetThreadIdealProcessor. Разбиваем наши вычисления на отдельные потоки и каждому из них назначаем процессор(ы).
Можно предварительно получить кол-во процессоров в системе (у вас будет 4), затем сформировать общий AffinityMask для процесса (должен стать 1111b), затем сформировать AffinityMask для потоков. Если их два, то для одного будет 0011b, а для другого 1100b.
Ну и завершить можно SetThreadIdealProcessor, в котором кажется, указывается индекс предпочитаемого процессора для потока. То есть для первого будет 0, а для второго 2.
Запускаем и радуемся распределенным вычислениям =)
Re: Win API для работы с ядрами
Добавлено: 26 мар 2015, 10:20
Крылья
//предварительно получить кол-во процессоров в системе (у вас будет 4)....как сделать?
//для начала нужно написать общий AffinityMask с 1111b ....а зачем он нужен ??для чего??
//формирую два процесса "2+2" чтобы потом запустить на ядре
//Ну и завершить можно SetThreadIdealProcessor, в котором кажется, указывается индекс предпочитаемого процессора для потока. То есть для первого будет 0, а для второго 2.
Запускаем и радуемся распределенным вычислениям..... это как???
вот примерно сделал код...в качестве ответа можете просто его подредактировать???
Код: Выделить всё
#include <Windows.h>
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
HANDLE process1 = как мне тут указать 2+2;
HANDLE process2 = и тут 2+2;
BOOL success1 = SetProcessAffinityMask(process1, 3->0011b);
BOOL success2 = SetProcessAffinityMask(process2, 12->1100b);
cout << success1 << endl;
cout << success2 << endl;
system("pause");
return 0;
}
и еще хотел спросить, а вот есть библиотека mpi там есть интерфейс OpenMP , про это я читал
тут
так вот, там сказано что распараллеливание на OpenMP происходит на процессоры, типа можно создать кластер и всё такое, а на ядра нельзя расскидать а??
Re: Win API для работы с ядрами
Добавлено: 03 апр 2015, 11:41
WinMain
и еще хотел спросить, а вот есть библиотека mpi там есть интерфейс OpenMP , про это я читал в ...
так вот, там сказано что распараллеливание на OpenMP происходит на процессоры, типа можно создать кластер и всё такое, а на ядра нельзя расскидать а??
Если программа выполняется на одной машине, то OpenMP позволяет распараллелить выполнение процедур между ядрами процессора (или между процессорами).
Для этого в свойствах проекта нужно включить поддержку OpenMP (
C/C++ -> Language -> Open MP Support). Далее в программном коде можно будет использовать специальные прагмы для распараллеливания процедур.
#pragma omp (дополнительные параметры)
Более подробно эти параметры расписаны в MSDN:
https://msdn.microsoft.com/en-us/librar ... .100).aspx
Re: Win API для работы с ядрами
Добавлено: 03 авг 2015, 14:53
Алексей Бачериков
Создаём программы на любой вкус по недорогой цене, любого уровня на сайте
http://zakazprogi.usluga.me/
Re: работа с ядрами
Добавлено: 29 авг 2015, 07:58
Сионист
Romeo писал(а):прочитав статью, всё сразу становится на свои места
Нда. Всё прочитало статью и потом встало на свои места. Оригинально так.
Re: Win API для работы с ядрами
Добавлено: 29 авг 2015, 08:04
Сионист
Крылья писал(а):вы задали для текущего процесса два процессора, а мне нужно в одном процессоре (у меня он 4-х ядерный) задать два ядра на выполнение.
Ядра - это в принципе и есть процессоры, только находящиеся в одном и том же корпусе. Возможно даже на одном и том же кристалле. У меня один четырёхелраный процессор, но винда общего корпуса в упор не замечает и считает, что процессоров 4, но одноядерных и SetupDiGetClassDevs перечисляет 4 одинаковых процессора.