記事 ID: 000086479 コンテンツタイプ: トラブルシューティング 最終改訂日: 2018/12/13

ホストコードで OpenCL™ kernel 引数がある限り、タイプを使用すると「CL_INVALID_ARG_SIZE」エラーが表示されるのはなぜですか?

環境

  • インテル® Quartus® Prime 開発ソフトウェア・スタンダード・エディション
  • インテル® Quartus® Prime 開発ソフトウェア・プロ・エディション
  • インテル® FPGA SDK for OpenCL™ プロ・エディション
  • BUILT IN - ARTICLE INTRO SECOND COMPONENT
    詳細

    OpenCL で署名付きまたは署名付きのロングタイプが使用されている場合™以下のようにホストコード機能clSetKernelNf()

    長い長いデータが 1 の場合、

    clSetKernel 2(カーネル、0、sizeof (長い長いメッセージが見られる)、(void*)&data);

    次に、openCL™ 用のインテル® SDKを使用してホストコードをコンパイルすると、次のようなエラーが発生する可能性があります。

    コンテキスト・コンテキスト・コンテキスト: 引数のサイズが間違ったサイズです

    エラー: CL_INVALID_ARG_SIZE

    場所: host/src/main.cpp:91

    kernel arg 0 の設定に失敗しました

    このエラーは、OpenCL™ のインテル® SDK 18.1 以前のバージョンでは表示されませんでした。このエラーが表示されるのは、基盤となるカーネル・コンパイラーで長いタイプのサイズが 8 から 16 に変更されたが、ホストコール sizeof (長いメッセージが続いた場合) が 8 を返しているためです。

    署名付きタイプ / 長いタイプは、C99 または OpenCL™ バージョン 1.X で定義されたサイズを持たないため、ホストとデバイスでタイプごとに異なるサイズを使用できます。 そのため、カーネルの引数のタイプとして使用しないでください。 コンパイラー、デバイス、またはコンパイラーのバージョン間での移植性を保証するものではありません。 OpenCL™ 2.0 仕様では、長い長いタイプは 128 ビットとして定義されますが、C99 のあいまいさはそのままです。OpenCL™ 仕様ではcl_* 互換タイプは追加されません。そのため、長いタイプの長いタイプを安全に諾諾の引数として使用することはできません。

    解決方法

    この問題の 推奨される 回避策は、ホスト / デバイスコードで openCL™ 定義済みのタイプ (cl_ulong / 長いcl_ulong) を使用することです。

     

    または、sizeof() 呼び出しを使用せず、下図のように long long 引数のサイズを 16 バイトに強制します。

    clSetKernelNf(カーネル、0、16、(void*)&data);

    関連製品

    本記事の適用対象: 1 製品

    インテル® プログラマブル・デバイス

    このページのコンテンツは、元の英語のコンテンツを人力翻訳および機械翻訳したものが混在しています。この内容は参考情報および一般的な情報を提供するためものであり、情報の正確さと完全性を保証するものではありません。インテルは不正確な翻訳があった場合でもいかなる責任を負いません。このページの英語版と翻訳の間に矛盾がある場合は、英語版に準拠します。 このページの英語版をご覧ください。