+ Ответить в теме
Показано с 1 по 8 из 8

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

  1. #1
    coder Крылья is on a distinguished road
    Регистрация
    24.03.2015
    Возраст
    26
    Сообщений
    13
    Вес репутации
    4

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

    Привет ребят!! проблема такая, перерыл интернет и не могу разобраться в двух функциях ..
    Я начал заниматься параллельным программированием, и мне нужно явным образом задать процессу определенное ядро в процессоре. К примеру взять два цикла и чтобы они выполнялись на разных ядрах параллельно, или запустить два потока на 2 ядра которые явно укажу..........

    Я знаю что решить эту задачу мне помогут вот эти функции:
    Код cpp:
    1.  BOOL WINAPI SetProcessAffinityMask(
    2.  _In_ HANDLE hProcess,
    3.  _In_ DWORD_PTR dwProcessAffinityMask
    4.  );
    и еще одна
    Код cpp:
    1.  BOOL WINAPI GetProcessAffinityMask(
    2.  _In_ HANDLE hProcess,
    3.  _Out_ PDWORD_PTR lpProcessAffinityMask,
    4.  _Out_ PDWORD_PTR lpSystemAffinityMask
    5.  );
    Я не могу разобраться как с ними работать, находятся они в библиотечке "windows.h" (winapi)....всё что знаю о них.

    Eсли кинете простой пример(исходник) с коментами, то буду просто счастлив!!!!
    Последний раз редактировалось Romeo; 25.03.2015 в 11:12. Причина: [code=cpp][/code]

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    36
    Сообщений
    3,089
    Вес репутации
    21

    По умолчанию Re: работа с ядрами

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

  4. #3
    system architect somewhere will become famous soon enough somewhere will become famous soon enough Аватар для somewhere
    Регистрация
    31.08.2006
    Адрес
    71 RUS
    Возраст
    35
    Сообщений
    1,837
    Вес репутации
    16

    По умолчанию Re: работа с ядрами

    Они настолько простые, что нет смысла их детально разжевывать.
    Например, в SetProcessAffinityMask передается хендл процесса и битовая маска, задающая CPU для этого процесса. Например:
    Код :
    1. SetProcessAffinityMask(GetCurrentProcess(), 5);
    Задает для текущего процесса CPU0 и CPU2 (потому что включены биты 0 и 2 (00000101b = 5d))
    It's a long way to the top if you wanna rock'n'roll

  5. #4
    coder Крылья is on a distinguished road
    Регистрация
    24.03.2015
    Возраст
    26
    Сообщений
    13
    Вес репутации
    4

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

    вы задали для текущего процесса два процессора, а мне нужно в одном процессоре (у меня он 4-х ядерный) задать два ядра на выполнение...... и еще, первый параметр, это наш процесс сам, как его представить так чтобы допустим у нас вычислялось к примеру "2+2".........в целом чтобы эти два операнда складывались на двух конкретных ядрах на процессоре....я думаю поняли...и спасибо за ответ

  6. #5
    system architect somewhere will become famous soon enough somewhere will become famous soon enough Аватар для somewhere
    Регистрация
    31.08.2006
    Адрес
    71 RUS
    Возраст
    35
    Сообщений
    1,837
    Вес репутации
    16

    По умолчанию Re: Win API для работы с ядрами

    Ну вообще то ядра - это логические 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

  7. #6
    coder Крылья is on a distinguished road
    Регистрация
    24.03.2015
    Возраст
    26
    Сообщений
    13
    Вес репутации
    4

    По умолчанию Re: Win API для работы с ядрами

    //предварительно получить кол-во процессоров в системе (у вас будет 4)....как сделать?
    //для начала нужно написать общий AffinityMask с 1111b ....а зачем он нужен ??для чего??

    //формирую два процесса "2+2" чтобы потом запустить на ядре

    //Ну и завершить можно SetThreadIdealProcessor, в котором кажется, указывается индекс предпочитаемого процессора для потока. То есть для первого будет 0, а для второго 2.
    Запускаем и радуемся распределенным вычислениям..... это как???

    вот примерно сделал код...в качестве ответа можете просто его подредактировать???
    Код cpp:
    1. #include <Windows.h>
    2. #include <iostream>
    3. #include <cstdio>
    4.  
    5. using namespace std;
    6.  
    7. int main() {
    8.  
    9.     HANDLE process1 = как мне тут указать 2+2;
    10.             HANDLE process2 = и тут 2+2;
    11.    
    12.  
    13.     BOOL success1 = SetProcessAffinityMask(process1, 3->0011b);
    14.             BOOL success2 = SetProcessAffinityMask(process2, 12->1100b);
    15.  
    16.     cout << success1 << endl;
    17.             cout << success2 << endl;
    18.     system("pause");
    19.     return 0;
    20.    
    21. }
    и еще хотел спросить, а вот есть библиотека mpi там есть интерфейс OpenMP , про это я читал тут
    так вот, там сказано что распараллеливание на OpenMP происходит на процессоры, типа можно создать кластер и всё такое, а на ядра нельзя расскидать а??
    Последний раз редактировалось Romeo; 04.04.2015 в 13:30. Причина: [code=cpp][/code]

  8. #7
    Moderator Куратор
    system architect
    WinMain will become famous soon enough Аватар для WinMain
    Регистрация
    14.01.2005
    Адрес
    Москва
    Сообщений
    912
    Вес репутации
    15

    По умолчанию Re: Win API для работы с ядрами

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

    Более подробно эти параметры расписаны в MSDN: https://msdn.microsoft.com/en-us/lib...v=vs.100).aspx
    Приглашаю на свой сайт http://winmain.org

  9. #8
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

    По умолчанию Re: Win API для работы с ядрами

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

+ Ответить в теме

Похожие темы

  1. Компонента для работы с DBF
    Всем привет! Ну вот, с 8 утра до 12 дня я перерыл огромное количество сайтов и я нашел компоненту которая делает все что нам надо с DBF базами, без...
    от Dr_Grizzly в разделе Delphi и Pascal
  2. Полезно для работы
    Если кто ищет информацию о том, как правильно составить резюме, сопроводительное письмо или пройти собеседование – зайдите на...
    от aaamnikolaev в разделе Поиск работы и заказов.
  3. Скорость работы
    Есть такая проблемма. Сам решить не могу её. Программа на дэльфе 7. В программе основная процедура ведёт некоторые рассчёты. Эта процедура...
    от Wormkeeper в разделе Delphi и Pascal
  4. лаб.работы на Pascal
    Здравствуйте, помогите пожалуйста сделать лабораторные работы на Pascal. Всему буду рада, любому совету. №1. (Все вычисления производить только...
    от nika|tin в разделе задачи на Паскале и Delphi
  5. Заказ работы.
    Требуется скорректировать готовый скрипт. Скрипт – каталог сайтов на РНР с использованием MySQL. Что требуется: 1. В каталоге предусмотрено...
    от Masten в разделе Вакансии и заказы для программистов

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения