OpenCL - For 循环和与 GlobalWorkSize 的关系
OpenCL - For Loops and Relationship with 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 次。
希望这能回答您的问题。
在阅读一些代码时,我突然想到了几个问题。
假设我们在一个数组中有一个包含一百万个元素的 globalWorkSize。
假设内核的目的是一次简单地对 100 个元素求和并将这些值存储在输出中。例如)内核第一次对元素 0-99 求和,然后对 1-100 求和,然后对 2-101 求和,依此类推。所有求和值都存储在一个数组中。
现在我们知道有 100 万个元素,当我们将其传递给 clEnqueueNDRangeKernel 时,是否意味着内核将执行接近 100 万次?
我注意到内核中的for循环只循环到一百个元素,然后将值存储在另一个数组中。因此,通过检查 for 循环,人们会认为在 100 个元素之后它会停止。计算机如何知道我们何时达到 100 万个元素?是不是因为我们在clEnqueueNDRangeKernel中传递了参数,在原子层面上它知道需要处理更多的元素?
设备无法知道数组中有一百万个元素。因此,如果您将 global_work_size 设置为一百万,最后 99 个内核将愉快地过度索引数组,这可能会或可能不会出现段错误,具体取决于设备。
当您使用 N 的工作大小调用 clEnqueueNDRangeKernel API 调用时,信息将发送到设备,设备将执行足够大的统一工作组,直到它执行内核 N 次。
希望这能回答您的问题。