Ответ 1
Для XP быстрый google показал следующее: https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm Помогает ли это?
У меня есть менеджер кучи памяти, который разбивает кучу на разные сегменты на основе количества процессоров в системе. Память может быть выделена только в разделе, который идет с текущим потоковым процессором. Это поможет продолжить работу различных процессоров, даже если два разных устройства хотят одновременно выделять память, по крайней мере, я полагаю.
Я нашел функцию GetCurrentProcessorNumber() для Windows, но это работает только в Windows Vista и позже. Есть ли способ, который работает в Windows XP?
Также, это можно сделать с помощью pthreads в системе POSIX?
Для XP быстрый google показал следующее: https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm Помогает ли это?
От выхода man sched_getcpu
:
NAME
sched_getcpu - determine CPU on which the calling thread is running
SYNOPSIS
#define _GNU_SOURCE
#include <utmpx.h>
int sched_getcpu(void);
DESCRIPTION
sched_getcpu() returns the number of the CPU
on which the calling thread is currently executing.
RETURN VALUE
On success, sched_getcpu() returns a non-negative CPU number.
On error, -1 is returned and errno is set to indicate the error.
SEE ALSO
getcpu(2)
К сожалению, это зависит от Linux. Я сомневаюсь, что есть переносной способ сделать это.
В дополнение к ответам Antony Vennard и кода на указанном сайте, вот код, который будет работать и для Visual С++ x64 (нет встроенного ассемблера):
DWORD GetCurrentProcessorNumberXP() {
int CPUInfo[4];
__cpuid(CPUInfo, 1);
// CPUInfo[1] is EBX, bits 24-31 are APIC ID
if ((CPUInfo[3] & (1 << 9)) == 0) return -1; // no APIC on chip
return (unsigned)CPUInfo[1] >> 24;
}
Краткий обзор реализации GetCurrentProcessorNumber() на Win7 x64 показывает, что они используют другой механизм для получения номера процессора, но в моих (нескольких) тестах результаты были одинаковыми для моего домашнего бранинга и официальной функции.
Если все, что вы хотите сделать, это избежать конкуренции, вам не нужно знать текущий процессор. Вы можете просто случайно выбрать кучу. Или у вас может быть куча на поток. Хотя вы можете столкнуться с более или менее спорными темпами, вы бы избежали накладных расходов на опрос текущего процессора, что может быть или не быть значительным. Также ознакомьтесь с блоком масштабирования Intel Thread Building Blockable_allocator, который, возможно, уже решил эту проблему лучше, чем вы.
Эта конструкция плохо пахнет мне. Кажется, вы полагаете, что поток останется связанным с конкретным процессором. Это не гарантировано. Да, поток обычно может находиться на одном CPU, но это не обязательно, и в конечном итоге ваша программа будет иметь поток, который переключает процессор. Это может произойти не часто, но в конце концов. Если ваш дизайн не учитывает это, тогда вы, скорее всего, в конечном итоге столкнетесь с какой-то трудной задачей для отслеживания ошибок.
Позвольте мне задать этот вопрос, что произойдет, если память будет выделена на одном CPU и освобождена на другой? Как будет обрабатываться ваша куча?