Последние пару дней я сам сталкивался с проблемой многопоточной сортировки. Как объяснено на этом слайде Caltech лучшее, что вы можете сделать, просто многопоточность каждого шага подходов разделяй и властвуй по очевидному количеству потоков (количество делений) ограничено. Я полагаю, это потому, что хотя вы можете запустить 64 подразделения в 64 потоках, используя все 64 ядра вашей машины, 4 подразделения можно запустить только в 4 потоках, 2 на 2, 1 на 1 и т. Д. Так что для многих уровней рекурсии ваша машина используется недостаточно.
Прошлой ночью мне пришло решение, которое могло бы пригодиться в моей собственной работе, поэтому я опубликую его здесь.
Если первый критерий вашей функции сортировки основан на целом числе максимального размера s, будь то действительное целое число или символ в строке, так что это целое число или символ полностью определяет самый высокий уровень вашего вида, затем Я думаю, что есть очень быстрое (и простое) решение. Просто используйте это начальное целое число, чтобы разделить вашу проблему сортировки на более мелкие проблемы сортировки, и сортируйте те, используя стандартный однопоточный алгоритм сортировки по вашему выбору. Я думаю, что деление на классы можно сделать за один проход. После выполнения независимых сортировок проблем слияния не возникает, поскольку вы уже знаете, что все в классе 1 сортируется до класса 2 и т. Д.
Пример: если вы хотите выполнить сортировку на основе strcmp (), затем используйте первый символ в вашей строке, чтобы разбить ваши данные на 256 классов, затем сортируйте каждый класс в следующем доступном потоке, пока все они не будут завершены.
Этот метод полностью использует все доступные ядра, пока проблема не будет решена, и я думаю, что это легко реализовать. Я еще не реализовал его, поэтому могут возникнуть проблемы, которые мне еще предстоит найти. Он явно не может работать для сортировок с плавающей запятой и был бы неэффективным для больших s. Его производительность также будет сильно зависеть от энтропии целого числа / символа, используемого для определения классов.
Возможно, это то, что Фабиан Стиг предложил в нескольких словах, но я прямо заявляю, что в некоторых обстоятельствах вы можете создать несколько более мелких сортов из более крупного.