0

タイプ x = y + w + z または A = B*C + D などの各線形代数式に対して特定のコードを生成するコード ジェネレーターを実装しています。各式には一意の符号なしの長い ID が割り当てられ、ある時点で、この ID を一意の関数名にラップする必要があります。

同様の質問を見つけましたが、このコードを C++ で記述する必要があり、有効な URL 名が有効な C99 関数名と異なるため、解決策を私の問題に変換できませんでした。どこから始めたらいいのかわからない!

編集:関数に複数の64ビットIDを割り当てることができることを忘れていたので、IDを文字列に変換して文字列を連結すると、関数名が大きすぎてすべてのコンパイラで処理できない場合があります

編集2:わかりました、おそらく十分に正確ではありませんでした。私は OpenCL コードを生成しています。この生成には、一時ファイルを削除し、カーネルの起動時間を短縮する目的があります。何らかの理由でopenclはC99に基づいていますが、一部のコンパイルでは非常に長いカーネル名を処理できません(そのためにビルドエラーが発生しました。)すべての可能性(スカラータイプ、演算子、インライン関数など)を考慮すると、IDの64ビットはギリギリですが、それでも十分だと思います

vec0 = vec1+vec2 has for example ID 1912142123
vec1 = vec0-vec2 has for example ID 3312098234
vec2 = vec0*scal has for example ID 329084089

これら 3 つの操作は、同じカーネルに入れることができます。生成されたコードのカーネル名を生成したいのですが、コンパイラによっては _1912142123_3312098234_329084089 が長すぎる場合があります。

それが今より明確であることを願っています

4

1 に答える 1

2

次のアルゴリズムは、n 桁を使用して数値を変換します。ここで、n は有効な文字の数です。

char *digs = "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabzdefghijklmnopqrstuvwxyz_";
int n = strlen(digs);

long id = 1912142123;
char buffer[16];
int i = 0;
do
    buffer[i++] = digs[id%n];
while((id /= n)>0);
buffer[i] = 0;

digs 文字列には、すべての有効な文字が含まれている必要があります。この例では、「1912142123」は「gZEzm1」に変換されます

于 2012-12-30T18:02:44.973 に答える