我正在尝试通过使用CUDA来查找字符串的所有可能组合来加速我的算法。我能做到这一点的最佳方式是什么? 例如:
abc
给出:
a
b
c
ab
ac
bc
到目前为止,我什么都没有。我不是要求代码。我只想问最好的方法吗?一个算法?伪代码?也许是讨论?
答案 0 :(得分:5)
使用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个字符的单词执行此操作,则可能会开始遇到内存限制,因为您将进行数百兆字节的争论。
答案 1 :(得分:0)
如果CUDA是解决这个问题的正确方法,我将非常非常惊讶。
但是,我会编写一个内核来查找长度为n的所有子字符串,并在循环中为每个n值从0到字符串长度启动内核。因此,内核中的每个线程都将具有完全相同的指令(没有线程将在空闲时处于空闲状态而其他线程完成)。
每个线程都会“找到”一个子字符串,所以你也可以让线程i
找到从字符串中的索引i开始的子字符串。请注意,每个子字符串长度需要不同数量的线程。
所以,对于n = 1:
thread 0: a
thread 1: b
thread 2: c
并且对于n = 2:
thread 0: ab
thread 1: bc