Я использую Pthreads для создания нового шага для каждого раздела после того, как список будет разделен на правую и левую половины (меньше и больше, чем сводная) Я делаю это рекурсивно, пока не достигну максимально допустимого количества потоков.
Когда я использую printfs, чтобы следить за тем, что происходит в программе, я ясно вижу, что каждый поток выполняет свою делегированную работу параллельно. Однако использование одного процесса всегда является самым быстрым. Как только я пытаюсь использовать больше потоков, время, необходимое для завершения, почти удваивается и продолжает увеличиваться с увеличением количества потоков.
Мне разрешено использовать до 16 процессоров на сервере, на котором я его запускаю.
Алгоритм выглядит так:
Разбейте массив на правый и левый, сравнив элементы с осью.
Начните новый поток справа и слева и подождите, пока потоки не присоединятся обратно.
Если есть больше доступных потоков, они могут создавать более рекурсивно.
Каждый поток ожидает присоединения своих детей.
Все имеет смысл для меня, и сортировка работает отлично, но большее количество потоков делает ее очень медленной.
Я попытался установить минимальное количество элементов на раздел для запуска потока (например, 50000).
Я попробовал подход, при котором, когда поток завершен, он позволяет запускать другой поток, что приводит к тому, что сотни потоков начинаются и заканчиваются повсюду. Я думаю, что накладные расходы были слишком большими. Так что я избавился от этого, и если поток завершился, новый поток не был создан. Я получил немного большее ускорение, но все же намного медленнее, чем один процесс.
Код, который я использовал ниже.
http://pastebin.com/UaGsjcq2
Кто-нибудь знает, что я могу делать неправильно?