Как использовать pthread_setaffinity_np - PullRequest
1 голос
/ 16 ноября 2011

Я работаю над критичной к производительности системой, в которой много журналов. Я планирую сделать мои основные вычисления в потоке, который привязан к одному ядру, и регистрирует в другом потоке, который придерживается другого ядра. Как мне добиться этого в pthread_setaffinity_np ()?

Я полагаю, что мой код будет выглядеть как

void log_something(const string& st) {
  pthread_setaffinity_np(pthread_self(),sizeof(cpuset),&cpuset);
  //LOG string st; 
}

int main() {
   while (true) {
      // do some computation
      log_something(something)
   }
}

Мой вопрос: когда я вызываю pthread_setaffinity_np () в log_something (), будет ли он выполнять регистрацию в указанном мной процессоре, а во время ведения журнала возвращаться к циклу while из main () и продолжать вычисление?

Или он переключит всю программу на этот набор процессоров и вернется к основному методу только после регистрации?

Спасибо!

[ИЗМЕНЕНО] В качестве примера я использую ведение журнала, но моя практическая проблема более сложна, чем эта. Например, мне, возможно, придется обновлять динамический параметр каждую минуту, и пока я обновляю параметр, я все еще хочу продолжить вычисления в методе main () на основе старого параметра (то есть я просто не могу остановить свой основной расчет для обновления параметров). Поэтому процесс обновления параметров, возможно, придется перенести в другой поток, который придерживается другого ядра. Поэтому я ищу общее решение для разделения вычислений, а не просто эффективный регистратор.

Извините за путаницу.

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Вам понадобятся два отдельных потока, и каждый из них при запуске вызовет pthread_setaffinity_np.

Если log_something вызывается из потока вычислений, и регистрация предназначена для выполнения в потоке ведения журнала, то ему нужно будет поместить сообщение в очередь для обработки потоком ведения журнала, а не выполнять ведение журнала. сам. Поток журналирования будет опрашивать эту очередь и записывать в нее все найденные сообщения.

1 голос
/ 16 ноября 2011

Когда вы вызываете pthread_setaffinity_np, он устанавливает этот поток для выполнения на указанном cpuset навсегда.Это не как-то метод-ограничено.Из документации ,

Функция pthread_setaffinity_np () устанавливает маску сродства ЦП потока потока в набор ЦП, на который указывает cpuset.Если вызов успешен, и поток в данный момент не выполняется ни на одном из процессоров в cpuset, он переносится на один из этих процессоров.

Звучит так, как будто вы хотите выделить отдельноепоток для входа в вашу основную функцию, затем вызовите pthread_setaffinity_np с различными cpuset аргументами в главной функции и потоке регистрации.Затем вам нужен какой-то способ связи между вычислительными потоками и потоками журналирования, возможно, блокировка и очередь, возможно, что-то более сложное.Это может быть много работы.

Возможно, вы захотите взглянуть на этот вопрос SO , в котором говорится об эффективных библиотеках журналирования C ++, и выбрать одну из них, как я подозреваю, авторы библиотек ужесделал тяжелую работу.

...