У меня действительно странная проблема:
У меня есть приложение, которое запускает несколько рабочих параллельно:
for (it = jobList.begin(); it != jobList.end(); it++) {
DWORD threadId;
Job job = *it;
Worker *worker = new Worker(job);
workers[i] = worker;
threads[i++] = CreateThread((LPSECURITY_ATTRIBUTES)NULL, (DWORD)0, &launchThread, worker, (DWORD)0, &threadId);
}
WaitForMultipleObjects((DWORD)jobList.size(), threads, (BOOL)true, (DWORD)INFINITE);
Они распределяют кучу вещей, поэтому я предполагаю, что они синхронизируются по новому, но это единственное место, где они в конечном итоге синхронизируют друг друга.
Когда я запускал приложение на одноядерном компьютере, все было в порядке; когда я запускаю приложение на многоядерной машине, производительность становится намного хуже , хуже чем:
for (it = jobList.begin(); it != jobList.end(); it++) {
DWORD threadId;
Job job = *it;
Worker *worker = new Worker(job);
workers[i] = worker;
threads[i++] = CreateThread((LPSECURITY_ATTRIBUTES)NULL, (DWORD)0, &launchThread, worker, (DWORD)0, &threadId);
WaitForSingleObject(threads[i-1], (DWORD)INFINITE);
}
Кто-нибудь имеет разумное предположение, чтобы дать мне?
EDIT
Я провел несколько тестов и обнаружил, что:
- Изменение распределителя в соответствии с состоянием параллельного распределителя не помогает
- Результаты многопоточного приложения лучше на машине с ядром
2 дуэта (два ядра с общим кешем L2), чем с двойным Xeon (два процессора с разными кешами).
Я думаю, что у меня в руках есть приложение с узким местом доступа к памяти, но ... Как я могу проверить, действительно ли это проблема, или мне стоит поискать в других местах?