Преимущество использования CUDA заключается в большом параллелизме с потенциально тысячами потоков с небольшими накладными расходами. Для этого вам нужно найти способ разделить проблему на маленькие куски, не слишком полагаясь на связь между потоками. В этой задаче у вас есть n
символов, и каждый может присутствовать или отсутствовать в каждой выходной строке. Это дает 2^n
всего выходных строк. (Вы удалили пустую строку и исходную строку из своего списка ... если это желаемый результат, то у вас есть 2^n - 2
всего выходных строк.)
В любом случае, один из способов разделить работу по созданию строк - назначить каждой потенциальной выходной строке номер и заставить каждый поток вычислить выходные строки для определенного диапазона чисел. Преобразование числа в выходную строку легко, если вы посмотрите на двоичное представление каждого числа. Каждая двоичная цифра в n
-битном числе соответствует символу в строке длиной n
. Таким образом, для вашего примера число 5 или 101
в двоичном коде отображается на строку "ac"
. Перечисленные вами строки будут созданы путем вычисления отображений для чисел от 1 до 6 следующим образом:
1 c
2 b
3 bc
4 a
5 ac
6 ab
Вы можете вычислить 7
, чтобы получить abc
или 0
, чтобы получить пустую строку, если хотите.
Если вы не делаете это для слов длиннее дюжины или около того символов, я не уверен, что это будет намного быстрее, хотя. Если вы делаете это для слов длиннее 25 или около того символов, вы можете столкнуться с ограничениями памяти, поскольку вы будете спорить сотни мегабайт.