如何找到字符串的所有可能组合?使用CUDA

如何找到字符串的所有可能组合?使用CUDA,c,cuda,C,Cuda,我试图通过使用CUDA查找字符串的所有可能组合来加速我的算法。实现这一目标的最佳方式是什么? 例如: 给出: a b c ab ac bc 到目前为止我什么都没有。我不是要密码。我只是想知道最好的方法?算法?伪代码?也许讨论一下 使用CUDA的优点是具有大量并行性,可能有数千个线程,开销很小。为此,您必须找到一种方法,将问题分成小块,而不太依赖线程之间的通信。在这个问题中,您有n个字符,每个字符在每个输出字符串中都可以存在或不存在。这将产生2^n总输出字符串。(您已经从列表中删除了空字符串和原

我试图通过使用CUDA查找字符串的所有可能组合来加速我的算法。实现这一目标的最佳方式是什么?
例如:

给出:

a
b
c
ab
ac
bc

到目前为止我什么都没有。我不是要密码。我只是想知道最好的方法?算法?伪代码?也许讨论一下

使用CUDA的优点是具有大量并行性,可能有数千个线程,开销很小。为此,您必须找到一种方法,将问题分成小块,而不太依赖线程之间的通信。在这个问题中,您有
n
个字符,每个字符在每个输出字符串中都可以存在或不存在。这将产生
2^n
总输出字符串。(您已经从列表中删除了空字符串和原始字符串……如果这是所需的结果,则您有
2^n-2
total输出字符串。)

在任何情况下,一种划分创建字符串工作的方法是为每个潜在的输出字符串分配一个数字,并让每个线程计算特定数字范围的输出字符串。如果查看每个数字的二进制表示,那么从数字到输出字符串的映射很容易。
n
位数字中的每个二进制数字对应于长度为
n
的字符串中的一个字符。因此,对于您的示例,二进制中的数字5或
101
映射到字符串
“ac”
。您列出的字符串将通过计算从1到6的数字的映射来创建,如下所示:

1      c
2      b
3      bc
4      a
5      ac
6      ab
如果需要,您可以计算
7
以获得
abc
0
以获得空字符串


除非你用的字长超过十几个字符,否则我不确定这会快多少。如果你的字长超过25个字符左右,你可能会开始遇到内存限制,因为你要处理数百兆字节的数据。

使用CUDA的优势是大规模并行,可能有数千个线程,开销很小。为此,您必须找到一种方法,将问题分成小块,而不太依赖线程之间的通信。在这个问题中,您有
n
个字符,每个字符在每个输出字符串中都可以存在或不存在。这将产生
2^n
总输出字符串。(您已经从列表中删除了空字符串和原始字符串……如果这是所需的结果,则您有
2^n-2
total输出字符串。)

在任何情况下,一种划分创建字符串工作的方法是为每个潜在的输出字符串分配一个数字,并让每个线程计算特定数字范围的输出字符串。如果查看每个数字的二进制表示,那么从数字到输出字符串的映射很容易。
n
位数字中的每个二进制数字对应于长度为
n
的字符串中的一个字符。因此,对于您的示例,二进制中的数字5或
101
映射到字符串
“ac”
。您列出的字符串将通过计算从1到6的数字的映射来创建,如下所示:

1      c
2      b
3      bc
4      a
5      ac
6      ab
如果需要,您可以计算
7
以获得
abc
0
以获得空字符串


除非你用的字长超过十几个字符,否则我不确定这会快多少。如果你的字长超过25个字符左右,你可能会开始遇到内存限制,因为你要处理数百兆字节的数据。

如果CUDA是这个问题的正确解决方案,我会非常非常惊讶

但是,我将编写一个内核来查找长度为n的所有子字符串,并在循环中为从0到字符串长度的每个n值启动内核。因此,内核中的每个线程都将具有完全相同的指令(没有线程会在其他线程完成时处于空闲状态)

每个线程将“查找”一个子字符串,因此您最好让线程
i
查找字符串中从索引i开始的子字符串。请注意,每个子字符串长度需要不同数量的线程

因此,对于n=1:

thread 0: a
thread 1: b
thread 2: c
对于n=2:

thread 0: ab
thread 1: bc

如果CUDA是这个问题的正确解决方案,我会非常非常惊讶

但是,我将编写一个内核来查找长度为n的所有子字符串,并在循环中为从0到字符串长度的每个n值启动内核。因此,内核中的每个线程都将具有完全相同的指令(没有线程会在其他线程完成时处于空闲状态)

每个线程将“查找”一个子字符串,因此您最好让线程
i
查找字符串中从索引i开始的子字符串。请注意,每个子字符串长度需要不同数量的线程

因此,对于n=1:

thread 0: a
thread 1: b
thread 2: c
对于n=2:

thread 0: ab
thread 1: bc

请定义“字符串的所有可能组合”(带有一些示例)、到目前为止您拥有的内容、遇到的问题以及为什么要使用CUDA?您仍然没有显示到目前为止您拥有的内容以及遇到的问题。请先在CPU中执行此操作,以便了解如何完成此任务。请定义“字符串的所有可能组合”(附几个示例),到目前为止,你有什么,你被困在哪里,为什么你想用CUDA来做这个?你仍然没有展示到目前为止你有什么,你在哪里,先在CPU上做,这样你就会知道如何完成这个任务。好的算法。我已经试过了,我在CPU版本上有很好的加速。超过30xGood algo。我已经试过了,速度也很快CPU版本的ups。超过30倍