OpenCL-用于循环和与GlobalWorkSize的关系



在阅读一些代码时,我突然想到了几个问题。

假设我们在一个数组中有一百万个元素的globalWorkSize。

假设内核的目的是一次对100个元素求和,并将这些值存储在输出中。例如,内核第一次对元素0-99求和,然后进行1-100,然后进行2-101,依此类推。所有求和的值都存储在一个数组中。

现在我们知道有100万个元素,当我们将其传递给clEnqueueNDRangeKernel时,这是否意味着内核将执行近100万次?

我注意到内核中的for循环只循环到一百个元素,然后值就存储在另一个数组中。因此,只要检查for循环,人们就会认为在100个元素之后它就会停止。计算机如何知道我们何时达到100万元素?是因为我们在clEnqueueNDRangeKernel中传递了参数,并且在原子级别上它知道需要处理更多的元素吗?

设备无法知道数组中有一百万个元素。因此,如果您将global_work_size设置为一百万,最后99个内核将很高兴地对数组进行过度索引,根据设备的不同,这可能会出错,也可能不会出错。

当您调用工作大小为N的clEnqueueNDRangeKernel API调用时,信息将发送到设备,设备将执行一个统一大小的工作组,直到它执行内核N次为止。

希望这能回答你的问题。

最新更新