ワークグループのサイズを16
から32
またはそれ以上に変更すると、CL_INVALID_WORK_GROUP_SIZE
エラーが発生します。 matrix_size
は64
です。
localWorkSize[0] = groupsize;
localWorkSize[1] = localWorkSize[0];
globalWorkSize[0] = matrix_size;
globalWorkSize[1] = globalWorkSize[0];
最初に、ドキュメントで clEnqueueNDRangeKernel を確認しました。これには、4つの異なる原因CL_INVALID_WORK_GROUP_SIZE
が記載されていますが、いずれも当てはまらないと思います。私の結論を確認してください。 (私のQAスタイルを気にしないでください)
[〜#〜] q [〜#〜]CL_INVALID_WORK_GROUP_SIZE if local_work_size is specified and number of work-items specified by global_work_size is not evenly divisable by size of work-group given by local_work_size
[〜#〜] a [〜#〜]64%32 = 0
[〜#〜] q [〜#〜]or does not match the work-group size specified for kernel using the __attribute__((reqd_work_group_size(X, Y, Z))) qualifier in program source.
[〜#〜] a [〜#〜]ヘルプを理解したので、__attribute__
を使用しませんでした。
[〜#〜] q [〜#〜]CL_INVALID_WORK_GROUP_SIZE if local_work_size is specified and the total number of work-items in the work-group computed as local_work_size[0] *... local_work_size[work_dim - 1] is greater than the value specified by CL_DEVICE_MAX_WORK_GROUP_SIZE in the table of OpenCL Device Queries for clGetDeviceInfo.
[〜#〜] a [〜#〜]clGetDeviceInfo
に問い合わせたところ、CL_DEVICE_MAX_WORK_GROUP_SIZE
は512, 512, 64
[〜#〜] q [〜#〜]CL_INVALID_WORK_GROUP_SIZE if local_work_size is NULL and the __attribute__((reqd_work_group_size(X, Y, Z))) qualifier is used to declare the work-group size for kernel in the program source.
[〜#〜] a [〜#〜]local_work_size
はNULL
ではありません。
[〜#〜] q [〜#〜]CL_INVALID_WORK_ITEM_SIZE if the number of work-items specified in any of local_work_size[0], ... local_work_size[work_dim - 1] is greater than the corresponding values specified by CL_DEVICE_MAX_WORK_ITEM_SIZES[0], .... CL_DEVICE_MAX_WORK_ITEM_SIZES[work_dim - 1].
[〜#〜] a [〜#〜]32 <512
私は何かを見落としていないといいのですが。何がCL_INVALID_WORK_GROUP_SIZE
を引き起こす可能性があるか、または私の結論に誤りを見つけた場合は、教えてください。
このすべてを読むために時間を割いてくれてありがとう:)
CL_DEVICE_MAX_WORK_GROUP_SIZE
は単一のsize_t
値を返す必要があります(たとえば512ですが、システム上で何になるかわかりません)。これは、ワークグループ内のワークアイテムの最大数であり、各ディメンションの最大数ではありません。したがって、あなたの場合、32 * 32 = 1024の作業項目で2D作業グループを作成しようとしていますが、おそらくCL_DEVICE_MAX_WORK_GROUP_SIZE
はシステム上で1024未満です。
OpenCL 1.1仕様、表4.3、37ページ、CL_DEVICE_MAX_WORK_GROUP_SIZE
の定義を参照してください。
データ並列実行モデルを使用してカーネルを実行するワークグループ内のワークアイテムの最大数。
CPUでカーネルを実行しようとしたときに同じ問題が発生しました。 CL_DEVICE_MAX_WORK_GROUP_SIZE
が1024を返している間、128を超えるワークグループサイズを設定できませんでした。
128がどこから来ているのかを少し検索したところ、CL_KERNEL_WORK_GROUP_SIZE
が適切な値を示していたことがわかりました。