Могу ли я программно выбирать, на каком ядре многоядерного процессора должен работать мой поток? - PullRequest
6 голосов
/ 06 декабря 2009

Или это управляется операционной системой? Я слышал, что новый язык Go от Google имеет встроенные функции, позволяющие программисту идти по этому пути, или я неправильно понял?

Ответы [ 3 ]

3 голосов
/ 06 декабря 2009

Определяется операционной системой.

Вы можете установить подсказки для него с помощью pthread_attr_setaffinity_np().

Но операционная система может переопределить вас. Вышеуказанный вызов - только предложение, которое ваша программа делает для ОС.

Что касается Go, я еще не работал с ним или даже не слишком глубоко изучал его, но мое понимание Go состоит в том, что большая часть параллелизма довольно неявна. У вас есть ко-рутины (они говорят «рутины», очень маленькие) и общение между ними. Кажется, что сродство ЦП и сама концепция многопоточности отделены от этого. То есть языковая среда исполнения может даже решить сделать все это на 1 процессоре, если решит, что это лучше ... Но опять же, я предупреждаю, что я не слишком внимательно смотрел на это, поэтому я могу ошибаться. : -)

2 голосов
/ 06 декабря 2009

Ответ - да, вы можете программно выбрать ядро, на котором будет выполняться процесс. Как уже упоминалось, ответ лежит с помощью sched_set_affinity (), а затем pthread_setaffinity_np () для pthreads.

Вот отличный учебник о том, как сделать это с процессами (который приходит из ответа на этот вопрос.)

По сути, это делается с помощью битовой маски. Это означает, что существует целое число (скажем, 32 бита), и если первый бит == 1, то этому процессу разрешено запускаться на процессоре 1. Если второй бит == 1, то этому процессу разрешено запускаться на процессор 2. и т. д.

Таким образом, по умолчанию битовая маска сродства = 1 ... 111 (32 раза). Это означает, что «процесс может выполняться на процессоре 1, 2, 3, ..., 32». Конечно, если у вас есть только 2 ядра, дополнительные 30 бит не будут применяться.

Однако, если вы установите эту битовую маску равной: 0 ... 010, тогда только «процессор 2» может выполнять этот процесс.

Это также объясняет, почему максимальное число *1016* процессоров, поддерживаемых linux, равно 32. («из коробки», без настройки, x86, на большинстве распространенного оборудования, без кластеризации и т. Д. И т. Д.).

2 голосов
/ 06 декабря 2009

Для ОС Linux, sched_setaffinity - ваш ответ. Поддерживается начиная с ядра Linux 2.5.8.

Имя

sched_setaffinity, sched_getaffinity - установить и получить маску сродства ЦП процесса

#define _GNU_SOURCE
#include <sched.h>

int sched_setaffinity(  pid_t pid,
    size_t cpusetsize,
    cpu_set_t *mask);

int sched_getaffinity(  pid_t pid,
    size_t cpusetsize,
    cpu_set_t *mask);

Маска сродства на самом деле атрибут для потока, который может быть корректируется независимо для каждого из темы в группе потоков. Значение вернулся из звонка в gettid (2) может передаваться в аргументе pid. Указание pid как 0 установит атрибут для вызывающего потока, и Передача значения, возвращенного из вызова getpid (2) установит атрибут для основной нити нити группа. (Если вы используете POSIX API потоков, затем используйте pthread_setaffinity_np (3) вместо sched_setaffinity ().)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...