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);