在阅读一些代码时,我有几个问题突然出现在脑海中。
假设我们在数组中有一百万个元素的globalWorkSize。
假设内核的目的是简单地一次取100个元素的总和并将这些值存储在输出中。例)内核第一次对元素0-99求和,然后它会做1-100,然后是2-101,依此类推。所有求和值都存储在一个数组中。
现在我们知道有100万个元素,当我们将它传递给clEnqueueNDRangeKernel时,这是否意味着内核将执行接近一百万次?
我注意到内核中的for循环只循环到一百个元素,然后该值只存储在另一个数组中。因此,通过检查for循环,人们会认为在100个元素之后它会停止。计算机如何知道我们何时达到100万个元素?是因为我们在clEnqueueNDRangeKernel中传递了参数,而在原子级别它知道需要处理更多元素吗?
答案 0 :(得分:0)
设备无法知道阵列中有一百万个元素。因此,如果您将global_work_size设置为一百万,则最后99个内核将很乐意过度索引该数组,该数组可能会或可能不会根据设备进行故障。
当您使用N的工作类调用clEnqueueNDRangeKernel API调用时,信息将被发送到设备,并且设备将执行足够大小的工作组,直到它已执行内核N次。
希望这能回答你的问题。