OpenCL全局工作大小与偏移量设置参数取值问题咨询
OpenCL全局工作项ID与offset、global work size的关系解答
先明确核心规则:OpenCL内核中get_global_id(dim)的取值完全遵循以下公式:get_global_id(dim) = get_global_offset(dim) + get_local_id(dim) + get_group_id(dim) * get_local_size(dim)
全局工作项的总数量仅由传入clEnqueueNDRangeKernel的global_work_size参数决定,和global_offset没有关系,offset只会给所有工作项的全局ID加一个固定平移量,不会改变启动的工作项总数。
- 第一个问题的结论:当设置global work size为32、offset为1时,
get_global_id(0)的取值范围是1到32(两端都包含),一共32个有效值,有效全局工作大小就是32,不是31。你之前认为ID到31结束,是混淆了offset=0时的ID范围逻辑:offset=0时ID范围是0到global_work_size-1(即0~31),但加了offset之后,所有ID整体平移,ID的上限会变成offset + global_work_size - 1,不会停在31。 - 第二个问题的结论:如果要保持总全局工作大小为32,设置offset=1时完全不需要把global work size改成33。只要保持global work size=32,实际启动的工作项总数就是32,只是ID从原来的031整体变成132而已。
补充说明:如果你的业务逻辑要求全局ID必须落在1~31区间(共31个有效ID),才需要把global work size设为31;如果要求ID落在1~33区间(共33个有效ID)才需要设为33。不要把ID的数值范围和工作项总数搞混,后者永远等于你设置的global work size值。
内容的提问来源于stack exchange,提问作者Redshoe
相关产品推荐
相关产品推荐

