O(N^7) の時間計算量を持つプログラムの最適化に取り組んでいます。32 ビット整数として表される文字列の配列があり、各ビットは入力文字列の特定の文字に対応しています。仕事は、入力文字列のすべての組み合わせを見つけることです。各文字は 1 回だけ存在し、すべての文字が存在します。単純なソリューションには、7 つの層の再帰が必要であり、各層はリスト全体を反復します。これはすぐに非常に遅くなります。
そのため、cuda を使用してプロセスを少し高速化できるかどうか疑問に思っていました。GPU に可能な文字列の配列と、一致してはならないビットマスクを供給し、フィルター処理されたリストを取得することで、少し再帰的なステップ。
問題は、この種のフィルタリングは並列処理に適しているかということです。
私が現在 C で行っていることを以下に説明します。
void recursive_search (unsigned int used, unsigned int *list, int listlen,
int start,unsigned int * stack, int reclevel) {
int index, newindex;
newindex = 0;
for (index=0; index< listlen; index++) {
if (!list[index] & used) {
newlist[newindex++] = list[index];
}
}
if ((newindex == 1 && (used | newlist[0])) == 0xffffffff) {
/* Hooray! We have a match */
stack[reclevel] = newlist[0];
report_match(stack);
return;
}
for (index = 0;index < newindex; index++) {
recursive_search (used | newlist[index], newlist, newindex,
index, stack, reclevel + 1);
}
}
これで私の質問が明確になることを願っています。