Win API для работы с ядрами

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Крылья
Сообщения: 13
Зарегистрирован: 24 мар 2015, 23:40

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сли кинете простой пример(исходник) с коментами, то буду просто счастлив!!!!
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

25 мар 2015, 11:11

Я не пользовался этими функциями, но на MSND очень подробно разжевано для чего они нужны и как с ними работать - прочитав статью, всё сразу становится на свои места. В чём проблема с MSDN? Перевести не получается? :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

25 мар 2015, 12:08

Они настолько простые, что нет смысла их детально разжевывать.
Например, в SetProcessAffinityMask передается хендл процесса и битовая маска, задающая CPU для этого процесса. Например:

Код: Выделить всё

SetProcessAffinityMask(GetCurrentProcess(), 5);
Задает для текущего процесса CPU0 и CPU2 (потому что включены биты 0 и 2 (00000101b = 5d))
It's a long way to the top if you wanna rock'n'roll
Крылья
Сообщения: 13
Зарегистрирован: 24 мар 2015, 23:40

25 мар 2015, 20:49

вы задали для текущего процесса два процессора, а мне нужно в одном процессоре (у меня он 4-х ядерный) задать два ядра на выполнение...... и еще, первый параметр, это наш процесс сам, как его представить так чтобы допустим у нас вычислялось к примеру "2+2".........в целом чтобы эти два операнда складывались на двух конкретных ядрах на процессоре....я думаю поняли...и спасибо за ответ
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

26 мар 2015, 06:54

Ну вообще то ядра - это логические CPU, которые как раз и задаются в SetProcessAffinityMask. С физическими CPU WinAPI практически не имеет дело.
как его представить так чтобы допустим у нас вычислялось к примеру "2+2".........в целом чтобы эти два операнда складывались на двух конкретных ядрах на процессоре
А это уже нужно SetProcessAffinityMask, SetThreadIdealProcessor. Разбиваем наши вычисления на отдельные потоки и каждому из них назначаем процессор(ы).
Можно предварительно получить кол-во процессоров в системе (у вас будет 4), затем сформировать общий AffinityMask для процесса (должен стать 1111b), затем сформировать AffinityMask для потоков. Если их два, то для одного будет 0011b, а для другого 1100b.
Ну и завершить можно SetThreadIdealProcessor, в котором кажется, указывается индекс предпочитаемого процессора для потока. То есть для первого будет 0, а для второго 2.
Запускаем и радуемся распределенным вычислениям =)
It's a long way to the top if you wanna rock'n'roll
Крылья
Сообщения: 13
Зарегистрирован: 24 мар 2015, 23:40

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 происходит на процессоры, типа можно создать кластер и всё такое, а на ядра нельзя расскидать а??
Аватара пользователя
WinMain
Сообщения: 913
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

03 апр 2015, 11:41

и еще хотел спросить, а вот есть библиотека mpi там есть интерфейс OpenMP , про это я читал в ...
так вот, там сказано что распараллеливание на OpenMP происходит на процессоры, типа можно создать кластер и всё такое, а на ядра нельзя расскидать а??
Если программа выполняется на одной машине, то OpenMP позволяет распараллелить выполнение процедур между ядрами процессора (или между процессорами).
Для этого в свойствах проекта нужно включить поддержку OpenMP (C/C++ -> Language -> Open MP Support). Далее в программном коде можно будет использовать специальные прагмы для распараллеливания процедур. #pragma omp (дополнительные параметры)

Более подробно эти параметры расписаны в MSDN: https://msdn.microsoft.com/en-us/librar ... .100).aspx
Алексей Бачериков
Сообщения: 0
Зарегистрирован: 03 авг 2015, 14:45

03 авг 2015, 14:53

Создаём программы на любой вкус по недорогой цене, любого уровня на сайте http://zakazprogi.usluga.me/
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

29 авг 2015, 07:58

Romeo писал(а):прочитав статью, всё сразу становится на свои места
Нда. Всё прочитало статью и потом встало на свои места. Оригинально так.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

29 авг 2015, 08:04

Крылья писал(а):вы задали для текущего процесса два процессора, а мне нужно в одном процессоре (у меня он 4-х ядерный) задать два ядра на выполнение.
Ядра - это в принципе и есть процессоры, только находящиеся в одном и том же корпусе. Возможно даже на одном и том же кристалле. У меня один четырёхелраный процессор, но винда общего корпуса в упор не замечает и считает, что процессоров 4, но одноядерных и SetupDiGetClassDevs перечисляет 4 одинаковых процессора.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить