У меня есть код на C, который имеет следующую общую структуру:
while (err > tol){
func_A();
func_B();
func_C();
func_Par();
}
Коды меняют некоторые глобальные переменные и вот как они связаны. В func_Par()
, три темы созданы. Все потоки используют одну и ту же функцию, а именно Threads_Func()
, На основе номера потока, следующий код используется в Threads_Func()
чтобы изменить сродство процессора к каждому потоку:
pthread_t curThread = pthread_self();
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(thread_number, &cpuset);
pthread_setaffinity_np(curThread, sizeof(cpu_set_t), &cpuset);
Вот странное поведение, которое я не могу объяснить. Я измеряю время процессора для func_A
, func_B
а также func_C
и вот результаты (все результаты в микросекундах):
С настройкой соответствия CPU в Threads_Func()
:
func_A: 439197
func_B: 61129
func_C: 400482
func_Par: 2488662
Без настройки соответствия процессора в Threads_Func()
:
func_A: 226677
func_B: 30922
func_C: 242516
func_Par: 4843463
Как вы можете видеть, хотя функции выполняются в последовательном порядке, установка сходства cpu удваивает время в других функциях. Я пытаюсь выяснить, что я должен установить привязку к процессору (чтобы улучшить производительность в func_Par
) избегая снижения производительности в других функциях.
К вашему сведению, я компилирую код, используя gcc
и с -O0
флаг, чтобы убедиться, что компилятор не меняет порядок. Более того, я использую четырехъядерный процессор, а ОС Linux Ubuntu.
Любая помощь приветствуется.
Заранее спасибо за помощь.
Задача ещё не решена.
Других решений пока нет …