4

スペースを含むOpenCLコンパイラに引数を渡そうとしていますが、スペースを正しく処理する方法が見つかりません(つまり、次の引数の開始として解釈するだけではありません)。私のコードは次のようなものです:

status = clBuildProgram(output_program, 1, devices, "-D OutputType=unsigned char", 0, 0);

明らかに、これは次のコンパイラエラーにつながります

Error in processing command line: Don't understand command line argument "char"!

誰かが私がそれを定義OutputTypeしたいことを理解させるための正しい構文を知っていますunsigned charか?

4

3 に答える 3

3

この質問は古いものですが、今でも時々出くわします。AMD の OpenCL ツールチェーンは、コマンドラインで定義されたマクロのスペースを処理しませんが、NVIDIA のツールチェーンでは動作するようです。

簡単な解決策は、すべてのスペースを \t に置き換えることです。

タブは、コンパイラにとって空白としてカウントされますが、プリプロセッサにとってはトークン セパレータとしてカウントされません。

于 2015-11-06T12:02:11.510 に答える
1

これはコマンド ライン スペース処理のバグであり、(少なくとも最近の NVIDIA プラットフォームでは) 標準の Unix (または少なくとも Windows) コマンドラインのようには機能しません。

\' \" \\" \\'とbacktickを含む多くの中かっこを入れてみました`。スペース自体をエスケープしようとさえしました(-D OutputType=unsigned\ char)。これは役に立ちません。コマンド ライン文字列は、おそらくスペースの位置に基づいてトークンに切り刻まれているだけであり、誰も波括弧を気にしていないようです。

1 つの解決策は、ソース コードを文字列で読み取り、その前に 1 行を追加することです。

#define OutputType unsigned char

ただし、もっと簡単な解決策が 1 つあります。ファイルに次のマクロを含める必要があります。

#define MKTWOWORD(a,b) a b

そして、次のいずれかを使用できます。

status = clBuildProgram(output_program, 1, devices,
    "-D OutputType=MKTWOWORD(unsigned,char)", 0, 0);

status = clBuildProgram(output_program, 1, devices,
    "-D OutputType=MKTWOWORD(unsigned,int)", 0, 0);

status = clBuildProgram(output_program, 1, devices,
    "-D OutputType=MKTWOWORD(signed,int)", 0, 0);

status = clBuildProgram(output_program, 1, devices,
    "-D OutputType=int", 0, 0);

利点は、ソース コード全体ではなく、コマンドラインでのみ文字列処理を行う必要があることです。

残念なことですが、ソース コード内で -D オプションを使用して MKTWOWORD マクロを取得することはできません。鶏卵問題が発生するからです。それをカーネルに含めるだけです。

于 2013-10-25T11:06:24.793 に答える
0

\" でそれらをエスケープしようとしましたか:

status = clBuildProgram(output_program, 1, devices, "-D OutputType=\"unsigned char\"", 0, 0);

?

于 2012-11-23T16:12:30.243 に答える