web-dev-qa-db-ja.com

CL_INVALID_WORK_GROUP_SIZEの原因

ワークグループのサイズを16から32またはそれ以上に変更すると、CL_INVALID_WORK_GROUP_SIZEエラーが発生します。 matrix_size64です。

  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_SIZE512, 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_sizeNULLではありません。

[〜#〜] 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を引き起こす可能性があるか、または私の結論に誤りを見つけた場合は、教えてください。

このすべてを読むために時間を割いてくれてありがとう:)

33
Framester

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の定義を参照してください。

データ並列実行モデルを使用してカーネルを実行するワークグループ内のワークアイテムの最大数。

18
Quantumboredom

CPUでカーネルを実行しようとしたときに同じ問題が発生しました。 CL_DEVICE_MAX_WORK_GROUP_SIZEが1024を返している間、128を超えるワークグループサイズを設定できませんでした。
128がどこから来ているのかを少し検索したところ、CL_KERNEL_WORK_GROUP_SIZEが適切な値を示していたことがわかりました。

0
Rsh