Если я правильно понимаю, SleepEx
используется для приостановки потока в ожидании какого-либо условия - что говорит о том, что время, потраченное в SleepEx - это время, когда поток не делает ничего полезного. Это, в свою очередь, говорит о плохой балансировке нагрузки или конкуренции за доступ к общим переменным, или о некоторых других последствиях распараллеливания.
Прежде чем прийти к выводу, что с XP что-то не так (что может быть правильным, но вы меня не убедили), вам следует:
a) Поэкспериментируйте с распараллеливанием внешнего цикла (for(int i=0; i<nr; i++)
), а не внутреннего. Поиграйте с цикличным планированием. Попробуйте свернуть петли в одну.
b) Укажите, какие переменные являются общими, а какие частными. Я пишу на Фортране и не могу вспомнить, каковы настройки C по умолчанию, только то, что они немного отличаются. Ваши временные переменные p_a, p_b, p_c
могут быть общими, но это не выглядит так, как будто они должны быть.
c) Определите шаблоны доступа к памяти вашей программы, убедитесь, что они эффективно используют кэш.