没有本地内存的 opencl- 并行缩减
opencl- parallel reduction without local memory
大多数并行缩减算法使用共享(本地)内存。
英伟达、AMD、英特尔等
但是如果设备没有共享(本地)内存。
我该怎么做?
如果我使用相同的算法但将临时值存储在全局内存中,它会正常工作吗?
仔细想想,我的评论已经是完整的答案了。
是的,您可以使用全局内存替代本地内存,但是:
- 您必须为所有工作组分配足够的全局内存并为工作组分配它们的内存块(因为使用本地内存,您只需指定单个工作组所需的内存,每个工作组将分配指定的内存量)
- 你必须使用 CLK_GLOBAL_MEM_FENCE 而不是 CLK_LOCAL_MEM_FENCE
- 您将损失大量性能
如果晚上有时间,我会post一个简单的例子。
如果设备支持 OpenCL 2.0,则可以使用 work_group_reduce:
gentype work_group_reduce< op > ( gentype x)
The < op> in work_group_reduce_< op>, work_group_scan_exclusive_< op> and work_group_scan_inclusive_< op> defines the operator and can be add, min or max.
大多数并行缩减算法使用共享(本地)内存。
英伟达、AMD、英特尔等
但是如果设备没有共享(本地)内存。
我该怎么做?
如果我使用相同的算法但将临时值存储在全局内存中,它会正常工作吗?
仔细想想,我的评论已经是完整的答案了。
是的,您可以使用全局内存替代本地内存,但是:
- 您必须为所有工作组分配足够的全局内存并为工作组分配它们的内存块(因为使用本地内存,您只需指定单个工作组所需的内存,每个工作组将分配指定的内存量)
- 你必须使用 CLK_GLOBAL_MEM_FENCE 而不是 CLK_LOCAL_MEM_FENCE
- 您将损失大量性能
如果晚上有时间,我会post一个简单的例子。
如果设备支持 OpenCL 2.0,则可以使用 work_group_reduce:
gentype work_group_reduce< op > ( gentype x)
The < op> in work_group_reduce_< op>, work_group_scan_exclusive_< op> and work_group_scan_inclusive_< op> defines the operator and can be add, min or max.