如何修改此组合算法以在支持cuda的gpu上并行运行?

如何修改此组合算法以在支持cuda的gpu上并行运行?,c,algorithm,cuda,parallel-processing,gpu,C,Algorithm,Cuda,Parallel Processing,Gpu,我目前有一个c程序,可以生成所有可能的字符串组合。请注意组合,而不是排列。以下是节目: #include <stdio.h> #include <string.h> #include <stdlib.h> //Constants static const char set[] = "abcd"; static const int setSize = sizeof(set) - 1; void brute(char* temp, int index, in

我目前有一个c程序,可以生成所有可能的字符串组合。请注意组合,而不是排列。以下是节目:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//Constants
static const char set[] = "abcd";
static const int setSize = sizeof(set) - 1;

 void brute(char* temp, int index, int max){
     //Declarations
     int i;
     for(i = 0; i < setSize; i++){
         temp[index] = set[i];
         if(index == max - 1){
                printf("%s\n", temp);
         }
         else{
              brute(temp, index + 1, max);
         }
   }
}

void length(int max_len){
   //Declarations
   char* temp = (char *) malloc(max_len + 1);
   int i;

   //Execute
   for(i = 1; i <= max_len; i++){
         memset(temp, 0, max_len + 1);
         brute(temp, 0, i);
   }
   free(temp);
}


int main(void){
   //Execute
   length(2);
   getchar();
   return 0;
}
cuda版本的原始程序基本上是c程序的精确副本(请注意,它是用
-arch=sm_20
编译的。因此,
printf
和其他主机函数在cuda环境中工作)

我的目标是计算
a-z、a-z、0-9和其他字符的组合,最大长度为10。在这种情况下,我希望这个程序在我的gpu上运行。现在,它没有利用并行处理——这显然违背了用cuda编写程序的全部目的。但是,除了将线程委托给特定的索引或起点之外,我不确定如何删除程序的递归性质

任何建设性的意见都将不胜感激

此外,我在连续编译时偶尔会收到一条警告消息(这意味着它偶尔会出现):
警告:无法静态确定输入函数“\u Z8length\u di”的堆栈大小

我还没有找出问题所在,但我想我会把它贴出来,以防有人在我之前发现了原因。它正在visual studio 2012中编译


注意:我发现这相当有趣。正如cuda程序现在一样,它向控制台的输出是周期性的——这意味着它打印几十个组合、暂停、打印几十个组合、暂停等等。我在报告的gpu使用情况中也观察到了这种行为——它周期性地从5%波动到100%。

我认为不需要为此使用递归。(我不会)

使用内核中的
printf
;它不是专门为这个目的设计的。内核的
printf
消除了GPU可能具有的任何速度优势。我假设,如果你在测试这样一个大的向量空间,你的目标不是打印出每个组合。即使这是您的目标,
printf
来自内核也不是您的目标

您将遇到的另一个问题是您所考虑的整个向量空间的存储。如果您打算对每个向量进行一些处理,然后可以丢弃它,那么存储不是问题。但是,对于长度为n=10的向量空间,其“数字”(元素)具有k=62或更多可能值(a..z、a..z、0..9等)的存储将是巨大的。它由k^n给出,所以在这个例子中是62^10个不同的向量。如果每个数字都需要一个字节来存储,那将超过7万亿GB。所以这就意味着整个向量空间的存储是不可能的。无论你要做什么工作,你都必须马上去做

鉴于上述讨论,您应该拥有几乎所有您需要的东西。矢量数字被处理为
无符号整数
,您可以在
无符号整数
和您的“数字”(即a..z、a..z、0..9等)之间创建所需的任何映射。在该示例中,对每个矢量执行的函数是测试数字的总和是否匹配某个值,因此,您可以替换内核中的这一行:

  if (vec_sum(vec, n) == sum) atomicAdd(count, 1UL);

使用您希望应用于生成的每个向量的任何函数和处理。您甚至可以在此处放置一个
printf
,但对于较大的空间,输出将是零碎和不完整的。

您可能对@jackolanten给出的计算置换的答案感兴趣。你可能会对我给出的答案感兴趣,它创造了组合。您看到的警告与递归函数调用有关。这不一定是个问题。您应该指明编译它所使用的确切的
nvcc
compile命令。@RobertCrovella我一定会读到的。下面是visual studio发出的编译命令:
nvcc.exe“-gencode=arch=compute\u 20,code=\“sm\u 20,compute\u 20\”--使用本地环境--cl版本2012-ccbin“C:\Program Files(x86)\Microsoft visual studio 11.0\VC\bin”-I“C:\…\include”-I“C:\Program Files\NVIDIA GPU计算工具包\CUDA\v5\include“-G--keep dir Debug-maxrregcount=0--machine 32--compile-cudart static-G-DWIN32-D_Debug-D_CONSOLE-D_MBCS-Xcompiler”/EHsc/W3/nologo/Od/Zi/RTC1/MDd“-o Debug\kernel.cu.obj”D:\…\cuda_permute\cuda_permute\kernel.cu”
这是类的赋值吗?@robertrovella不,不是。我对并行计算感兴趣有一段时间了,我想做一个项目。这是我正在写的一部暴力小说的一部分。是的,我不打算以任何方式存储这些向量。我只需要计算并丢弃它们。
printf
只是为了验证程序是否正常工作。谢谢你的意见。
  if (vec_sum(vec, n) == sum) atomicAdd(count, 1UL);